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)#

exploit

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

implodeids函数

该函数本身没有问题,它将一个数组连接成一个字符串,其中每个元素包含在单引号后面

但是将该函数用在查询语句里就会出问题

2.3 bypass全局过滤实现SQL注入

如果传入以下参数

gids[99]='&gids[100][0]=) and (select ...#

则,$gids/$groupsids/query变量为:

$gids/$groupsids/query语句

可以看到,$groupids的第二个元素为“/”,在query语句正好将一个“'”单引号给注释掉了,从而拼接SQL注入语句成功


3 参考

  • http://www.wooyun.org/bugs/wooyun-2014-066095
  • https://www.91ri.org/9493.html

标签:

 打赏:  如果您觉得该文档有用,可以选择微信扫码打赏,谢谢
微信打赏码