CVE-2026-9860CVE-2026-9860是WordPress插件"Offload, AI & Optimize with Cloudflare Images"(cf-images)中存在的一个高危远程代码执行(RCE)漏洞,影响所有1.10.2及以下版本。该漏洞的CVSS评分为8.8,属于高危级别。
该漏洞的核心问题在于插件的cf_images_do_setup AJAX处理器对权限的校验不足,仅要求调用者具备upload_files能力(即Author级别及以上用户),而非应有的manage_options管理员权限。该AJAX处理器负责将Cloudflare账户配置写入wp-config.php文件,在写入过程中使用了sanitize_text_field()函数对用户输入进行过滤,但该函数无法过滤单引号。同时,filter_input(INPUT_POST)绕过了WordPress的wp_magic_quotes()转义机制,使得攻击者可以通过在account-id或api-key参数中注入单引号,逃逸出PHP define()语句中的单引号字符串字面量,从而注入任意PHP代码。
此外,cf-images-nonce nonce值通过CFImages JavaScript对象暴露在wp-admin/upload.php页面,所有具备上传权限的用户(即Author及以上)均可获取该nonce,从而满足AJAX处理器的nonce验证检查,进一步降低了攻击门槛。攻击者只需拥有Author级别的WordPress账户,即可利用此漏洞在服务器上执行任意代码,完全控制受影响的WordPress网站。
该漏洞的技术原理涉及多个层面的缺陷叠加:
1. **权限校验缺陷**:cf_images_do_setup AJAX处理器在处理用户请求时,仅检查调用者是否具备upload_files能力(Author+),而正确做法应该是要求manage_options能力(仅管理员)。这使得低权限用户也能调用该处理器。
2. **Nonce泄露**:执行写配置操作所需的cf-images-nonce nonce值通过CFImages JavaScript全局对象暴露在wp-admin/upload.php页面。由于所有Author级别及以上用户均可访问该页面,因此任何具备上传权限的用户都可以获取有效的nonce值。
3. **输入过滤绕过**:插件使用sanitize_text_field()对用户输入的account-id和api-key参数进行过滤,但该函数不会去除单引号字符。同时,代码使用filter_input(INPUT_POST)获取POST参数,绕过了WordPress核心的wp_magic_quotes()自动转义机制。
4. **PHP代码注入**:write_config()方法将用户输入直接拼接到PHP的define()语句中写入wp-config.php。由于define语句使用单引号包裹字符串值,攻击者可以通过在参数中注入单引号(如account-id=abc'];phpinfo();//),提前闭合字符串字面量,然后注入任意PHP代码。
利用方式:攻击者以Author身份登录WordPress后台,从wp-admin/upload.php页面获取cf-images-nonce值,然后构造包含恶意PHP代码的POST请求发送到admin-ajax.php,调用cf_images_do_setup动作,在account-id参数中注入如');system($_GET["cmd"]);//的payload,最终在wp-config.php中写入恶意PHP代码,实现远程代码执行。