
GromHacks Labs -- Списки полезных нагрузок, которые они не хотят, чтобы у вас были. 1 324 инъекционных зонда, отправленных с материнского корабля, чтобы обнаружить, что поддается инъекции в 20 классах уязвимостей. Мы не эксплуатируем, мы просто стучимся в дверь и смотрим, кто ответит. Каждая нагрузка тестируется на реальных парсерах, потому что пришельцы требуют доказательств. Не доверяй никакому вводу. Подвергай всё сомнению!
Нашли полезную нагрузку, которая не работает? Пожалуйста, откройте задачу с указанием полезной нагрузки, контекста цели и ожидаемого результата. Запросы на исправления или новые полезные нагрузки всегда приветствуются.
Исследование продолжается. Этот проект находится в активной разработке и будет регулярно обновляться новыми полезными нагрузками, классами уязвимостей и улучшениями валидации.
Отказ от ответственности: Эти полезные нагрузки предоставляются только для авторизованного тестирования безопасности, обучения и исследовательских целей. Авторы не несут ответственности за любое неправомерное использование или последующие эффекты. Используйте полностью на свой страх и риск. Используя этот проект, вы принимаете на себя полную ответственность за свои действия.
Лицензия: MIT - см. LICENSE
1,353 проверенных инъекционных полезных нагрузок, охватывающих 20 классов уязвимостей, 31 фреймворк десериализации и 14 шаблонизаторов. Каждая полезная нагрузка дает обнаруживаемый сигнал. Никаких теоретических нагрузок.
Валидация: 1,353 протестировано / 1,353 сработало / 0 сбоев / 0 пропущено на 35 стендах Docker. Строгая валидация доказывает фактическую эксплуатацию (вычисления на сервере, реальные ошибки парсера, измеренные временные задержки, внеполосные обратные вызовы из целевых контейнеров) -- не сопоставление строк.
Большинство общедоступных списков полезных нагрузок организованы по типу уязвимости: один список для SQL-инъекций, другой для XSS, третий для инъекций команд и так далее. Тестер выбирает список, который, по его мнению, соответствует цели, загружает его в инструмент-интрудер и запускает против параметра. Если он ошибается в классе уязвимости, все сканирование не дает результатов. Если бэкенд использует необычную базу данных, нестандартный шаблонизатор или язык, который не учтен в списке, полезные нагрузки молча не срабатывают. Тестер переходит дальше, считая параметр чистым.
У этого подхода есть две фундаментальные проблемы. Во-первых, он требует, чтобы тестер знал, какая уязвимость существует, до того, как он ее найдет. Во-вторых, большинство используемых полезных нагрузок являются теоретическими -- копируются между проектами и блогами, никогда не тестируясь на реальном парсере. Они выглядят правильно. Возможно, они даже синтаксически корректны. Но они не вызывают обнаруживаемого ответа от цели.
Этот проект использует другой подход. Основной единицей работы является полиглот -- одна строка полезной нагрузки, спроектированная так, чтобы быть валидной (или значимо невалидной) одновременно в как можно большем количестве контекстов инъекций. Один полиглот вырывается из одинарных кавычек, двойных кавычек, круглых скобок, блочных комментариев, атрибутов HTML, разделителей шаблонов и контекстов обратных кавычек одновременно. Вместо того чтобы знать, какая уязвимость существует, тестер отправляет полиглоты на каждый параметр и наблюдает за сигналами.
Каждая полезная нагрузка в этой коллекции построена вокруг столпов обнаружения -- наблюдаемых ответов, которые подтверждают наличие уязвимости без необходимости доступа к журналам сервера, исходному коду или файловой системе:
7*191, которое вычисляется в 1337. Если это число появляется в ответе, а полезная нагрузка отправляла только 7*191 (не литерал 1337), то бэкенд вычислил выражение -- доказательство выполнения кода.Если полезная нагрузка не производит хотя бы один из этих сигналов при тестировании в своем целевом контексте, ей не место в списке. Каждая из 1,353 полезных нагрузок здесь была проверена на специально созданных тестовых стендах Docker со строгим доказательством эксплуатации. Никаких теоретических.
Традиционные внеполосные нагрузки и нагрузки для временных задержек полагаются на команды оболочки: curl, nslookup, ping, sleep. Они постоянно ломаются. Они зависят от целевой ОС, доступного PATH, того, какая оболочка интерпретирует команду, и есть ли у процесса разрешение на создание подпроцессов. curl-базированная внеполосная нагрузка, работающая на Ubuntu, не работает на Alpine (нет curl), не работает на Windows (нет curl) и не работает внутри ограниченного контейнера (нет выполнения исходящих процессов).
Этот проект заменяет команды оболочки на встроенные функции языка везде, где это возможно. Полезные нагрузки Python используют urllib.request.urlopen() и time.sleep(). Полезные нагрузки Java используют java.net.URL.openStream() и Thread.sleep(). Ruby использует Net::HTTP.get() и Kernel.sleep. PHP использует file_get_contents() и sleep(). Эти функции существуют в каждой стандартной установке соответствующего языка -- нет поиска PATH, нет подпроцесса, нет зависимости от ОС.
Там, где даже импорты стандартной библиотеки могут быть заблокированы (песочница eval, ограниченный exec), полезные нагрузки отступают к альтернативам без импорта: циклы загрузки ЦП для времени (sum(range(500000000)) в Python, Atomics.wait() в Node) и прямые сокетные соединения для OOB (__import__('socket').create_connection(), fsockopen(), TCPSocket.new()).
Не все может быть полиглотом. Шаблонизаторы используют принципиально несовместимый синтаксис -- {{}} в Jinja2 ничего не значит для <%= %> ERB, и ни один не парсится как ${} Freemarker). Форматы десериализации являются бинарными или структурированными данными, специфичными для одного фреймворка. Для этих категорий проект использует нагрузки для каждого движка, организованные в рамках той же системы столпов обнаружения, охватывая 14 шаблонизаторов и 31 фреймворк десериализации на 7 языках.
Результатом является единый корпус, в котором полиглоты обрабатывают контексты, которые они могут (SQLi, инъекции команд ОС, XSS, инъекции кода), а специально созданные нагрузки для каждого движка обрабатывают остальное, все проверено, все генерирует обнаруживаемые сигналы, все готово для построчного ввода в инструменты инъекций.
83 полезных нагрузки, покрывающие все 35 тестовых стендов, все 55+ конечных точек и все 4 столпа обнаружения для каждой категории. Валидировано: 83 СРАБОТАЛО / 0 НЕ СРАБОТАЛО / 0 ПРОПУЩЕНО.
Каждая категория инъекций получает покрытие по ошибке, математике, времени и OOB, где это архитектурно возможно. Фреймворки десериализации, поддерживающие выполнение кода (Pickle, PyYAML, jsonpickle, node-serialize, XMLDecoder, .NET Json.NET), получают полное многопиллярное покрытие. Фреймворки, ограниченные зондированием (PHP unserialize, Ruby Marshal, SnakeYAML и т.д.), получают обнаружение на основе ошибок. Применяйте это к каждому параметру, прежде чем переключаться на полные списки категорий для углубленного анализа.
83 запроса вместо 1,353. Используйте ready/minimal/payloads-only.txt для Burp Intruder.
Смотрите HOWTOUSE.md для полного руководства оператора. Оно превращает «Я смотрю на параметр, что мне в него отправить?» в повторяемый рабочий процесс:
7*7, возвращающее 49 как признак eval, {{name}}, отображающееся как «Alice», подтверждающее SSTI, вывод ping, просачивающийся из диагностического поля, строки User-Agent в OOB-логах, указывающие на библиотеку-загрузчик), ловушки ORM современных стеков (Prisma $queryRaw, Rails .order(), Hibernate JPQL concat, Mongoose findOne(req.body)), и дешёвые проверки для подтверждения подозрений перед сжиганием полного списка.rO0AB = Java, AAEAAAD///// = .NET BinaryFormatter, BAg = Ruby Marshal, gASV = Python pickle P4, / = PHP unserialize и т.д.) с шпаргалкой из 16 записей для быстрого ознакомления и эвристиками устранения неоднозначности. Снимите отпечаток блоба перед отправкой, чтобы загрузить 5-15 соответствующих нагрузок вместо всех 232.Используйте HOWTOUSE.md перед запуском payloadctl prepare. Сначала - снятие отпечатка, затем - минимальный список, затем - углубленный анализ категории - а не дробовик из 1,353 полезных нагрузок на каждый параметр.
./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` | Только path traversal | 113 |
| `ready/full/by-category/xss.txt` | Только XSS | 58 |
| `ready/full/by-category/nosql.txt` | Только NoSQL-инъекции | 32 |
| `ready/full/by-category/format-string.txt` | Только строковые форматы (format string) | 38 |
| `ready/full/by-category/el-injection.txt` | Только инъекции Expression Language | 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` | Out-of-band (внешние запросы) | 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` | Юникод-экранирование | 1,353 |
Каталог `ready/minimal/` повторяет ту же структуру (by-category, by-pillar, encoded) с минимальным набором пэйлоадов.
Пользовательский выходной каталог:```bash
./tools/payloadctl prepare YOUR_CALLBACK.oastify.com -o /path/to/engagement/payloads
Сырые шаблоны с плейсхолдером {domain} (для подстановки скриптами) находятся в payloads/lists/full/ и payloads/lists/minimal/.
Каждая полезная нагрузка генерирует как минимум один из этих сигналов. Ищите их в ответах:
Канареечные значения: 1337 (основное, из 7*191) и 7331 (второстепенное). Обнаружение — простой grep.
13 из 20 категорий имеют все 4 столпа. 7, которые не имеют (XSS, XSLT, Format String, Prototype Pollution, CRLF, XXE, CouchDB) имеют архитектурные причины — вы не можете сделать CRLF на основе задержки или OOB форматные строки. Там, где кросс-столп возможен, его покрывает раздел полиглотов.
7 форматов кодирования, каждый для всех 1353 нагрузок:
Минимум нагрузок, максимум покрытия контекстов. Полную техническую спецификацию с таблицами столпов для каждого движка и точным синтаксисом нагрузок см. в SPEC.md.
Сначала полиглоты. Одна нагрузка одновременно выходит из ', ", ), */, -->, обратных кавычек и разделителей шаблонов. Разделы полиглотов возглавляют основной список.
По движку там, где полиглоты не работают. Разделители SSTI и форматы десериализации принципиально несовместимы между разными движками.
Встроенные функции вместо оболочки. Нагрузки OOB и задержки используют нативные для языка библиотеки:
payloadctl)```bash./tools/payloadctl prepare abc123.oastify.com # output -> ready/ ./tools/payloadctl prepare abc123.oastify.com -o /tmp/payloads # custom dir
./tools/payloadctl build # sources/ -> payloads/full.txt ./tools/payloadctl dist # full.txt + minimum.txt -> payloads/lists/full/ + lists/minimal/ ./tools/payloadctl validate # test all 1,353 payloads against 35 testbed stacks ./tools/payloadctl validate # test a specific wordlist (e.g. lists/minimal/master.txt) ./tools/payloadctl generate # regenerate computed payloads (deser, ssti, sqli, misc) ./tools/payloadctl generate deser # deserialization only ./tools/payloadctl generate ssti # SSTI only
### Типичный рабочий процесс разработки```bash
# 1. Edit source files
vim payloads/sources/sqli.txt
# 2. Rebuild
./tools/payloadctl build # rebuild full.txt from sources
./tools/payloadctl dist # regenerate lists/full/ + lists/minimal/
# 3. Validate (requires Docker testbeds running)
cd testbed && ./testbed up sqli-sqlite && cd ..
./tools/payloadctl validate # expect: N FIRE / 0 NO-FIRE / 0 SKIPPED
# 4. Prepare for use
./tools/payloadctl prepare YOUR_CALLBACK.oastify.com
. ├── README.md # This file ├── HOWTOUSE.md # Operator guide: context profiling + category selection matrix ├── SPEC.md # Technical spec - per-engine pillars, payload syntax, coverage │ ├── tools/ # CLI and generators │ ├── payloadctl # CLI entry point │ ├── cmd_build.py # Build full.txt from source files │ ├── cmd_dist.py # Generate lists/ directory │ ├── cmd_validate.py # Validate payloads against testbeds │ ├── cmd_validate_strict.py # Strict validation (proves actual exploitation) │ ├── cmd_generate.py # Run payload generators │ ├── cmd_prepare.py # Prepare payloads with callback domain │ ├── generate-deser-final.py # Deserialization generator (31 frameworks) │ ├── generate-ssti-missing.py # SSTI generator (14 engines) │ ├── generate-sqli-code-missing.py # SQLi and code injection generator │ └── generate-misc-missing.py # XXE, XSS, SSRF, path traversal generator │ ├── payloads/ │ ├── full.txt # Master list (1,353 payloads, with ## headers) │ ├── sources/ # Source files (edit these, all validated) │ │ ├── minimum.txt # 83-payload minimal list (validated, all pillars) │ │ ├── polyglots-condensed.txt # Cross-context polyglots (first in master) │ │ ├── sqli.txt # SQL injection (204) │ │ ├── ssti.txt # Template injection (168) │ │ ├── deserialization.txt # Deserialization (116, 31 frameworks) │ │ ├── os-cmd-injection.txt # OS command injection (116) │ │ ├── code-injection.txt # Code injection (112, includes Groovy) │ │ ├── ssrf.txt # SSRF (117) │ │ ├── path-traversal.txt # Path traversal (98) │ │ ├── xss.txt # XSS (49) │ │ ├── format-string.txt # Format string (33) │ │ ├── nosql.txt # NoSQL (26) │ │ ├── el-injection.txt # Expression language (26, includes MVEL) │ │ ├── header-crlf.txt # CRLF/header (14) │ │ ├── prototype-pollution.txt # Prototype pollution (10) │ │ ├── xxe.txt # XXE (8) │ │ ├── ldap-injection.txt # LDAP injection (30) │ │ ├── xslt-injection.txt # XSLT injection (25) │ │ ├── elasticsearch-injection.txt # Elasticsearch (25) │ │ ├── cypher-injection.txt # Neo4j/Cypher (22) │ │ └── couchdb-injection.txt # CouchDB (4) │ └── lists/ # Generated (don't edit, use payloadctl dist) │ ├── full/ # Full payload set │ │ ├── master.txt # 1,353 payloads with ## headers │ │ ├── payloads-only.txt # Raw lines for Burp Intruder │ │ ├── by-category/ # 20 category files │ │ ├── by-pillar/ # 5 pillar files (with -payloads-only variants) │ │ └── encoded/ # 7 encoding variants │ └── minimal/ # Minimal payload set (same structure) │ ├── master.txt # 83 payloads with ## headers │ ├── payloads-only.txt # Raw lines for Burp Intruder │ ├── by-category/ # 20 category files │ ├── by-pillar/ # 5 pillar files (with -payloads-only variants) │ └── encoded/ # 7 encoding variants │ ├── ready/ # Output from payloadctl prepare (gitignored) │ └── testbed/ # Docker validation infrastructure ├── testbed # CLI: ./testbed up ├── docker-compose.oob.yml # OOB callback catcher (HTTP 9999, TCP 9998, DNS 5353) ├── shared/oob-catcher/ # HTTP + LDAP/binary + raw TCP + DNS callback server └── stacks/ # 35 vulnerable application stacks
---
## Добавление полезных нагрузок
### Добавление полезной нагрузки в существующую категорию
1. Отредактируйте исходный файл в `payloads/sources/`. Одна полезная нагрузка на строку под разделом `##Header##`.
2. Каждая полезная нагрузка должна создавать обнаруживаемый сигнал (ошибка, математический результат 1337, задержка >4.5s, внеполосный (OOB), отражение).
3. Пересоберите и проверьте: ```bash
./tools/payloadctl build && ./tools/payloadctl dist
./tools/payloadctl validate # 0 NO-FIRE required
payloads/sources/<category>.txt с заголовками ## для каждой категории (error, math, timing, OOB).SOURCE_FILES в tools/cmd_build.py и CATEGORY_SOURCES в tools/cmd_dist.py.testbed/stacks/<category>/ (Dockerfile + сервер, предоставляющий POST /<endpoint> с input=<payload> и возвращающий {"output": "...", "error": "...", "time_ms": N}).tools/cmd_validate.py (словарь ENDPOINTS и функция _get_endpoints()).tools/generate-deser-final.py - добавьте функцию, которая выводит полезные нагрузки (error, math, timing, OOB)../tools/payloadctl generate deser && ./tools/payloadctl buildpayloads/sources/ssti.txt - добавьте разделы ##EngineName (Language) - Pillar##. Используйте встроенные возможности языка для timing/OOB.ssti-<language>.ENGINE_MAP в tools/cmd_validate.py.\n){domain} для URL обратного вызова OOB1337 для всех математических полезных нагрузок##Header## группируют по категории и pillarВалидатор проверяет каждую полезную нагрузку на реальных уязвимых приложениях:```bash
cd testbed ./testbed up sqli-sqlite ./testbed up ssti-python ./testbed up deserialization-java
cd .. ./tools/payloadctl validate
How it works:
1. Читает файл полезной нагрузки и направляет каждый раздел `##` в соответствующие конечные точки тестового стенда
2. Отправляет POST `input=<payload>` в конечные точки, проверяет ответ на наличие сигналов
3. Полезная нагрузка срабатывает, если ЛЮБАЯ конечная точка возвращает: реальную ошибку парсера/интерпретатора, вычисленное сервером `1337` (из `7*191`), задержку >4.5 с, обратный вызов OOB из целевого контейнера, содержимое файла (`root:x:0:0`) или отражённый ввод в валидном контексте (XSS, CRLF)
Строгая валидация (`tools/cmd_validate_strict.py`) дополнительно проверяет:
- Математические полезные нагрузки доказывают вычисление на стороне сервера (нагрузка отправляет `7*191`, а не литерал `1337`)
- Обратные вызовы OOB происходят с IP-адресов контейнеров тестового стенда
- Сообщения об ошибках содержат реальные сигнатуры парсеров/интерпретаторов, а не общие ошибки HTTP
- Временные задержки находятся в ожидаемом диапазоне (~5 секунд)
### Стеки тестовых стендов (всего 35)
| Стек | Порт | Язык | Конечные точки |
|-------|------|----------|-----------|
| sqli-sqlite | 8001 | Python | `/sqli`, `/sqli-numeric` |
| sqli-postgres | 8030 | Python | `/sqli` |
| ssti-python | 8003 | Python | `/jinja2`, `/mako`, `/tornado` |
| ssti-node | 8011 | Node | `/ejs`, `/nunjucks`, `/pug` |
| ssti-php | 8020 | PHP | `/twig`, `/smarty` |
| ssti-ruby | 8025 | Ruby | `/erb`, `/slim`, `/haml` |
| ssti-java | 8040 | Java | `/freemarker`, `/velocity`, `/pebble`, `/thymeleaf` |
| os-cmd-injection | 8002 | Python | `/system`, `/popen` |
| code-injection-python | 8004 | Python | `/eval` |
| code-injection-node | 8012 | Node | `/eval` |
| code-injection-php | 8021 | PHP | `/eval` |
| code-injection-ruby | 8026 | Ruby | `/eval`, `/yaml`, `/marshal`, `/oj` |
| code-injection-perl | 8031 | Perl | `/eval`, `/storable`, `/yaml` |
| xss | 8010 | Node | `/reflected` |
| xxe | 8008 | Python | `/parse`, `/xinclude` |
| ssrf | 8007 | Python | `/fetch` |
| path-traversal | 8006 | Python | `/read` |
| nosql-redis | 8015 | Node | `/eval` |
| el-injection-java | 8041 | Java | `/spel`, `/ognl` |
| prototype-pollution | 8013 | Node | `/merge` |
| deserialization-python | 8005 | Python | `/pickle`, `/yaml`, `/jsonpickle` |
| deserialization-node | 8014 | Node | `/unserialize`, `/yaml`, `/funcster` |
| deserialization-php | 8022 | PHP | `/unserialize`, `/unserialize-b64`, `/phar` |
| deserialization-java | 8042 | Java | `/deserialize`, `/yaml`, `/jackson`, `/fastjson`, `/xstream`, `/xmldecoder`, `/hessian` |
| deserialization-dotnet | 8045 | .NET | `/jsonnet`, `/binaryformatter`, `/xmlserializer`, `/losformatter`, `/javascriptserializer` |
| log4j-jndi | 8046 | Java | `/log` |
| sqli-mysql | 8050 | Python | `/sqli`, `/sqli-numeric` |
| nosql-mongo | 8051 | Node | `/find`, `/where`, `/aggregate` |
| ssi-esi | 8035 | Python | `/ssi` |
| ldap-injection | 8055 | Python + OpenLDAP | `/search`, `/auth` |
| xslt-injection | 8056 | Python | `/transform`, `/xpath` |
| elasticsearch | 8057 | Python + ES 7.17 | `/search`, `/script` |
| cypher-injection | 8058 | Python + Neo4j 5 | `/query`, `/search` |
| couchdb-injection | 8059 | Python + CouchDB 3 | `/find` |
| groovy-injection | 8060 | Groovy/JDK 21 | `/eval` |
Ловитель OOB на порту 9999 (HTTP + обнаружение LDAP/двоичных данных) и 9998 (общий TCP-перехватчик), с DNS на 5353/UDP. Обнаруживает HTTP-обратные вызовы, двоичные соединения LDAP/ASN.1 (JNDI), DNS-запросы и сырые TCP-соединения. Каждая конечная точка принимает `POST /<sink>` с `input=<payload>` и возвращает `{"output": "...", "error": "...|null", "time_ms": N}`.
---
## Благодарности
Полезные нагрузки исследованы и разработаны [Grom Hacks](https://github.com/gromhacks). Основано на работе сообщества исследователей безопасности, включая PayloadsAllTheThings, HackTricks, PortSwigger Web Security Academy и отдельных исследователей. Все полезные нагрузки проверены на реальных уязвимых приложениях.
| Полезные нагрузки | Категория | Столпы |
|---|
| 4 | SQLi | ошибка, математика, время, OOB (полиглоты разных диалектов) |
| 4 | SSTI | ошибка, математика, время, OOB (полиглоты разных движков) |
| 3 | Команды ОС | математика, время, OOB (полиглоты разных оболочек) |
| 3 | Инъекция кода | математика, время, OOB (межъязыковые) |
| 2 | XSS | математика, OOB |
| 2 | XXE | чтение файла, OOB |
| 2 | SSRF | ошибка, OOB |
| 1 | Обход пути | чтение файла |
| 2 | NoSQL | математика, ошибка |
| 1 | Инъекция EL | математика |
| 1 | Загрязнение прототипа | математика |
| 1 | CRLF/Заголовки | математика |
| 1 | Строка формата | ошибка |
| 1 | SSI | математика |
| 2 | Инъекция LDAP | ошибка, математика |
| 3 | Инъекция XSLT | ошибка, математика, OOB |
| 2 | Elasticsearch | ошибка, математика |
| 2 | Cypher/Neo4j | ошибка, время |
| 1 | CouchDB | ошибка |
| 3 | Groovy | математика, время, OOB |
| 41 | Десериализация | многопиллярный где поддерживается, только ошибка в противном случае |
TzoYToid=42 и JSESSIONID» к «попробуйте by-category/sqli.txt + десериализацию Java + инъекцию EL, следите за блоком математики» за один просмотр.| Столп | Нагрузки | Что искать | Использовать когда |
|---|
| Ошибка | 324 | Текст исключения, стек вызовов, ошибка парсера в ответе | Приложение отражает ошибки |
| Задержка | 227 | Ответ занимает >4.5 секунд | Слепое внедрение — нет вывода, нет ошибок |
| Внешний канал | 209 | Исходящий HTTP/DNS/LDAP/TCP на ваш callback-сервер | Слепое + асинхронное — задержка ненадёжна |
| Математика | 182 | Литерал 1337 в теле ответа (сервер вычислил 7*191) | Вывод отражается, но ошибок нет |
| Отражение | 374 | Введённое значение повторяется в ответе | Фаззинг на аномалии парсера |
| Чтение файлов | (подмножество) | Содержимое root: или [extensions] в ответе | Path traversal, XXE чтение файлов |
| Категория | Количество | Столпы | Охват |
|---|
| SQLi | 211 | error, math, timing, oob | MySQL, PostgreSQL, Oracle, MSSQL, SQLite, CockroachDB. UNION, error, timing, OOB. Выход из контекста: ', ", ), )), */, numeric. |
| SSTI | 206 | error, math, timing, oob | Jinja2, Mako, Tornado, EJS, Nunjucks, Pug, Twig, Smarty, ERB, Slim, Haml, Thymeleaf, Pebble, Freemarker, Velocity, Razor, Go template, Mustache, Liquid. Все используют встроенные средства языка. |
| Десериализация | 232 | error, math, timing, oob | 31 фреймворков / 7 языков. Все нативные для языка полезные нагрузки используют встроенные средства (без команд оболочки). Python (pickle P0/P2/P4 через time.sleep/builtins.eval/urllib, YAML через time.sleep/builtins.eval, jsonpickle), PHP (unserialize), Node (node-serialize через JS busy-wait/http.get, js-yaml, funcster, cryo), Ruby (YAML, Marshal, Oj), Java (Jackson, Fastjson, XStream, SnakeYAML, XMLDecoder, Hessian, JNDI/Log4Shell, ObjectInputStream, ysoserial URLDNS), .NET (Json.NET, BinaryFormatter, SoapFormatter, XmlSerializer, JavaScriptSerializer, LosFormatter, ViewState, ObjectStateFormatter), Perl (Storable, YAML). |
| Внедрение команд ОС | 120 | error, math, timing, oob | Bash, CMD, PowerShell. Разделители: ;, |, ||, &&, $(), обратные кавычки. Обход IFS, обход glob, hex-кодирование. |
| Внедрение кода | 123 | error, math, timing, oob | Python, Node, PHP, Ruby, Perl, Lua, Java ScriptEngine, Groovy. Загрузка ЦП без импортов, OOB на уровне сокетов. |
| SSRF | 156 | error, math, timing, oob | Облачные метаданные (AWS/GCP/Azure), обход IP, схемы протоколов, DNS rebinding, зондирование внутренних сервисов. |
| Path Traversal | 113 | error, math, timing, oob | Linux + Windows, обход кодировкой, нулевой байт, обёртки PHP, UNC, NTFS ADS, короткие имена 8.3. |
| XSS | 58 | error, math, oob | Кросс-контекстные полиглоты (20+ контекстов), обработчики событий, обход фильтров, DOM clobbering, мутационный XSS, SVG, OOB. |
| Форматная строка | 38 | error, math | C/C++ (%s%n%x), Python ({0.__class__}), .NET ({0:X}). |
| NoSQL | 32 | error, math, timing, oob | Внедрение операторов MongoDB, $where с задержкой, OOB, команды Redis. |
| EL Injection | 34 | error, math, timing, oob | SpEL, OGNL, MVEL, Unified EL. OOB через java.net.URL. |
| CRLF/Заголовок | 17 | error, math, oob | Расщепление ответа, внедрение заголовков, OOB через заголовок Host. |
| Prototype Pollution | 12 | error, math | __proto__, constructor.prototype, варианты JSON и строк запроса. |
| XXE | 11 | error, timing, oob, file-read | Внешние сущности, XInclude, параметрические сущности, DoS Billion Laughs. |
| LDAP Injection | 35 | error, math, timing, oob | Внедрение фильтра, обход аутентификации, задержка по wildcard, OOB через реферал. |
| Elasticsearch | 30 | error, math, timing, oob | Внедрение скриптов Painless, DSL запросов, синтаксис query_string. |
| Cypher/Neo4j | 27 | error, math, timing, oob | Внедрение запросов Cypher, APOC sleep, LOAD CSV OOB. |
| CouchDB | 5 | error, math | Внедрение запросов Mango, внедрение операторов, обход аутентификации. |
| XSLT Injection | 30 | error, math, oob, file-read | Математика XPath, SSRF через document(), чтение файлов, утечка информации через system-property(). |
| Полиглоты/Пограничные случаи | 246 | error, math, timing, oob | Кросс-контекстные полиглоты + переполнение буфера, границы целых чисел, путаница типов, нулевой байт. |
| Кодировка | Сценарий использования |
|---|
| URL-encoded | Стандартные параметры запроса/формы |
| Double-URL-encoded | Обход WAF, уязвимости двойного декодирования |
| Base64 | Тела API, JWT, сериализованные параметры |
| JSON-safe | Тела JSON-запросов (экранированные кавычки) |
| HTML entity | Внедрение в HTML-атрибуты |
| Hex-escaped | Бинарные протоколы, низкоуровневое внедрение |
| Unicode-escaped | Обход нормализации Unicode |
| Язык | Встроенный OOB | Встроенная задержка |
|---|
| Python | urllib.request.urlopen() | time.sleep(5) |
| Java | java.net.URL.openStream() | Thread.sleep(5000) |
| Node | require('http').get() | Цикл busy-wait на Date.now() |
| PHP | file_get_contents(), fsockopen() | sleep(5) |
| Ruby | Net::HTTP.get(), TCPSocket.new() | sleep(5) |
| Perl | IO::Socket::INET | select(undef,undef,undef,5) |
| .NET | System.Net.WebClient | Thread.Sleep(5000) |
Команды оболочки (curl, nslookup) зависят от ОС и PATH. Встроенные функции работают везде.
Без импортов, где возможно. Загрузка ЦП работает даже если импорты заблокированы:
sum(range(500000000)) (~7 с, без импортов)Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,5000) (точные 5 с)99999999.times{1+1}OOB на уровне сокетов как запасной вариант. Когда HTTP-библиотеки заблокированы: __import__('socket').create_connection(), fsockopen(), TCPSocket.new(), new java.net.Socket().
./tools/payloadctl validate