现象
当用户将SVG格式的文件上传至FastGPT的存储桶后,可直接访问该文件的公开存储链接并被浏览器渲染,存在存储型XSS漏洞,攻击者可通过上传恶意SVG文件在访问者浏览器中执行任意脚本代码。
可能原因
当前FastGPT的文件上传安全校验仅通过文件后缀或MIME类型判断文件安全性,未对SVG文件的实际内容进行安全清洗。由于SVG格式本身支持内嵌脚本代码,未经过滤的恶意SVG文件会被直接存储并在访问时触发XSS攻击。
排查步骤
- 准备包含可执行脚本的测试SVG文件,上传至FastGPT的存储桶中
- 复制该SVG文件的公开存储链接,在浏览器中打开该链接,观察是否会自动执行内嵌的脚本内容
- 核对FastGPT的文件上传处理逻辑,确认是否仅依赖文件后缀或MIME类型做安全校验,未对SVG文件的实际内容进行过滤(需按实际环境确认具体实现)
解决与验证
解决方法
修改FastGPT的文件上传处理流程,停止仅通过文件后缀或MIME类型判断文件安全性,改为使用专门的XML/HTML解析库对上传的SVG文件内容进行解析与安全过滤,移除或禁用其中的可执行脚本、事件属性等危险内容。
验证步骤
- 上传包含恶意脚本的SVG文件至存储桶
- 访问该文件的存储链接,确认内嵌的脚本无法被浏览器执行,页面仅展示静态的SVG图像内容
- 上传普通合法的SVG文件,确认可正常渲染并访问,原有文件存储功能未受影响
来源:https://github.com/labring/FastGPT/issues/6248