
GromHacks Labs -- 那些他们不想让你拥有的 payload 列表。母舰降下 1,324 个注入探测,检测 20 种常见漏洞类别的可注入点。我们不利用漏洞,只是敲门看看谁会在里面回应。每个 payload 都经过真实解析器测试,因为外星人要求证据。不要信任任何输入。质疑一切!
发现一个不起作用的 payload? 请 open an issue 附上 payload、目标上下文以及你期望的结果。欢迎提交修复或新 payload 的 Pull Request。
研究正在进行中。 该项目正在积极开发中,并将定期更新新的 payload、漏洞类别和验证改进。
免责声明: 这些 payload 仅供授权安全测试、教育和研究目的使用。作者对任何滥用或下游影响不承担任何责任。完全由使用者自行承担风险。使用本项目即表示您对自己的行为承担全部责任。
许可证: MIT - 参见 LICENSE
1,353 个经过验证的注入 payload,覆盖 20 个漏洞类别、31 个反序列化框架和 14 个模板引擎。每个 payload 都能产生可检测的信号。零理论 payload。
验证:1,353 测试 / 1,353 触发 / 0 失败 / 0 跳过,针对 35 个 Docker 测试环境栈。严格验证证明了实际利用(服务器端计算、真实解析器错误、测量的时间延迟、来自目标容器的 OOB 回调)——而非字符串匹配。
大多数公开可用的 payload 列表按漏洞类型组织:一个用于 SQL 注入的列表,另一个用于 XSS,又一个用于命令注入,等等。测试人员选择他们认为与目标匹配的列表,将其加载到入侵工具中,并对一个参数运行。如果他们猜错了漏洞类别,整个扫描就不会产生任何结果。如果后端是一个不常见的数据库、非标准的模板引擎或列表没有考虑到的语言,这些 payload 就会静默失败。测试人员就会认为该参数是安全的,然后继续前进。
这种方法有两个根本性问题。首先,它要求测试人员在发现漏洞之前就知道存在什么漏洞。其次,大多数流传的 payload 都是理论性的——在项目和博客文章之间复制,从未经过真实解析器的测试。它们看起来正确。它们甚至可能在语法上有效。但它们实际上不会触发来自目标的可检测响应。
本项目采用不同的方法。主要工作单元是 polyglot——一个单一的 payload 字符串,被设计成同时在尽可能多的注入上下文中有效(或有意义的无效)。一个 polyglot 可以同时跳出单引号、双引号、括号、块注释、HTML 属性、模板分隔符和反引号上下文。测试人员无需知道漏洞是什么,只需对每个参数发射 polyglot 并观察信号。
此集合中的每个 payload 都围绕 检测支柱 构建——这些是可观察到的响应,确认漏洞存在,无需访问服务器日志、源代码或文件系统:
7*191,计算结果为 1337。如果该数字出现在响应中,而 payload 只发送了 7*191(而非字面上的 1337),则说明后端计算了该表达式——代码执行的证据。如果一个 payload 在针对其目标上下文测试时没有产生至少一个这样的信号,它就不属于这个列表。这里的 1,353 个 payload 中的每一个都已在专门构建的 Docker 测试床上进行了验证,并带有严格的利用证明。零个是理论性的。
传统的 OOB 和时间 payload 依赖 shell 命令:curl、nslookup、ping、sleep。这些命令经常失败。它们依赖于目标操作系统、可用的 PATH、哪个 shell 解释该命令,以及进程是否有权限生成子进程。一个在 Ubuntu 上工作的基于 curl 的 OOB payload 会在 Alpine 上失败(没有 curl),在 Windows 上失败(没有 curl),在受限容器内部也会失败(无法执行出站进程)。
本项目尽可能用语言原生的内置函数代替 shell 命令。Python payload 使用 urllib.request.urlopen() 和 time.sleep()。Java payload 使用 java.net.URL.openStream() 和 Thread.sleep()。Ruby 使用 Net::HTTP.get() 和 Kernel.sleep。PHP 使用 file_get_contents() 和 sleep()。这些函数存在于其各自语言的每个标准安装中——无需 PATH 查找,无需子进程,无操作系统依赖。
即使在标准库导入可能被阻止的情况下(沙箱 eval、受限 exec),payload 也退回到无需导入的替代方案:用于时间的 CPU 自旋循环(Python 中的 sum(range(500000000)),Node 中的 Atomics.wait())和用于 OOB 的原始套接字连接(__import__('socket').create_connection()、fsockopen()、TCPSocket.new())。
并非所有东西都能成为 polyglot。模板引擎使用根本不相容的语法——Jinja2 中的 {{}} 对 ERB 的 <%= %> 毫无意义,两者都不会被解析为 Freemarker 的 ${})。反序列化格式是特定于一个框架的二进制或结构化数据。对于这些类别,本项目使用按引擎划分的 payload,组织在相同的检测支柱系统下,涵盖 7 种语言的 14 个模板引擎和 31 个反序列化框架。
结果是形成了一个单一的语料库,其中 polyglot 处理它们能够处理的上下文(SQLi、OS 命令注入、XSS、代码注入),而专门构建的按引擎 payload 处理其余部分,全部经过验证,全部产生可检测的信号,全部准备好用于逐行注入工具。
83 个 payload 覆盖所有 35 个测试环境栈、所有 55+ 个端点,以及每个类别的所有 4 个检测支柱。验证:83 触发 / 0 未触发 / 0 跳过。
每个注入类别在架构允许的情况下都得到错误 + 数学 + 时间 + OOB 覆盖。支持代码执行的反序列化框架(Pickle、PyYAML、jsonpickle、node-serialize、XMLDecoder、.NET Json.NET)获得完整的多支柱覆盖。限于探测的框架(PHP unserialize、Ruby Marshal、SnakeYAML 等)获得基于错误的检测。在切换到完整类别列表进行深入测试之前,对每个参数发射这个最小列表。
| Payload 数量 | 类别 | 检测支柱 |
|---|---|---|
| 4 | SQLi | error, math, timing, OOB (跨方言 polyglot) |
| 4 | SSTI | error, math, timing, OOB (跨引擎 polyglot) |
| 3 | OS Cmd | math, timing, OOB (跨 shell polyglot) |
| 3 | 代码注入 | math, timing, OOB (跨语言) |
| 2 | XSS | math, OOB |
| 2 | XXE | 文件读取, OOB |
| 2 | SSRF | error, OOB |
| 1 | 路径遍历 | 文件读取 |
| 2 | NoSQL | math, error |
| 1 | EL 注入 | math |
| 1 | 原型污染 | math |
| 1 | CRLF/Header | math |
| 1 | 格式字符串 | error |
| 1 | SSI | math |
| 2 | LDAP 注入 | error, math |
| 3 | XSLT 注入 | error, math, OOB |
| 2 | Elasticsearch | error, math |
| 2 | Cypher/Neo4j | error, timing |
| 1 | CouchDB | error |
| 3 | Groovy | math, timing, OOB |
| 41 | 反序列化 | 支持时多支柱,否则仅 error |
83 次请求,而非 1,353 次。 在 Burp Intruder 中使用 ready/minimal/payloads-only.txt。
完整操作指南请参见 HOWTOUSE.md。它将“我正在查看一个参数,应该用什么来测试它?”变成一个可重复的工作流程:
7*7 返回 49 作为 eval 的泄露信号,{{name}} 渲染为 "Alice" 确认 SSTI,诊断字段泄露 ping 输出,OOB 日志中的 User-Agent 字符串命名抓取器库)、现代栈 ORM 陷阱(Prisma $queryRaw、Rails .order()、Hibernate JPQL concat、Mongoose findOne(req.body)),以及在消耗完整列表之前用于确认怀疑的低成本探测。rO0AB = Java,AAEAAAD///// = .NET BinaryFormatter,BAg = Ruby Marshal,gASV = Python pickle P4,Tzo/YTo = PHP unserialize 等),附带 16 条快速参考备忘卡和消歧启发式方法。在发射之前对 blob 进行指纹识别,以便加载 5-15 个匹配的 payload,而不是全部 232 个。id=42 和 JSESSIONID”到“尝试 by-category/sqli.txt + Java 反序列化 + EL 注入,监控 math 支柱”一步到位。./tools/payloadctl prepare YOUR_CALLBACK.oastify.com
运行 `prepare` 后,您可直接使用的文件位于 `ready/full/` 和 `ready/minimal/`,结构对比如下:
| 文件 | 说明 | 数量 |
|------|------|------|
| `ready/minimal/payloads-only.txt` | **精简版——83 个请求,覆盖所有类别** | 83 |
| `ready/full/payloads-only.txt` | 完整列表,每行一个载荷 | 1,353 |
| `ready/full/by-category/sqli.txt` | 仅 SQL 注入 | 211 |
| `ready/full/by-category/ssti.txt` | 仅模板注入 | 206 |
| `ready/full/by-category/deserialization.txt` | 仅反序列化 | 232 |
| `ready/full/by-category/os-cmd-injection.txt` | 仅操作系统命令注入 | 120 |
| `ready/full/by-category/code-injection.txt` | 仅代码注入 | 123 |
| `ready/full/by-category/ssrf.txt` | 仅 SSRF | 156 |
| `ready/full/by-category/path-traversal.txt` | 仅路径遍历 | 113 |
| `ready/full/by-category/xss.txt` | 仅 XSS | 58 |
| `ready/full/by-category/nosql.txt` | 仅 NoSQL 注入 | 32 |
| `ready/full/by-category/format-string.txt` | 仅格式化字符串 | 38 |
| `ready/full/by-category/el-injection.txt` | 仅表达式语言 | 34 |
| `ready/full/by-category/header-crlf.txt` | 仅 CRLF/头部注入 | 17 |
| `ready/full/by-category/prototype-pollution.txt` | 仅原型污染 | 12 |
| `ready/full/by-category/xxe.txt` | 仅 XXE | 11 |
| `ready/full/by-category/ldap-injection.txt` | 仅 LDAP 注入 | 35 |
| `ready/full/by-category/xslt-injection.txt` | 仅 XSLT 注入 | 30 |
| `ready/full/by-category/elasticsearch-injection.txt` | 仅 Elasticsearch | 30 |
| `ready/full/by-category/cypher-injection.txt` | 仅 Neo4j/Cypher | 27 |
| `ready/full/by-category/couchdb-injection.txt` | 仅 CouchDB | 5 |
| `ready/full/by-category/polyglots.txt` | 跨上下文多语言载荷 | 246 |
| `ready/full/by-pillar/error-payloads-only.txt` | 基于错误的载荷 | 324 |
| `ready/full/by-pillar/timing-payloads-only.txt` | 基于时间的(盲注) | 227 |
| `ready/full/by-pillar/oob-payloads-only.txt` | 带外交互回调 | 209 |
| `ready/full/by-pillar/math-payloads-only.txt` | 数学金丝雀(1337) | 182 |
| `ready/full/by-pillar/reflected-payloads-only.txt` | 反射/边界情况 | 374 |
| `ready/full/encoded/url-encoded/payloads.txt` | URL 编码变体 | 1,353 |
| `ready/full/encoded/base64/payloads.txt` | Base64 变体 | 1,353 |
| `ready/full/encoded/json-safe/payloads.txt` | JSON 安全变体 | 1,353 |
| `ready/full/encoded/double-url-encoded/payloads.txt` | 双重 URL 编码 | 1,353 |
| `ready/full/encoded/html-entity/payloads.txt` | HTML 实体编码 | 1,353 |
| `ready/full/encoded/hex-escaped/payloads.txt` | 十六进制转义变体 | 1,353 |
| `ready/full/encoded/unicode-escaped/payloads.txt` | Unicode 转义变体 | 1,353 |
`ready/minimal/` 目录镜像相同结构(按类别、按检测柱、编码),包含精简载荷集。
自定义输出目录:```bash
./tools/payloadctl prepare YOUR_CALLBACK.oastify.com -o /path/to/engagement/payloads
原始模板带有 {domain} 占位符(用于脚本替换)位于 payloads/lists/full/ 和 payloads/lists/minimal/。
每个 payload 至少产生一个以下信号。在您的响应中搜索它们: