代码安全审计:当file_exists遇上eval


发布人:admin分类:网络安全浏览量:34发布时间:2017-12-12

起因

昨晚有人在一QQ群上问lcms(一款网站CMS系统)的一个漏洞是怎么形成的,说了半天。他截图不完整,于是叫他传代码,下载回来找到router.php代码片段如下:

protected function getInputString($name, $default_value = "", $format = "GPCS")
    {
        //order of retrieve default GPCS (get, post, cookie, session);
        $format_defines = array (
        'G'=>'_GET',
        'P'=>'_POST',
        'C'=>'_COOKIE',
        'S'=>'_SESSION',
        'R'=>'_REQUEST',
        'F'=>'_FILES',
        );
        preg_match_all("/[G|P|C|S|R|F]/", $format, $matches); //splitting to globals order
        foreach ($matches[0] as $k=>$glb)
        {
            if ( isset ($GLOBALS[$format_defines[$glb]][$name]))
            {   
            return $GLOBALS[$format_defines[$glb]][$name];
            }
        }
        return $default_value;
    }

这里我们先来看 getInputString()。

Preg_matach_all 执行搜索$format 中匹配/[G|P|C|S|R|F]/ 的数据 返回一个数组$matches,这样默认的也就是返回了 GPCS 。
然后循环这个数组,$GLOBALS 意思是引用一个全局变量,

$GLOBALS 具体参考:http://php.net/manual/zh/reserved.variables.globals.php
这样$GLOBALS[$format_defines[$glb]][$name]  

这段代码的意思就是 ,先取到$format_defines数组里面的一个值 如_GET,再用get方法获取 name的值。这这里代码的本身是不存在问题的。不过最好addslashes ,addslashes请参考:http://www.w3school.com.cn/php/func_string_addslashes.asp

public function Router(){
        //Get page request (if any)
        $page = $this->getInputString("page", "index");
        
        //Get plugin request (if any)
        $plugin = $this->getInputString("system", "Page");
        
        //If there is a request for a plugin
        if(file_exists("core/plugs/".$plugin."Starter.php")){
            //Include Page fetcher
            include("core/plugs/".$plugin."Starter.php");
            //Fetch the page and get over loading cache etc...
            eval("new ".$plugin."Starter('".$page."');");
            
        }else if(file_exists("data/modules/".$plugin."/starter.dat")){
            //Include Module Fetching System
            include("core/lib/ModuleLoader.php");
            
            //Load Module
            new ModuleLoader($plugin, $this->getInputString("page", null));
        }else{ //Otherwise load a page from the standard system.
            //Include Page fetcher
            include("core/plugs/PageStarter.php");
            
            //Fetch the page and get over loading cache etc...
            new PageStarter($page);
        }
    }

下面我们来看代码二 调用了这个getInputString函数  而这个函数并未做任何过滤,

判断了一下 core/plugs/".$plugin."Starter.php   文件存不存如果在就带入了 eval 。
eval的意思请看这里:http://www.w3school.com.cn/php/func_misc_eval.asp

引用某大牛的一句话“一切进入函数的变量是有害的”。
并且这里的 $page是可控的,也就是说当提交 ?page=’);phpinfo();// 
语句就变成这样了 eval (“new ”.$plugin.”starter(‘’);phpinfo();//’)”)

eval里面双斜杠代表注释的意思,这样也就是等于执行了 phpinfo(),所以说明这个漏洞是存在的。

漏洞证明:

重点来了

下面开始说重点,群里某牛说其实$plugin也能phpinfo  本人研究了半天,百思不得其解……

过了许久就大牛就发出来,(?a=echo 1;//../1),悲剧的发现只有一步只差,很感谢这位大牛的指点,现在来分析这句话的意思,于是写了个1.php,代码如下:

<?php  
$act=$_GET['a'];
if (file_exists('test/'.$act.'2.php')) {
eval("echo ('2');".$act);
}
?>

并且在test文件下建立一个名为12.php的空文件,这也就是指的file_exists遇上eval了。 首先来分析 ,代码的意思是,如果test下 存在 *2.php时就执行下面的代码,正常提交的应该是1.php?a=1  才能执行下面的。输出 1

然而我们提交的是 1.php?a=echo 1;//../ 

http://localhost/1.php?a=echo%201;//../1

 

如图比正常提交多输出了个 1  也就是说 我们提交的 echo 1 执行了。 把提交内容写进代码上也就是if (file_exists('test/echo 1;//../12.php')) 为什么会执行下面的eval呢? 可能是file_exists处理方式吧。 把echo 1;/ 当作了一个目录处理 ,然后 /../ 就放回了上级目录 也就是变成了 if (file_exists('test/12.php'))  然而我我们test的目录下是有12.php。所以这个判断放回了ture,也就是说进入了eval。

Eval的这段代码 就变成了 evil(“echo (‘2’);echo 1;//../1”)  ,上面提到过// 是注释后面的代码,

所以就输出了图上的 21 。

总结

尽量少使用eval ,并且过滤能控制的变量。这个CMS系统的修补方式是写一个函数过滤掉,$plugin 中的 / ,并且过滤$page 。如果不写上面那个csm的例子大家可能会认为提到这个file_exists 遇上 eval 不怎么实际。

一些看似用处不大的东西往往会产生漏洞,代码安全审计最重要的就是:细心与耐心,细节决定成败。

最后附上CMS源码:

链接: http://pan.baidu.com/s/1vri8Y 密码: okpq

[本文作者crsec,本文属于FreeBuf.COM独家发布文章,]


被黑站点统计 - 文章版权1、本主题所有言论和图片纯属会员个人意见,与本文章立场无关
2、本站所有主题由该文章作者发表,该文章作者与被黑站点统计享有文章相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和被黑站点统计的同意
4、文章作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、被黑站点统计管理员有权不事先通知发贴者而删除本文

免责声明

本站主要通过网络搜集国内被黑网站信息,统计分析数据,为部署安全型网络提供强有力的依据.本站所有工作人员均不参与黑站,挂马或赢利性行为,所有数据均为网民提供,提交者不一定是黑站人,所有提交采取不记名,先提交先审核的方式,如有任何疑问请及时与我们联系.

admin  的文章


微信公众号

微信公众号


Copyright © 2012-2022被黑网站统计系统All Rights Reserved
页面总访问量:21464475(PV) 页面执行时间:67.655(MS)
  • xml
  • 网站地图