# XSS via number format code with @ text placeholder bypasses htmlspecialchars in HTML writer ## 漏洞概述 在 PhpSpreadsheet 的 HTML 写入器中,当单元格包含自定义数字格式(如 `@` 文本占位符)时,格式化后的数据会与原始数据比较。如果两者相等,则跳过 `htmlspecialchars()` 转义,导致 XSS 漏洞。 ## 影响范围 - **受影响版本**: - >= 4.0.0, = 3.3.0, = 2.2.0, = 2.0.0, getActiveSheet(); // XSS payload with malicious number format $sheet->setCellValueExplicit('A1', '', DataType::TYPE_STRING); $sheet->getStyle('A1')->getNumberFormat()->setFormatCode('@ '); $writer = new Html($spreadsheet); $writer->save('output.html'); ``` 生成的 HTML 包含: ```html ``` XSS 载荷完全未转义。 ## 测试绕过格式 | 格式代码 | 结果 | 转义? | |----------|------|--------| | 常规(默认) | 原始值 | 是(安全) | | @ | + 值 | 否(XSS) | | @ (尾部空格) | 值 + | 否(XSS) | | x@ | x + 值 | 否(XSS) | 已在 PhpSpreadsheet 4.5.0 中测试并确认 XSS 在浏览器中执行。 ## 影响 任何接受用户上传的 XLSX 文件、使用 PhpSpreadsheet 的 HTML 写入器将其转换为 HTML、并向其他用户显示 HTML 的应用程序都易受存储型 XSS 攻击。攻击者在 XLSX 文件的单元格中嵌入载荷,并设置自定义数字格式。