CVE-2026-40296PhpSpreadsheet是一个纯PHP库,用于读写电子表格文件。其HTML写入器在单元格的格式化值与原始值不同时,会跳过htmlspecialchars转义。当单元格包含带有文本占位符“@”的自定义数字格式时,格式化程序会用单元格值替换“@”并添加额外字符,导致格式化值与原始值不同,从而完全绕过HTML转义。攻击者若能控制上传电子表格的单元格值和数字格式,且该表格被转换为HTML并展示给其他用户,即可实现存储型跨站脚本攻击。
该漏洞源于PhpSpreadsheet的HTML写入器逻辑缺陷。当程序判断单元格的格式化值与原始值不一致时,会错误地跳过HTML特殊字符转义。漏洞触发条件是单元格使用了包含文本占位符“@”的自定义数字格式(例如“. @”、“@ ”)。在此场景下,格式化程序将“@”替换为单元格实际值,并保留格式中的额外字符,导致最终输出包含未经过滤的原始数据。如果应用程序允许用户上传Excel文件,并利用PhpSpreadsheet将其渲染为HTML供其他用户查看,攻击者可通过构造恶意单元格注入JavaScript代码。受害者浏览生成的HTML页面时,恶意脚本将在其浏览器上下文中执行,导致存储型XSS。