Abstract
CSV注入漏洞
CSV注入漏洞通常在导出或下载电子表格(包括但不限于xlsx、xls、csv等)的接口。当导出或下载的文件内容用户可控时,攻击者可以构造恶意公式注入表格,用户下载打卡文件后,Excel调用功能执行命令或函数,从而达到攻击目的,造成敏感信息泄露或控制用户计算机等严重问题。
使用CSV等文件作为输入数据源时,攻击者可以在CSV文件中恶意注入数据,例如在字段中输入特殊字符,从而破坏CSV文件格式,导致应用程序无法正确解析CSV文件数据。当用Excel打开CSV文件,文件从CSV描述转变成原始的Excel格式,包括Excel提供的所有动态功能。在这个过程中,CSV中的所有Excel公式都会执行,攻击者可以利用这个漏洞执行SQL注入攻击,命令注入攻击。
CSV文件
- CSV保留字(CRLF)可能导致CSV文件内容错乱。
- CSV保留逗号做单元格分隔符,保留换行做行分隔符,保留双引号做转义符。
- 空格,单引号在CSV文件中被认为是有效内容。
- 若字段中包含双引号、逗号,需要先用双引号包裹内容,再对内容里的符号进行转义。
测试思路
- 对涉及文档导出、下载功能的外部接口,自外向内进行测试,关注下载文件的内容格式是否为“文本(text)”,
而非“常规(general)”格式。

- 分析导出文件字段是否用户可控,如果用户不可控,不存在csv注入问题
- 如果用户可控,检查字符过滤是否全面。如对以
=+-"@开头的内容是否进行处理,处理方式是否考虑全面。尝试注入payload到表格,本地打开表格是否有安全提示。如果注入命令被执行则有CSV注入漏洞 - 常用payload(需英文全角、半角字符进行检查):
1
2
3
4
5
6
7
8@SUM(cmd|' /C calc'!A2)
+cmd|' /C calc'!A2
",cmd|' /C calc'!A2
\",cmd|' /C calc'!A2
=cmd|' /C calc'!A2
;=cmd|' /C calc'!A2
HYPERLINK(A1,B2)
...
防御措施
- 禁止单元格内容直接以
=,+,-,@开头,如需以这些特殊字符开头,要进行转义处理。 - 设置单元格式为文本格式,对CSV不生效。 ### 特殊场景
- 存入数据库时保持原数据不变,不删除空格和TAB,
如
\r\n=+cmd|' /C calc'!A0,去掉后变成=+cmd|' /C calc'!A0 - 单元格内容只允许字母,数字,下划线,不存在注入风险。
- 单元格内容允许特殊字符,且不存在
=,+,-,@等字符开头,使用正则表达式[^=+-@].+进行校验。 - 在以
=,+,-,@等字符开头的内容,必须采用TAB键+双引号的方式防命令或函数注入。 - 在
=,+,-,@等字符开头添加任意个\0,仍存在注入风险,需清除\0, 然后继续处理。 - CSV含有
,\r\n特殊字符,\r\n属于CSV文件单元格换行分隔符,这些字符分割后跟=,+,-,@(等效于单元格内容以这些字符开头),有注入风险。如果需要使用这些字符,可使用"(双引号限制符)限制,如",=123"
"用于限制单元格内容。如1,"test",2,第二个单元格内容实际为test, 也能被命令注入。如果必须使用双引号,要用两个双引号转码""且整个单元格都要用"进行限制。如"""=12呈现内容为"=12。
