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
。