
GromHacks Labs -- 那些他们不想让你拥有的 payload 列表。母舰降下 1,324 个注入探测,检测 20 种常见漏洞类别的可注入点。我们不利用漏洞,只是敲门看看谁会在里面回应。每个 payload 都经过真实解析器测试,因为外星人要求证据。不要信任任何输入。质疑一切!
发现某个 payload 不起作用? 请提交 issue,附上该 payload、目标上下文以及你预期的结果。我们始终欢迎包含修复或新 payload 的 pull request。
研究仍在进行中。 本项目处于活跃开发阶段,将持续更新新的注入上下文、payload 以及验证改进。
免责声明: 这些 payload 仅供授权的安全测试、教育和研究用途。作者对任何误用或由此产生的后果不承担任何责任或义务。使用风险完全由你自行承担。使用本项目即表示你对自己的行为承担全部责任。
许可证: MIT - 参见 LICENSE
1,618 个唯一 payload 字符串,涵盖 37 个安全测试类别,外加一组跨领域的 polyglot 集合、35 个具名反序列化格式、库和 sink,以及 20 个模板引擎。保留上下文的 master 包含 661 个 section 中的 1,760 个 payload 到 section 的分配,因此共享字符串会与其适用的每个解析器和插入上下文保持关联。108 个 payload 的最小列表包含针对 GraphQL、HQL/JPQL、XPath、JSONPath、JSON 构造、HTTP 参数污染、XQuery、Firestore、SMTP/IMAP 和电子邮件头、Host 头、XML/SOAP 结构、LDAP DN、HTML/CSS、CSV、日志和 LaTeX 的代表性探针。验证覆盖范围因 payload、解析器和插入上下文而异。
语言矩阵涵盖 C、C++、C#、Dart、Elixir、Erlang、Go、Java、JavaScript、Kotlin、Lua、Objective-C、Perl、PHP、Python、Ruby、Rust、Scala、Swift 和 TypeScript。
通用验证器是一种冒烟检查,而非漏洞利用的证明:早期结果将任意错误和请求超时都计为命中。上下文回归覆盖九种实时 SQL 方言,包括字符串、数值、注入的 ORDER BY 子句和直接排序表达式位置;GraphQL.js、Hibernate HQL/JPQL、直接 XPath/XQuery/JSONPath、JSON 构造和重复参数污染、Firestore 结构化过滤器、SMTP/IMAP 命令和电子邮件头注入、Host 头 URL 投毒、XML 和 SOAP 结构、LDAP 过滤器和 DN 注入、Chromium 中的 HTML/CSS/XSS、CSV 公式单元格突破、日志伪造、LaTeX 源码注入、POSIX shell 引号/反引号/管道、$() 和百分号解码换行上下文、本地 SSRF/路径/XXE 夹具、MongoDB/CouchDB/Redis/ArangoDB/DynamoDB PartiQL/Cassandra CQL/Couchbase SQL++/Elasticsearch/Neo4j、EL、XSLT、SSI、原型污染以及代表性反序列化回调。浏览器检查包括未加引号的属性、属性片段、HTML 注释和 </script> 解析器上下文。语言矩阵在所有 20 种请求的语言中检查数学、错误、时序、OOB 以及生成源码的引号突破;在支持的情况下测试常见的替代引号和反引号字符串上下文,并在所有 20 种语言中测试共享的算术 polyglot,以及在适用时测试运行时格式字符串。请参阅 COVERAGE.md 了解已验证的矩阵和剩余的引擎特定缺口。
大多数公开可用的 payload 列表按漏洞类型组织:一个列表用于 SQL 注入,另一个用于 XSS,再一个用于命令注入,依此类推。测试人员挑选他们认为与目标匹配的列表,将其加载到 intruder 工具中,然后针对某个参数运行。如果他们猜错了漏洞类别,整个扫描将一无所获。如果后端是不常见的数据库、非标准模板引擎,或列表未考虑到的语言,payload 会静默失败。测试人员继续前进,认为该参数是干净的。
这种方法有两个根本问题。首先,它要求测试人员在发现漏洞之前就知道存在什么漏洞。其次,流通中的大多数 payload 都是理论性的——在项目和博客文章之间复制粘贴,从未针对真实解析器进行过测试。它们看起来正确。它们甚至可能在语法上有效。但它们实际上并不会从目标触发可检测的响应。
本项目在单个字符串可以覆盖多个相关上下文的地方使用 polyglot。payload 的行为仍然取决于应用程序如何插入它:shell 参数可能未加引号、单引号或双引号;SQL 字符串和数值表达式不同;模板引擎使用不兼容的分隔符。测试平台需要显式建模这些包装器。不应假设任何单个字符串都能突破每个引号、注释或解析器。
payload 围绕 检测支柱 分组——在匹配上下文中可以提供证据的可观察响应:
7*191,其计算结果为 1337。如果该数字出现在响应中,而 payload 只发送了 7*191(而不是字面量 1337),则目标解析器计算了该表达式。该结果证明了在该 sink 中的求值,该 sink 可能是查询、模板、表达式语言或代码运行时。这些信号只有在 payload 的实际上下文中检查时才有用。通用验证器是一种冒烟测试;仅凭解析器错误、超时或反射字符串并不能证明 payload 已执行。使用特定上下文的 Docker 检查以获得更强的证据。
传统的 OOB 和时序 payload 依赖 shell 命令:curl、nslookup、ping、sleep。这些会不断失效。它们取决于目标操作系统、可用的 PATH、由哪个 shell 解释命令,以及进程是否有权限生成子进程。一个基于 curl 的 OOB payload 在 Ubuntu 上有效,但在 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 查找和子进程依赖。运行时策略和配置仍可能禁用网络访问或单个 API;夹具矩阵记录了所演练的确切环境。
在标准库导入可能被阻止的情况下,一些 payload 使用免导入的替代方案,例如 Node 中的 Atomics.wait() 以及用于 OOB 的原始 socket 连接。资源密集型循环被排除在默认语料库检查之外。
并非所有东西都能成为 polyglot。模板引擎使用根本性不兼容的语法——Jinja2 中的 {{}} 对 ERB 的 <%= %> 毫无意义,两者也都无法解析为 Freemarker 的 ${})。反序列化格式是特定于某个框架的二进制或结构化数据。对于这些类别,本项目使用按引擎划分的 payload,组织在相同的检测支柱系统下,涵盖 20 个模板引擎和 35 个具名反序列化格式、库和 sink,跨越 11 个运行时组。
语料库将适用于兼容上下文的 polyglot 与语法不同处的按引擎探针相结合。测试覆盖范围和结果仅限于所演练的夹具和包装器。
先前的 FIRE/NO-FIRE 声明已撤回:通用验证器将任意错误和请求超时都计为命中。testbed/test_context_polyglots.py 中的上下文矩阵现在检查 SQLite、PostgreSQL、MySQL、MariaDB、CockroachDB、H2、Firebird、Oracle 和 SQL Server 中的 SQL 行为;GraphQL.js;Hibernate HQL/JPQL;XPath、XQuery 和 JSONPath;Firestore 结构化过滤器;MongoDB、CouchDB、Redis、ArangoDB、DynamoDB PartiQL、Cassandra CQL、Couchbase SQL++、Elasticsearch 和 Neo4j 中的 NoSQL/查询行为;未加引号、加引号、反引号和管道上下文中的 POSIX shell 注入;本地 SSRF/路径/XXE 夹具;针对基线的 SSI 输出;代码求值和反序列化回调;验证器超时处理;以及跨引擎和按引擎的 SSTI 数学。testbed/test_windows_contexts.py 清点了 Windows CMD/PowerShell 上下文,并具有针对 Windows 主机的原生 shell 检查。
该列表在有用之处按信号对探针进行分组,但某些条目是方言或上下文特定的,并且若干类别并不支持全部四个检测支柱。将结果视为夹具特定的,然后使用相应的按类别 payload 以获得更广泛的覆盖。
| Payload 数量 | 类别 | 支柱 |
|---|---|---|
| 4 | SQLi | 错误、字符串/数值布尔数学、MySQL 时序;无已验证的 OOB 探针 |
| 4 | SSTI | 错误、引擎子集数学/时序/OOB 探针 |
| 3 | OS Cmd | 在已测试的 POSIX sh 引号/反引号/管道上下文中的数学、时序、OOB,外加 $() 和换行突破探针 |
| 3 | Code Injection | 数学、时序、OOB(跨语言) |
| 2 | XSS | 数学、OOB |
| 2 | XXE | 文件读取、OOB |
| 2 | SSRF | 错误、OOB |
| 1 | Path Traversal | 文件读取 |
| 2 | NoSQL | 文档操作符、错误;数学和时序是方言特定的 |
| 1 | EL Injection | 数学 |
| 1 | Prototype Pollution | 数学 |
| 1 | CRLF/Header | 数学 |
| 1 | Format String | 错误 |
| 1 | SSI | 指令回显(标记与基线比较) |
| 2 | LDAP Injection | 错误、数学 |
| 3 | XSLT Injection | 错误、数学、OOB |
| 2 | Elasticsearch | 错误、数学 |
| 2 | Cypher/Neo4j | 错误、时序 |
| 1 | CouchDB | 错误 |
| 1 | CSV Injection | 公式前导单元格突破 |
| 1 | HTML Injection | 元素结构 |
| 1 | Log Injection | 通过 CRLF 伪造事件 |
| 1 | LaTeX Injection | 使用良性标记的命令突破 |
| 1 | JSON Injection | 属性突破 |
| 1 | HTTP Parameter Pollution | 重复值验证/使用不一致 |
| 1 | SMTP Header Injection | Bcc 头突破;无邮件投递 |
| 1 | GraphQL | 选择突破 |
| 1 | HQL/JPQL | 共享字符串谓词突破 |
| 1 | XPath | 谓词突破 |
| 1 | JSONPath | 联合选择 |
| 1 | XQuery | 谓词突破 |
| 1 | Firestore | 结构化过滤器扩展 |
| 3 | Groovy | 数学、时序、OOB |
| 46 | Deserialization | 在支持处多支柱,否则仅错误 |
使用 ready/minimal/payloads-only.txt 进行紧凑的授权测试运行。对于 shell 和 SQL 探针,在解释结果时保留目标的引号或查询上下文。
参见 HOWTOUSE.md 获取完整操作员指南。它将“我正在查看一个参数,我该向它扔什么?”转化为可重复的工作流:
rO0AB = Java,AAEAAAD///// = .NET BinaryFormatter,BAg = Ruby Marshal,gASV = Python pickle P4,Tzo/YTo = PHP unserialize,等等),附带快速参考备忘卡和消歧启发式。在发射之前对 blob 进行指纹识别,这样你只加载匹配的子集,而不是全部 197 个分配。id=42 和 JSESSIONID”到“尝试 by-category/sqli.txt + Java 反序列化 + EL 注入,观察数学支柱”,一次查找即可完成。在运行 payloadctl prepare 之前使用 HOWTOUSE.md。先指纹识别,其次最小列表,第三类别深入;将 payload 与目标解析器和插入上下文匹配。
# 1. Prepare payloads with your callback domain
# Replaces {domain} placeholder in all OOB payloads with your server
./tools/payloadctl prepare YOUR_CALLBACK.oastify.com
# 2. Load into Burp Intruder, ffuf, or any line-by-line injection tool
# All output goes to ready/ (gitignored, contains your domain)
运行 prepare 后,可直接使用的文件位于 ready/full/ 和 ready/minimal/ 中,结构一致: