Searchlight Cyber wp2shell WordPress RCE 通过 GPT‑5.6 Sol Ultra 发现,仅耗费 $25
Searchlight Cyber wp2shell WordPress RCE 通过 GPT‑5.6 Sol Ultra 发现,仅耗费 $25
TL;DR
Searchlight Cyber 利用 GPT‑5.6 Sol Ultra 找到了 WordPress Batch API 中的一个预认证 SQL 注入漏洞,并通过缓存投毒、嵌入滥用以及恶意的 customize_changeset 链接,实现了在默认 WordPress 安装上的远程代码执行(RCE)——整个过程仅消耗约 $25 的计算资源。该利用展示了为何漏洞交易商愿意为 WordPress RCE 支付 $500 k。
开始搜索的提示
研究员向 GPT‑5.6 Sol Ultra 提供了一个基于 OpenAI Cycle Double Cover(CDC)提示改编的六小时、四代理提示。该提示指示模型:
- 将 WordPress 源代码树视为封闭代码库(无互联网、无变更日志)。
- 探索广泛的攻击面(输入解析、序列化、竞争条件等)。
- 积极生成最多四个代理,根据进度动态重新分配工作量。
- 产出一个完整的预认证 RCE 链,能够读取典型 MySQL 后端部署中的
/flag。
研究员将最新的稳定版 WordPress 克隆到 wordpress‑ctf/main/,并将 third_party/ 置空,以迫使模型仅使用核心代码进行工作。
核心漏洞:Batch API 验证不同步
WordPress 的 REST Batch API 在第一轮循环中验证所有子请求,然后在第二轮循环中执行它们。验证循环会填充两个平行数组,$matches(处理器引用)和 $validation(验证结果)。当请求因 is_wp_error($single_request) 失败时,代码 继续 执行,却没有向 $matches 中推入对应条目:
if ( is_wp_error( $single_request ) ) {
$has_error = true;
$validation[] = $single_request;
continue; // <-- $matches not updated
}
这种 off‑by‑one 偏移导致索引 i 处的验证结果可能被应用到索引 i+1 处的处理器。攻击者因此可以验证一个无害请求,却用另一个不同且易受攻击的请求的处理器来执行它。
第一个利用原语:预认证 SQL 注入
GET /wp/v2/posts 接口使用 author__not_in 参数构造 SQL WHERE 子句。当该参数是 标量字符串 时,WordPress 会直接插入而不进行转义:
$author__not_in = implode(',', (array) $query_vars['author__not_in']);
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
通常 REST schema 会强制 author__not_in 为数组,并对每个元素使用 absint 进行清理。利用 Batch API 的不同步漏洞,攻击者可以在 不同请求的验证阶段 提交标量字符串(例如 "0) OR 1=1 -- "),而 执行阶段 则在 GET /wp/v2/posts 处理器上进行,从而产生经典的 SQL 注入并返回所有行。
负载示例(递归批量调用)
POST /wp-json/batch/v1
{
"requests": [
{"method":"POST","path":"http://:"},
{"method":"POST","path":"/wp/v2/posts","body":{
"requests":[
{"method":"GET","path":"http://:"},
{"method":"DELETE","path":"/wp/v2/posts/1","body":{"author_exclude":"0) OR 1=1 -- "}},
{"method":"GET","path":"/wp/v2/posts"}
]
}},
{"method":"POST","path":"/batch/v1"}
]
}
外层请求使 HTTP 方法验证不同步;内层请求使 author_exclude 参数不同步,从而实现注入。
从 SQLi 到 RCE:链式利用
研究员让 GPT‑5.6 在 SQL 注入之后继续探索,生成了一个多阶段链:
- 缓存投毒 – WordPress 为每个请求缓存
WP_Post对象。通过 SQL 注入返回精心构造的行,攻击者可以控制这些帖子在内存中的表示,包括post_content。 - 嵌入滥用 – 嵌入本地帖子(
[embed]/?p=10[/embed])会在数据库中创建一条oembed_cache记录。攻击者可以伪造任意post_type与post_content的记录。 - Customize Changeset –
customize_changeset帖子存储一个 JSON diff,执行时会使用负载中嵌入的user_id。将 changeset 的user_id强制为1(管理员),WordPress 将临时以管理员权限运行。 - 父循环 Gadget – WordPress 检测帖子父层级中的循环,一旦发现会调用
wp_update_post(['ID'=>X,'post_parent'=>0])。此调用 不会 覆盖post_content,从而让攻击者控制的内容得以保留。 - Hook 重放 – 循环 gadget 可触发
parse_request动作("{$new_status}_{$post_type}")。调用do_action('parse_request', …)会以假定的管理员身份重新执行整个 Batch API 请求。 - 创建管理员账户 – 在第二次执行时,之前失败的创建新管理员用户的请求因拥有管理员权限而成功。
- 后门插件上传 – 获得管理员账户后,攻击者上传恶意插件 ZIP,实现服务器上的持久代码执行。
成本、时间线与影响
- 计算成本: $25(约占 $200 周订阅费用的 50%)。
- 完整链路耗时: 超过 10 小时的模型运行时间,加上一天的人为分析。
- 影响范围: WordPress 为超过 5 亿站点提供动力;在默认配置下的预认证 RCE 是一种关键的高危漏洞。
- 市场价值: 漏洞交易商据称为可靠的 WordPress RCE 支付 $500 k,这解释了标题中的夸张说法。
社区反响(Hacker News 评论)
- 有评论者质疑 $500 k 的数字,认为文章可能夸大了经纪人的付款。
"没有证据表明已经或会为此类漏洞支付 50 万美元。" – Zsfe510asG
- 另一些人赞赏技术深度,将其与过去的 AI 辅助利用相比较。
"这篇写得太棒了!… 大模型让门槛平等。" – cadamsdotcom
- 还有人担心模型防护和 AI 生成利用的伦理问题。
"我很惊讶 GPT‑5.6 没因防护而拦截这个提示。" – raesene9
- 怀疑者要求确认漏洞的公开披露与修补状态。
"这是真的吗?我没有看到他们向 WP 报告或补丁的任何信息。" – tantalor
为什么这很重要
- 概念验证: 该链路证明最先进的 LLM 能以极低的计算成本发现全新的预认证 WordPress RCE。
- 经济激励: $500 k 的赏金数字显示了对这类零日的强劲市场需求,促使防御者和攻击者都采用 AI 辅助研究。
- 防御意义: 传统的静态分析未能捕获 Batch API 的不同步漏洞;防御方需要引入 AI 驱动的代码理解工具来发现类似的逻辑缺陷。
- 安全研究的未来: 随着 LLM 能力提升,瓶颈从漏洞发现转向提示工程、利用链构建与验证——这些技能将主导下一代安全团队。
缓解措施(截至本文发布时):
- 将 WordPress 更新至已修复 Batch API 验证 bug 的最新版本。
- 如无必要,禁用 Batch API(
/wp-json/batch/v1)。 - 为 REST API 加强身份验证与速率限制。
- 监控异常的
oembed_cache记录或customize_changeset创建行为。 - 使用 AI 辅助的静态分析工具,检测未来代码中的验证/执行不匹配。
完整技术细节,包括精确负载和 GitHub 风格的 PoC,已在上文链接的 Searchlight Cyber 研究页面上公开。