
GromHacks Labs -- 그들이 당신이 가지길 원하지 않는 페이로드 목록. 마더쉽에서 지구로 전송된 1,324개의 인젝션 프로브가 20가지 취약점 클래스에 걸쳐 인젝션 가능 여부를 탐지합니다. 우리는 익스플로잇을 하지 않으며, 그냥 문을 두드리고 누가 응답하는지 확인할 뿐입니다. 모든 페이로드는 실제 파서를 대상으로 테스트되었으며, 외계인들은 증거를 요구합니다. 입력을 신뢰하지 마세요! 모든 것을 의심하세요!
작동하지 않는 페이로드를 찾았나요? 이슈 열기에 페이로드, 대상 컨텍스트, 그리고 예상했던 동작을 포함해 주세요. 수정 사항이나 새로운 페이로드가 포함된 풀 리퀘스트는 언제나 환영합니다.
연구는 계속 진행 중입니다. 이 프로젝트는 활발히 개발 중이며, 새로운 페이로드, 취약점 클래스, 검증 개선 사항으로 정기적으로 업데이트될 예정입니다.
면책 조항: 이 페이로드는 승인된 보안 테스트, 교육 및 연구 목적으로만 제공됩니다. 작성자는 오용이나 파생 효과에 대해 어떠한 책임도 지지 않습니다. 전적으로 자신의 책임 하에 사용하세요. 이 프로젝트를 사용함으로써 귀하는 자신의 행동에 대한 전적인 책임을 수락하는 것입니다.
라이선스: MIT - LICENSE 참조
1,353개의 검증된 인젝션 페이로드가 20개의 취약점 클래스, 31개의 역직렬화 프레임워크 및 14개의 템플릿 엔진을 다룹니다. 모든 페이로드는 감지 가능한 신호를 생성합니다. 이론적인 페이로드는 전혀 없습니다.
검증: 35개의 Docker 테스트베드 스택에 대해 1,353개 테스트됨 / 1,353개 발동 / 0개 실패 / 0개 건너뜀. 엄격한 검증은 실제 익스플로잇(서버 측 계산, 실제 파서 오류, 측정된 지연 시간, 대상 컨테이너의 OOB 콜백)을 증명합니다. 문자열 매칭이 아닙니다.
대부분의 공개 페이로드 목록은 취약점 유형별로 구성되어 있습니다. 하나는 SQL 인젝션용, 다른 하나는 XSS용, 또 다른 하나는 명령 인젝션용 등입니다. 테스터는 대상과 일치할 것으로 생각되는 목록을 선택하여 침투 도구에 로드하고 파라미터에 대해 실행합니다. 취약점 클래스를 잘못 추측하면 전체 스캔에서 아무것도 생성되지 않습니다. 백엔드가 흔하지 않은 데이터베이스나 비표준 템플릿 엔진, 혹은 목록에서 고려하지 않은 언어라면 페이로드는 조용히 실패합니다. 테스터는 파라미터가 안전하다고 생각하고 넘어갑니다.
이 접근 방식에는 두 가지 근본적인 문제가 있습니다. 첫째, 테스터가 취약점을 발견하기 전에 어떤 취약점이 존재하는지 알아야 합니다. 둘째, 유통되는 대부분의 페이로드는 이론적입니다. 프로젝트와 블로그 게시물 사이에서 복사되었지만 실제 파서에 대해 테스트된 적이 없습니다. 올바르게 보입니다. 구문적으로 유효할 수도 있습니다. 하지만 실제로 대상에서 감지 가능한 응답을 트리거하지 않습니다.
이 프로젝트는 다른 접근 방식을 취합니다. 주요 작업 단위는 **폴리글롯(polyglot)**입니다. 하나의 페이로드 문자열이 가능한 한 많은 인젝션 컨텍스트에서 동시에 유효(또는 의미 있게 무효)하도록 설계되었습니다. 하나의 폴리글롯이 작은따옴표, 큰따옴표, 괄호, 블록 주석, HTML 속성, 템플릿 구분자, 백틱 컨텍스트를 한 번에 모두 탈출합니다. 취약점이 무엇인지 알 필요 없이 테스터는 모든 파라미터에 폴리글롯을 발사하고 신호를 관찰합니다.
이 컬렉션의 모든 페이로드는 **검증 기둥(detection pillars)**을 중심으로 구축되었습니다. 서버 로그, 소스 코드, 파일 시스템에 접근하지 않고도 취약점이 존재함을 확인할 수 있는 관찰 가능한 응답입니다:
7*191과 같은 산술 표현식이 포함되어 1337으로 평가됩니다. 응답에 그 숫자가 나타나고 페이로드가 리터럴 1337이 아닌 7*191만 보냈다면, 백엔드가 표현식을 계산한 것입니다. 이는 코드 실행의 증거입니다.페이로드가 대상 컨텍스트에 대해 테스트되었을 때 이러한 신호 중 하나라도 생성하지 않으면 목록에 속하지 않습니다. 여기 있는 1,353개의 모든 페이로드는 엄격한 익스플로잇 증명을 통해 특수 제작된 Docker 테스트베드에 대해 검증되었습니다. 이론적인 것은 전혀 없습니다.
전통적인 OOB 및 타이밍 페이로드는 셸 명령어(curl, nslookup, ping, sleep)에 의존합니다. 이러한 명령어는 자주 깨집니다. 대상 OS, 사용 가능한 PATH, 명령어를 해석하는 셸, 프로세스가 하위 프로세스를 생성할 권한이 있는지에 따라 달라집니다. Ubuntu에서 작동하는 curl 기반 OOB 페이로드는 Alpine(컬 없음), Windows(컬 없음), 제한된 컨테이너 내부(아웃바운드 프로세스 실행 불가)에서 실패합니다.
이 프로젝트는 가능한 경우 셸 명령어를 언어 자체 내장 함수로 대체합니다. 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 조회, 하위 프로세스, OS 종속성이 없습니다.
표준 라이브러리 임포트조차 차단될 수 있는 경우(샌드박스 eval, 제한된 exec), 페이로드는 임포트가 필요 없는 대안으로 대체됩니다: 타이밍을 위한 CPU 스핀 루프(Python의 sum(range(500000000)), Node의 Atomics.wait()) 및 OOB를 위한 원시 소켓 연결(__import__('socket').create_connection(), fsockopen(), TCPSocket.new())입니다.
모든 것이 폴리글롯이 될 수 있는 것은 아닙니다. 템플릿 엔진은 근본적으로 호환되지 않는 구문을 사용합니다. Jinja2의 {{}}는 ERB의 <%= %>에게 아무 의미가 없으며, 둘 다 Freemarker의 ${}로 파싱되지 않습니다. 역직렬화 형식은 특정 프레임워크에 특화된 바이너리 또는 구조화된 데이터입니다. 이러한 카테고리의 경우, 프로젝트는 동일한 검증 기둥 시스템 하에 구성된 엔진별 페이로드를 사용하며, 7개 언어에 걸쳐 14개의 템플릿 엔진과 31개의 역직렬화 프레임워크를 다룹니다.
결과는 폴리글롯이 처리할 수 있는 컨텍스트(SQLi, OS 명령 인젝션, XSS, 코드 인젝션)를 처리하고, 특수 제작된 엔진별 페이로드가 나머지를 처리하는 단일 코퍼스입니다. 모두 검증되었고, 모두 감지 가능한 신호를 생성하며, 모두 라인별 인젝션 도구에 사용할 준비가 되었습니다.
83개의 페이로드가 35개 모든 테스트베드 스택, 55개 이상의 엔드포인트, 각 카테고리의 4가지 검증 기둥을 모두 다룹니다. 검증됨: 83 발동 / 0 미발동 / 0 건너뜀.
모든 인젝션 카테고리는 아키텍처적으로 가능한 경우 오류 + 수학 + 타이밍 + OOB 범위를 얻습니다. 코드 실행을 지원하는 역직렬화 프레임워크(Pickle, PyYAML, jsonpickle, node-serialize, XMLDecoder, .NET Json.NET)는 전체 다중 기둥 범위를 얻습니다. 프로빙만 가능한 프레임워크(PHP unserialize, Ruby Marshal, SnakeYAML 등)는 오류 기반 탐지를 얻습니다. 깊이 있는 탐색을 위해 전체 카테고리 목록으로 전환하기 전에 모든 파라미터에 이것을 발사하세요.
1,353개 대신 83개의 요청. 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의 지문을 확인하여 232개 모두 대신 5-15개의 일치하는 페이로드를 로드하세요.payloadctl prepare를 실행하기 전에 HOWTOUSE.md를 사용하세요. 지문 확인 먼저, 최소 목록 다음, 카테고리 심층 탐색 마지막 - 모든 파라미터에 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` | OS 명령어 인젝션 전용 | 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` | 표현 언어(EL) 인젝션 전용 | 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` | 컨텍스트 간 폴리글랏(polyglot) | 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-safe 변형 | 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` | 16진수 이스케이프 변형 | 1,353 |
| `ready/full/encoded/unicode-escaped/payloads.txt` | 유니코드 이스케이프 변형 | 1,353 |
`ready/minimal/` 디렉토리도 동일한 구조(by-category, by-pillar, encoded)를 가지며, 최소 페이로드 세트가 포함됩니다.
Custom output directory:```bash
./tools/payloadctl prepare YOUR_CALLBACK.oastify.com -o /path/to/engagement/payloads
Raw templates with {domain} placeholder (for scripted substitution) are in payloads/lists/full/ and payloads/lists/minimal/.
모든 페이로드는 이 신호 중 하나 이상을 생성합니다. 응답에서 이들을 grep하십시오:
카나리 값: 1337 (기본, 7*191에서) 및 7331 (보조). 탐지는 간단한 grep입니다.
20개 카테고리 중 13개가 4개의 기준을 모두 갖추고 있습니다. 그렇지 않은 7개(XSS, XSLT, Format String, Prototype Pollution, CRLF, XXE, CouchDB)는 아키텍처상의 이유가 있습니다. 타이밍 기반 CRLF나 OOB 포맷 문자열은 불가능합니다. 교차 기준이 가능한 경우에는 폴리글롯 섹션이 이를 다룹니다.
7가지 인코딩 형식, 각각 1,353개 페이로드 전체 포함:
최소 페이로드, 최대 컨텍스트 범위. 각 엔진별 기준 표와 정확한 페이로드 구문이 포함된 전체 기술 사양은 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. 모든 페이로드는 감지 가능한 신호(오류, math 1337, 타이밍 >4.5s, OOB, 반사)를 생성해야 합니다.
3. 다시 빌드하고 검증합니다: ```bash
./tools/payloadctl build && ./tools/payloadctl dist
./tools/payloadctl validate # 0 NO-FIRE required
payloads/sources/<category>.txt를 생성하고 각 기둥(오류, 수학, 시간, 범위 밖)에 대해 ## 헤더를 추가합니다.tools/cmd_build.py의 SOURCE_FILES와 tools/cmd_dist.py의 CATEGORY_SOURCES에 파일을 추가합니다.testbed/stacks/<category>/에 테스트베드 스택을 생성합니다 (Dockerfile + input=<payload>로 POST /<endpoint>를 노출하고 {"output": "...", "error": "...", "time_ms": N}을 반환하는 서버).tools/cmd_validate.py에 엔드포인트 라우팅을 추가합니다 (ENDPOINTS 딕셔너리와 _get_endpoints() 함수)../tools/payloadctl validatetools/generate-deser-final.py를 편집하여 페이로드를 출력하는 함수를 추가합니다 (오류, 수학, 시간, 범위 밖)../tools/payloadctl generate deser && ./tools/payloadctl build를 실행합니다.payloads/sources/ssti.txt를 편집하여 ##EngineName (Language) - Pillar## 섹션을 추가합니다. 시간/범위 밖에는 언어 내장 기능을 사용합니다.ssti-<language> 스택에 테스트베드 엔드포인트를 추가합니다.tools/cmd_validate.py의 ENGINE_MAP에 라우팅을 추가합니다.\n 사용){domain} 플레이스홀더1337 카나리##Header## 섹션은 카테고리와 기둥별로 그룹화검증기는 실제 취약한 애플리케이션에 대해 모든 페이로드를 테스트합니다:```bash
cd testbed ./testbed up sqli-sqlite ./testbed up ssti-python ./testbed up deserialization-java
cd .. ./tools/payloadctl validate
작동 방식:
1. 페이로드 파일을 읽고 각 `##` 섹션을 일치하는 테스트베드 엔드포인트로 라우팅합니다.
2. `input=<페이로드>`를 엔드포인트에 POST하여 응답에서 신호를 확인합니다.
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 catch-all)에 있으며, DNS는 5353/UDP에 있습니다. HTTP 콜백, LDAP/ASN.1 바이너리 연결(JNDI), DNS 쿼리 및 원시 TCP 연결을 감지합니다. 모든 엔드포인트는 `POST /<sink>`를 `input=<페이로드>`와 함께 수락하고 `{"output": "...", "error": "...|null", "time_ms": N}`을 반환합니다.
---
## 크레딧
페이로드는 [Grom Hacks](https://github.com/gromhacks)가 연구 및 개발했습니다. PayloadsAllTheThings, HackTricks, PortSwigger Web Security Academy 및 개별 연구자를 포함한 보안 연구 커뮤니티의 작업을 기반으로 구축되었습니다. 모든 페이로드는 실제 취약한 애플리케이션에 대해 검증되었습니다.
| 페이로드 | 카테고리 | 검증 기둥 |
|---|
| 4 | SQLi | error, math, timing, OOB (교차 방언 폴리글롯) |
| 4 | SSTI | error, math, timing, OOB (교차 엔진 폴리글롯) |
| 3 | OS Cmd | math, timing, OOB (교차 셸 폴리글롯) |
| 3 | Code Injection | math, timing, OOB (교차 언어) |
| 2 | XSS | math, OOB |
| 2 | XXE | 파일 읽기, OOB |
| 2 | SSRF | error, OOB |
| 1 | Path Traversal | 파일 읽기 |
| 2 | NoSQL | math, error |
| 1 | EL Injection | math |
| 1 | Prototype Pollution | math |
| 1 | CRLF/Header | math |
| 1 | Format String | error |
| 1 | SSI | math |
| 2 | LDAP Injection | error, math |
| 3 | XSLT Injection | error, math, OOB |
| 2 | Elasticsearch | error, math |
| 2 | Cypher/Neo4j | error, timing |
| 1 | CouchDB | error |
| 3 | Groovy | math, timing, OOB |
| 41 | Deserialization | 지원되는 경우 다중 기둥, 그 외는 error만 |
id=42와 JSESSIONID가 보여'에서 'by-category/sqli.txt + Java 역직렬화 + EL 인젝션 시도, math 기둥 관찰'로 한 번의 조회로 이동합니다.| 기준 | 페이로드 | 찾아볼 내용 | 사용 시점 |
|---|
| 오류 | 324 | 응답의 예외 텍스트, 스택 추적, 파서 오류 | 앱이 오류를 반영할 때 |
| 타이밍 | 227 | 응답 시간이 4.5초 이상 소요 | 블라인드 - 출력 없음, 오류 없음 |
| OOB | 209 | 콜백 서버로의 아웃바운드 HTTP/DNS/LDAP/TCP | 블라인드 + 비동기 - 타이밍 신뢰할 수 없음 |
| 수학 | 182 | 응답 본문의 1337 리터럴 (서버가 7*191 계산) | 출력이 반영되지만 오류 없음 |
| 반영 | 374 | 입력 값이 응답에 그대로 반환됨 | 파서 이상 징후 퍼징 |
| 파일 읽기 | (하위 집합) | 응답의 root: 또는 [extensions] 내용 | 경로 탐색, XXE 파일 읽기 |
| 카테고리 | 개수 | 기준 | 범위 |
|---|
| SQLi | 211 | 오류, 수학, 타이밍, OOB | MySQL, PostgreSQL, Oracle, MSSQL, SQLite, CockroachDB. UNION, 오류, 타이밍, OOB. 컨텍스트 이스케이프: ', ", ), )), */, 숫자. |
| SSTI | 206 | 오류, 수학, 타이밍, OOB | Jinja2, Mako, Tornado, EJS, Nunjucks, Pug, Twig, Smarty, ERB, Slim, Haml, Thymeleaf, Pebble, Freemarker, Velocity, Razor, Go template, Mustache, Liquid. 모두 언어 내장 함수 사용. |
| 역직렬화 | 232 | 오류, 수학, 타이밍, OOB | 31개 프레임워크 / 7개 언어. 모든 언어 네이티브 페이로드는 내장 함수만 사용 (셸 명령 없음). Python (pickle P0/P2/P4 via time.sleep/builtins.eval/urllib, YAML via time.sleep/builtins.eval, jsonpickle), PHP (unserialize), Node (node-serialize via 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). |
| OS 명령 주입 | 120 | 오류, 수학, 타이밍, OOB | Bash, CMD, PowerShell. 이스케이프: ;, |, ||, &&, $(), 백틱. IFS 우회, glob 우회, 16진수 인코딩. |
| 코드 주입 | 123 | 오류, 수학, 타이밍, OOB | Python, Node, PHP, Ruby, Perl, Lua, Java ScriptEngine, Groovy. 임포트 없는 CPU 스핀, 소켓 수준 OOB. |
| SSRF | 156 | 오류, 수학, 타이밍, OOB | 클라우드 메타데이터 (AWS/GCP/Azure), IP 우회, 프로토콜 스키마, DNS 리바인딩, 내부 서비스 프로브. |
| 경로 탐색 | 113 | 오류, 수학, 타이밍, OOB | Linux + Windows, 인코딩 우회, 널 바이트, PHP 래퍼, UNC, NTFS ADS, 8.3 짧은 이름. |
| XSS | 58 | 오류, 수학, OOB | 크로스 컨텍스트 폴리글롯 (20개 이상의 컨텍스트), 이벤트 핸들러, 필터 우회, DOM 클로버링, 뮤테이션 XSS, SVG, OOB. |
| 포맷 문자열 | 38 | 오류, 수학 | C/C++ (%s%n%x), Python ({0.__class__}), .NET ({0:X}). |
| NoSQL | 32 | 오류, 수학, 타이밍, OOB | MongoDB 연산자 주입, $where 타이밍, OOB, Redis 명령. |
| EL 주입 | 34 | 오류, 수학, 타이밍, OOB | SpEL, OGNL, MVEL, Unified EL. java.net.URL을 통한 OOB. |
| CRLF/헤더 | 17 | 오류, 수학, OOB | 응답 분할, 헤더 주입, Host 헤더를 통한 OOB. |
| 프로토타입 오염 | 12 | 오류, 수학 | __proto__, constructor.prototype, JSON 및 쿼리 문자열 변형. |
| XXE | 11 | 오류, 타이밍, OOB, 파일 읽기 | 외부 엔티티, XInclude, 파라미터 엔티티, Billion Laughs DoS. |
| LDAP 주입 | 35 | 오류, 수학, 타이밍, OOB | 필터 주입, 인증 우회, 와일드카드 타이밍, 리퍼럴 OOB. |
| Elasticsearch | 30 | 오류, 수학, 타이밍, OOB | Painless 스크립트 주입, query DSL, query_string 구문. |
| Cypher/Neo4j | 27 | 오류, 수학, 타이밍, OOB | Cypher 쿼리 주입, APOC sleep, LOAD CSV OOB. |
| CouchDB | 5 | 오류, 수학 | Mango 쿼리 주입, 연산자 주입, 인증 우회. |
| XSLT 주입 | 30 | 오류, 수학, OOB, 파일 읽기 | XPath 수학, document() SSRF, 파일 읽기, system-property() 정보 유출. |
| 폴리글롯/엣지 케이스 | 246 | 오류, 수학, 타이밍, OOB | 크로스 컨텍스트 폴리글롯 + 버퍼 오버플로우, 정수 경계, 타입 혼란, 널 바이트. |
| 인코딩 | 사용 사례 |
|---|
| URL-encoded | 표준 쿼리/폼 매개변수 |
| Double-URL-encoded | WAF 우회, 이중 디코드 취약점 |
| Base64 | API 본문, JWT, 직렬화된 매개변수 |
| JSON-safe | JSON 요청 본문 (이스케이프된 따옴표) |
| HTML entity | HTML 속성 주입 |
| Hex-escaped | 바이너리 프로토콜, 저수준 주입 |
| Unicode-escaped | 유니코드 정규화 우회 |
| 언어 | OOB 내장 함수 | 타이밍 내장 함수 |
|---|
| Python | urllib.request.urlopen() | time.sleep(5) |
| Java | java.net.URL.openStream() | Thread.sleep(5000) |
| Node | require('http').get() | Date.now() busy-wait loop |
| 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)은 OS와 PATH에 의존합니다. 내장 함수는 어디서나 작동합니다.
가능하면 임포트 없이. 임포트가 차단된 경우에도 CPU 스핀 타이밍이 작동합니다:
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().