几种通用防注入系统的绕过技巧

admin 2021年8月6日07:03:00评论84 views字数 3056阅读10分11秒阅读模式

几种通用防注入系统的绕过技巧

几个月未登录,竟然发现t00ls把我的账号封了,费了半天劲弄了个返还码有激活了,坑爹的很多东西也看不了,没办法发几篇文章凑点积分,好久之前写的文章了,现在发出来回回锅。大家就凑活着看吧。

一.  前言
目前主流的CMS系统当中都会内置一些防注入的程序,例如Discuz、dedeCMS等,本篇主要介绍绕过方法。

二.  Discuz x2.0防注入

2.1  防注入原理
这里以Discuz最近爆出的一个插件的注入漏洞为例,来详细说明绕过方法。
漏洞本身很简单,存在于/source/plugin/v63shop/config.inc.php中的第29行getGoods函数中,代码如下所示

几种通用防注入系统的绕过技巧
触发漏洞的入口点在/source/plugin/v63shop/goods.inc.php中的第6行和第8行,如图所示:

几种通用防注入系统的绕过技巧


下面可以构造如下请求触发漏洞了,如图所示:

几种通用防注入系统的绕过技巧


不过程序内置了一个_do_query_safe函数用来防注入,如图所示

几种通用防注入系统的绕过技巧


这里跟踪一下_do_query_safe()函数的执行,它会对以下关键字做过滤,如图所示:

几种通用防注入系统的绕过技巧


因为我们的url中出现了union select,所以会被过滤掉。

2.2  绕过方法
这里利用Mysql的一个特性绕过_do_query_safe函数过滤,提交如下url:

几种通用防注入系统的绕过技巧
这里我们跟踪一下,绕过的具体过程。它会将/**/中间的内容去掉,然后保存在$clean变量中,其值为

几种通用防注入系统的绕过技巧
再进一步跟踪,它会将/**/也去掉,然对$clean变量做过滤,如图所示

几种通用防注入系统的绕过技巧


此时$clean值,如图所示;

几种通用防注入系统的绕过技巧


此时$clean变量中不在含有危险字符串,绕过_do_query_safe函数过滤,成功注入,截图如下:

几种通用防注入系统的绕过技巧


三.  Discuz X2.5防注入

3.1  防注入原理
Discuz X2.5版修改了防注入函数的代码,在/config/config_global.php中有如下代码,如图所示 

几种通用防注入系统的绕过技巧


这里$_config['security']['querysafe']['afullnote'] 默认被设置为0,重点关注这一点。
这里跟踪一下失败的原因,如图所示:

几种通用防注入系统的绕过技巧


此时观察一下变量,_do_query_safe($sql)函数会将/**/中的内容去掉,然后存到$clean中,如图所示:

几种通用防注入系统的绕过技巧


其实,程序执行到这里跟Discuz X2.0没有区别,$clean的值都一样。但是关键在下面,如图所示;

几种通用防注入系统的绕过技巧


