
🔥 XSS2Shell — CVE-2026-64638 스캐너 및 PoC 툴킷
5억 개 이상의 웹사이트에 영향을 미치는 WordPress 사전 인증 XSS-to-RCE 체인을 위한 동작 우선(behavior-first) 대량 스캐너이자 증거 등급 PoC 생성기입니다.
탐지 전용. 무기화 없음. 버그 바운티 프로그램과 블루 팀을 위해 제작되었습니다.
이 취약점이란? • 빠른 시작 • Shodan Dorks • 사용법 • 결정 매트릭스 • 탐지 • FAQ
스캔 전에 인터넷에서 잠재적으로 취약한 WordPress 인스턴스를 찾아보세요:
http.component:"wordpress" -http.title:"Just a moment"
자동화된 요청을 차단하거나 챌린지를 요구하는 Cloudflare "I'm Under Attack" 모드 / 봇 보호 페이지를 제외하면서 WordPress 사이트를 찾습니다.
http.component:"wordpress" http.title:"Log In"
WordPress 로그인 페이지만 반환합니다 — CVE-2026-64638의 정확한 공격 표면입니다.
http.component:"wordpress" "wp-content" "?ver=7.0" -"?ver=7.0.3"
에셋 버전 핑거프린팅을 통해 7.0.3 패치가 없는 WordPress 7.0.x 인스턴스를 식별합니다.
http.component:"wordpress" http.html:"wp-login.php"
wp-login.php에 접근 가능하지만 현재 페이지가 아닐 수 있는 사이트를 포착합니다 — 더 넓은 범위를 커버합니다.
http.component:"wordpress" -http.title:"Just a moment" -http.title:"Attention Required" -org:"Cloudflare"
대부분의 Cloudflare 프런트 대상(target)을 걸러내는 공격적인 필터입니다. --active로 대규모 스캔 시 사용하세요 — Cloudflare가 프로브 요청을 속도 제한(rate-limit)하거나 차단합니다.
팁:
shodan download로 Shodan 결과를 내보내고 호스트 이름을xss2shell_mass.py -i로 직접 파이프하세요.
2026년 8월 7일, pwn.ai가 CVE-2026-64638(XSS2Shell)을 공개했습니다 — 이는 WordPress Core의 치명적인 사전 인증 크로스사이트 스크립팅(XSS) 취약점으로, 서버에서 **원격 코드 실행(RCE)**까지 이어지는 공격 체인입니다. [인용:pwn.ai 블로그]
이 버그는 PHP의 strip_tags()와 WordPress의 wp_kses_post() 사이의 파서 불일치를 악용합니다:
strip_tags() 는 < 바로 뒤에 문자가 오는 형태를 HTML 태그로 식별합니다. < area id=...>(공백 포함)는 텍스트로 처리됩니다 — 살아남습니다.wp_kses_post()(KSES)는 < area를 유효한 <area> 요소로 인식합니다 — 그리고 <area>는 KSES에서 **허용 목록(allowlist)**에 등록되어 있습니다. [인용:pwn.ai 블로그]특수하게 조작된 사용자 이름 < area id=ajaxurl href=/?rest_route=/&_method=GET&_jsonp=alert>...으로 한 번의 실패한 로그인을 시도하면 두 살균기를 모두 우회하고, 로그인 페이지에서 실제 DOM으로 렌더링되며, DOM 클로버링을 통해 WordPress 자체 user-profile.js 스크립트를 가로채고, WordPress 오리진에서 alert()를 실행합니다 — 클릭 0회, 인증 불필요, 쿠키 불필요. [인용:pwn.ai 블로그]
로그인한 관리자 권한으로 승격된다면? 동일한 프리미티브가 Same Origin Method Execution(SOME)을 통해 애플리케이션 비밀번호를 탈취하고, 악성 플러그인을 업로드하며, www-data 권한으로 PHP를 실행합니다. [인용:pwn.ai 블로그] [인용:hadrian.io 블로그]
영향을 받는 버전: WordPress 6.4 ~ 7.0.2 — 7.0.3에서 패치, 4.7+ 버전으로 백포트됨.
영향 규모: 공개 시점 기준 약 5억 개 웹사이트. [인용:pwn.ai 블로그]
| 자료 | 링크 |
|---|---|
| 원본 공개 (pwn.ai) | pwn.ai/blog/xss2shell |
| Hadrian 기술 분석 | hadrian.io/blog/wordpress-xss2shell |
| WordPress 권고 (GHSA) | GHSA-52p2-r8wf-jcrf |
| SOME 공격 연구 (2022) | pwn.ai/blog/bypass-csp-using-wordpress |
| WordPress 7.0.3 릴리스 | wordpress.org/news/2026/08/wordpress-7-0-3-release |
이것은 탐지 전용 툴킷입니다. 취약점을 무기화하지 않으며, 보안 연구자, 버그 바운티 헌터, 블루 팀에게 다음을 수행하는 데 필요한 모든 것을 제공합니다:
"버전 문자열은 코드의 패치 수준이 어떠해야 하는지를 알려줍니다.
버그가 실제로 발동하는지는 로그인 페이지의 살균기 동작만이 말해줍니다."
관리형 호스트는 버전 문자열을 올리지 않고 보안 패치를 조용히 백포트합니다. 로그인 강화 플러그인은 오류 메시지를 완전히 대체하여 패치되지 않은 버전에서도 반사 채널을 차단합니다. 버전 전용 스캐너는 오탐과 미탐을 모두 발생시킵니다. 이 스캐너는 단일 무해 프로브를 전송하고 실제 살균기 동작을 분류합니다.
git clone https://github.com/jakestone/xss2shell.git
cd xss2shell
pip install -r requirements.txt
# Passive — no probes sent to target, version + endpoint fingerprinting only
python3 xss2shell_mass.py -i domains.txt -o results
# Active — sends ONE benign failed-login per host (authorized assets only!)
python3 xss2shell_mass.py -i domains.txt -o results --active --workers 80
# Single target
python3 make_poc.py --target https://blog.example.com
# Batch from scanner output
python3 make_poc.py --from-results results.csv -o pocs/
동영상을 녹화하면서 생성된 .poc.html을 브라우저에서 열어보세요 → alert()가 실행되면 사전 인증 XSS 증거가 확보된 것입니다.
xss2shell_mass.py)usage: xss2shell_mass.py [-h] -i INPUT [-o OUTPUT]
[--active] [--workers WORKERS]
[--timeout TIMEOUT] [--quiet]
| 플래그 | 설명 |
|---|---|
-i, --input | 줄당 하나의 호스트가 포함된 파일 (도메인 또는 전체 URL) |
-o, --output | 출력 파일의 기본 경로 (.csv + .json 생성) |
--active | 동작 프로브 활성화 — 호스트당 실패한 로그인 1회 |
--workers | 스레드 풀 크기 (기본값: 50, 연결 상태가 좋으면 최대 ~200) |
--timeout | HTTP 타임아웃(초) (기본값: 10) |
--quiet | confirmed_vulnerable, vulnerable, likely_vulnerable만 출력 |
?ver= 파라미터, wp-content 참조)user-profile.js 가젯 등록 여부, 코어 에셋 버전/?rest_route=/&_method=GET&_jsonp=<random>에 대한 무해한 GET 요청 — JSONP 경로가 열려 있나?--active 플래그)사용자 이름 < area id=<RANDOM> href=/x2s>로 실패한 로그인 1회를 전송하고 HTML 응답을 분류합니다:
bypass — 마커가 포함된 실제 <area> 요소가 살아남음 → strip_tags/KSES 불일치 확인됨escaped — 마커는 존재하지만 엔티티 인코딩됨 → 패치 또는 강화 조치 존재stripped — 기본 WP 오류 표시, 태그 제거됨 → acevomod 또는 패치됨closed — 사용자 이름 반사가 전혀 없음 → 로그인 강화 플러그인 설치됨make_poc.py)usage: make_poc.py [-h] [--target TARGET] [--from-results FROM_RESULTS]
[-o OUTDIR]
각 대상에 대해 pwn.ai가 공개한 PoC 페이지를 생성합니다 — 패치되지 않은 WordPress에서 alert()를 트리거하는 바로 그 HTML 폼입니다. 세 가지 페이로드 변형이 주석으로 포함되어 있습니다:
| 변형 | href 값 | 사용 시기 |
|---|---|---|
| 기본(Default) | /?rest_route=/&_method=GET&_jsonp=alert | 표준 WordPress |
| 엔벨로프(Envelope) | /?rest_route=/&_method=GET&_envelope=1&_jsonp=alert | REST가 401을 반환할 때 (200으로 래핑됨) |
| WAF 피벗(Pivot) | /wp-json/wp/v2/statuses/publish?_jsonp=alert&_method=GET | ?rest_route=가 WAF에 차단될 때 |
스캐너의 결정 엔진은 버전 분류(WordPress.org의 stable-check API 기반)와 동작 증거를 결합하여 10가지의 서로 다른 판정을 내립니다: