
CVE-2026-27621 - TypiCMS Core has Stored Cross-Site Scripting (XSS) via SVG File Upload
| 字段 | 详细信息 |
|---|---|
| CVE ID | CVE-2026-27621 |
| 严重性 | 中危 |
| 安全通告 | 查看通告 |
| 发现者 | Lukasz Rybak |
TypiCMS 的文件上传模块存在存储型跨站脚本攻击(XSS)漏洞。该应用允许拥有文件上传权限的用户上传 SVG 文件。虽然存在 MIME 类型验证,但未对 SVG 文件内容进行净化。攻击者可上传特制的 SVG 文件,其中包含恶意 JavaScript 代码。当其他用户(如管理员)通过应用程序查看或访问此文件时,脚本会在其浏览器中执行,导致该用户会话被劫持。
SVG 解析逻辑中的一个错误加剧了此问题:若上传的 SVG 不含 viewBox 属性,会导致服务器返回 500 错误。但这并不能缓解 XSS 漏洞,因为攻击者可以轻松地在恶意负载中加入有效的 viewBox 属性。
TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php 和 TypiCMS\Modules\Core\Services\FileUploader.php此漏洞源于两个主要方面:
FileFormRequest 明确将 svg 列入允许上传的 MIME 类型白名单。FileUploader 服务将 SVG 文件保存到服务器时,未解析并净化其内容以移除潜在恶意元素(如 <script> 标签或 on* 事件处理程序)。当默认文件系统磁盘设置为 public 时,上传的 SVG 文件会存储在公开可访问的目录中,使得攻击者通过直接 URL 访问文件并触发 XSS 负载变得轻而易举。
创建恶意 SVG 文件:
创建一个名为 malicious.svg 的文件,内容如下。其中包含 viewBox 属性以绕过应用解析错误。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<script>
// 简单的 PoC 演示漏洞
alert('TypiCMS 中的 XSS!你的会话 Cookie 是:' + document.cookie);
</script>
<text x="10" y="50">如果你看到此文本,说明脚本已执行。</text>
</svg>
上传恶意文件:
/admin/files)。malicious.svg 文件。应用将接受该文件并保存。
http://<your-site>/storage/files/malicious.svg。成功利用此漏洞可使攻击者在受害者浏览器上下文中执行任意 JavaScript。尽管会话 Cookie 上设置了 HttpOnly 标志阻止通过 document.cookie 直接窃取会话 ID,但攻击者仍可通过代表受害者执行操作来实现账户完全劫持。
影响包括:
通过操作伪造实现账户接管: 攻击者的脚本可从受害者浏览器向应用 API 发送经过身份验证的请求。这使攻击者能执行受害者有权执行的任何操作,例如:
敏感信息泄露: 脚本可读取受害者在管理面板中查看的任何页面内容。这包括用户列表(包含姓名和电子邮件)、私有应用设置及其他敏感数据,随后可将其外传至攻击者控制的服务器。
钓鱼和社会工程: 脚本可操纵管理面板 UI 显示伪造的登录表单,诱骗用户重新输入凭据,或将用户重定向至恶意网站。
按键记录: 脚本可捕获受害者在被攻破页面上输入的任何信息。
由于攻击者可以以已认证管理员的身份执行任何操作,此漏洞实际上会导致完全应用沦陷,即使无法直接访问会话 Cookie。风险等级为高。
建议采用纵深防御方法来缓解此漏洞。
主要修复:净化 SVG 内容:
最稳健的解决方案是在上传时净化 SVG 文件。保存文件前,应解析文件以移除所有危险元素,包括 <script>、<style>、<foreignObject> 标签以及所有 on* 事件属性。这可以通过专用的 SVG 净化库实现。
次要修复:禁用 SVG 上传:
如果 SVG 上传不是应用的关键功能,最简单且最安全的解决方案是完全禁用它。可以通过从 TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php 中允许的 MIME 类型列表中移除 'svg' 来实现。
// 在 FileFormRequest.php 中
// 之前:
$fileRule = 'mimes:jpeg,gif,png,...,svg,...|max:...';
// 之后:
$fileRule = 'mimes:jpeg,gif,png,...,pdf,...|max:...'; // 移除了 'svg'
加固 - 内容安全策略(CSP): 为应用实施严格的内容安全策略(CSP)头部。配置良好的 CSP 可阻止内联脚本执行,从而缓解此 XSS 漏洞的影响。
加固 - 从独立域名提供用户内容: 将所有用户上传的文件托管在独立的无 Cookie 域名上。这是一种高效的隔离用户生成内容与应用主体的安全措施,可阻止脚本访问会话 Cookie 或与应用 DOM 交互。
此 CVE 已依照协调漏洞披露实践进行负责任的披露。此处提供的信息仅供教育及防御用途。