因为前面提到$_config['security']['querysafe']['afullnote']=’0’,所以这里不会替换/**/为空,并且它在后面会判断$clean中是否会出现“/*”,如图所示:

几种通用防注入系统的绕过技巧


几种通用防注入系统的绕过技巧


所以注入失败。

3.2  绕过方法
在Mysql当中,定义变量用@字符,可以用set @a=’abc’,来为变量赋值。这里为了合法的构造出一个单引号,目的是为了让sql正确,我们可以用@`'`放入sql语句当中,帮助我们绕过防注入程序检查。
这里利用如下方式绕过_do_query_safe函数过滤,如下所示:

几种通用防注入系统的绕过技巧
这里跟踪一下执行的过程,如图所示:

几种通用防注入系统的绕过技巧


这里有一个if判断,重点看这句

几种通用防注入系统的绕过技巧
它会将$sql中单引号引起来的字符串省略掉,所以我们可以用绕过dede防住ids的思路,利用@`’` union select @`’`这样的方法,在下面的过滤中省掉union select,这里跟踪一下,如图所示:

几种通用防注入系统的绕过技巧


这样便绕过了_do_query_safe函数检测,成功绕过防注入,如图所示:

几种通用防注入系统的绕过技巧


不过后来Discuz官方发布了一个修复补丁,但并没用从根本上解决问题。官方的修复代码如下:

几种通用防注入系统的绕过技巧


加了一个判断,过滤字符串中的@,但是始终没有修复根本问题,关键是上边的那个if判断会将单引号之间的内容(包括单引号)替换为空,代码如下:

几种通用防注入系统的绕过技巧
这里我只要稍做一下变换就可以让@字符消失,从而绕过它的过滤,利用如下所示:

几种通用防注入系统的绕过技巧
这里我引入了`’`用来隐藏第一个@字符,并将第一个@`’`替换为@`’’`,这样便可以替换掉第二个@,这里我们跟踪一下代码,如图所示:

几种通用防注入系统的绕过技巧


可以看到$clean变为

几种通用防注入系统的绕过技巧
成功绕过补丁,如图所示:

几种通用防注入系统的绕过技巧


不过这样做的代价是不能再使用union select了,只能通过报错获取数据。

四.  DedeCMS防注入

4.1  防注入原理
这里我也以最近热点分析的dedeCMS feedback.php注入漏洞为例,分析如何绕过其防注入系统。不过在这之前,还得先提一下这个漏洞。
漏洞存在于/plus/feedback.php中的第244行,代码如下所示

几种通用防注入系统的绕过技巧

几种通用防注入系统的绕过技巧

这里$title变量未初始化,所以$title可以作为可控变量,所以我们可以进一步控制$arctitle。跟踪发现$arctitle被直接带入SQL语句当中,但是这里执行的INSERT语句入库之后会将前面addslashes转义的单引号在会员还原回去。进一步跟踪下面的代码,在第268行,如下所示

几种通用防注入系统的绕过技巧
这里的查询#@__feedback表正式上面INSERT的那个表,arctitle字段取出来放到$arctitle变量当中,继续跟踪到第273行,这下豁然开朗了,

几种通用防注入系统的绕过技巧
这里$arctitle变量未作任何处理,就丢进了SQL语句当中,由于我们可以控制$title,虽然$arctitle是被addslashes函数处理过的数据,但是被INSERT到数据库中又被还原了,所以综合起来这就造成了二次注入漏洞。
但是这里如何利用呢,通过跟踪代码发现,整个dede在整个过程中始终没有输出信息,所以我们无法通过构造公式报错来获取数据,但是进一步分析代码发现#@__feedback表当中的msg字段会被输出。由于$arctitle变量是可控的,所以我们可以通过构造SQL语句,将我们要执行的代码插入到msg字段当中,这样便可以输出执行的内容了。

4.2  绕过方法
众所周知,dedeCMS内置了一个CheckSql()函数用来防注入,它是80sec开发的通用防注入ids程序,每当执行sql之前都要用它来检查一遍。其代码如下所示:

几种通用防注入系统的绕过技巧

几种通用防注入系统的绕过技巧

几种通用防注入系统的绕过技巧

几种通用防注入系统的绕过技巧

但通过跟踪这段代码发现,它有个特征就是会将两个单引号之间的内容用$s$替换,例如’select’会被替换为$s$,这里用两个@`’`包含敏感字,这样$clean变量中就不会出现敏感字,从而绕过CheckSql()函数检测。
这里可以设置title为如下代码,一方面绕过ids防注入代码检测,另一方面加一个#注释掉后面的代码,但是还要做一下变形,就是这个char(@`'`)了。因为#@__feedback的所有字段都被设置为NOT NULL,而@`’`是一个变量,默认为NULL,直接插入@`’`的话会报错,所以需要以char(@`'`)的方法转换一下。

几种通用防注入系统的绕过技巧
跟踪代码,如图所示

几种通用防注入系统的绕过技巧

如下SQL语句

几种通用防注入系统的绕过技巧

被替换为了

几种通用防注入系统的绕过技巧

字符串中没有任何敏感字,成功绕过CheckSql()函数检测。

POST如下请求给feedback.php,如下所示:

几种通用防注入系统的绕过技巧
跟踪代码,实际执行的SQL语句跟踪变量如下所示:

几种通用防注入系统的绕过技巧


被插入数据库中的内容,如图所示:

几种通用防注入系统的绕过技巧


下面再POST如下内容给feedback.php,

几种通用防注入系统的绕过技巧
跟踪一下这里执行的SQL语句,如图所示

几种通用防注入系统的绕过技巧


所以select user()执行了,并且可以作为msg字段输出。

五.  总结
在写这篇文章之前,我分析了很多常用的cms系统的源码,包括discuz、dedecms、phpwind、phpcms等,只有在discuz、dedecms这两个系统中用到通用防注入,但是它们所覆盖的用户群已将相当庞大了。如果能在发现程序注入漏洞的情况下,这些绕过方法还是很有价值的。


几种通用防注入系统的绕过技巧

本文始发于微信公众号(T00ls):几种通用防注入系统的绕过技巧

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年8月6日07:03:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   几种通用防注入系统的绕过技巧http://cn-sec.com/archives/351362.html

发表评论

匿名网友 填写信息