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 注入之后继续探索,生成了一个多阶段链:

  1. 缓存投毒 – WordPress 为每个请求缓存 WP_Post 对象。通过 SQL 注入返回精心构造的行,攻击者可以控制这些帖子在内存中的表示,包括 post_content
  2. 嵌入滥用 – 嵌入本地帖子([embed]/?p=10[/embed])会在数据库中创建一条 oembed_cache 记录。攻击者可以伪造任意 post_typepost_content 的记录。
  3. Customize Changesetcustomize_changeset 帖子存储一个 JSON diff,执行时会使用负载中嵌入的 user_id。将 changeset 的 user_id 强制为 1(管理员),WordPress 将临时以管理员权限运行。
  4. 父循环 Gadget – WordPress 检测帖子父层级中的循环,一旦发现会调用 wp_update_post(['ID'=>X,'post_parent'=>0])。此调用 不会 覆盖 post_content,从而让攻击者控制的内容得以保留。
  5. Hook 重放 – 循环 gadget 可触发 parse_request 动作("{$new_status}_{$post_type}")。调用 do_action('parse_request', …) 会以假定的管理员身份重新执行整个 Batch API 请求。
  6. 创建管理员账户 – 在第二次执行时,之前失败的创建新管理员用户的请求因拥有管理员权限而成功。
  7. 后门插件上传 – 获得管理员账户后,攻击者上传恶意插件 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 能力提升,瓶颈从漏洞发现转向提示工程、利用链构建与验证——这些技能将主导下一代安全团队。

缓解措施(截至本文发布时):

  1. 将 WordPress 更新至已修复 Batch API 验证 bug 的最新版本。
  2. 如无必要,禁用 Batch API(/wp-json/batch/v1)。
  3. 为 REST API 加强身份验证与速率限制。
  4. 监控异常的 oembed_cache 记录或 customize_changeset 创建行为。
  5. 使用 AI 辅助的静态分析工具,检测未来代码中的验证/执行不匹配。

完整技术细节,包括精确负载和 GitHub 风格的 PoC,已在上文链接的 Searchlight Cyber 研究页面上公开。

Sources