收录:渗透
作者:Tim He

Abstract

CSV注入漏洞

CSV注入漏洞通常在导出或下载电子表格(包括但不限于xlsxxlscsv等)的接口。当导出或下载的文件内容用户可控时,攻击者可以构造恶意公式注入表格,用户下载打卡文件后,Excel调用功能执行命令或函数,从而达到攻击目的,造成敏感信息泄露或控制用户计算机等严重问题。

使用CSV等文件作为输入数据源时,攻击者可以在CSV文件中恶意注入数据,例如在字段中输入特殊字符,从而破坏CSV文件格式,导致应用程序无法正确解析CSV文件数据。当用Excel打开CSV文件,文件从CSV描述转变成原始的Excel格式,包括Excel提供的所有动态功能。在这个过程中,CSV中的所有Excel公式都会执行,攻击者可以利用这个漏洞执行SQL注入攻击,命令注入攻击。

CSV文件

  • CSV保留字(CRLF)可能导致CSV文件内容错乱。
  • CSV保留逗号做单元格分隔符,保留换行做行分隔符,保留双引号做转义符。
  • 空格,单引号在CSV文件中被认为是有效内容。
  • 若字段中包含双引号、逗号,需要先用双引号包裹内容,再对内容里的符号进行转义。

测试思路

  1. 对涉及文档导出、下载功能的外部接口,自外向内进行测试,关注下载文件的内容格式是否为“文本(text)”, 而非“常规(general)”格式。
  2. 分析导出文件字段是否用户可控,如果用户不可控,不存在csv注入问题
  3. 如果用户可控,检查字符过滤是否全面。如对以=+-"@开头的内容是否进行处理,处理方式是否考虑全面。尝试注入payload到表格,本地打开表格是否有安全提示。如果注入命令被执行则有CSV注入漏洞
  4. 常用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)
    ...

防御措施

  1. 禁止单元格内容直接以=,+,-,@开头,如需以这些特殊字符开头,要进行转义处理。
  2. 设置单元格式为文本格式,对CSV不生效。 ### 特殊场景
  3. 存入数据库时保持原数据不变,不删除空格和TAB, 如\r\n=+cmd|' /C calc'!A0,去掉后变成=+cmd|' /C calc'!A0
  4. 单元格内容只允许字母,数字,下划线,不存在注入风险。
  5. 单元格内容允许特殊字符,且不存在=,+,-,@等字符开头,使用正则表达式[^=+-@].+进行校验。
  6. 在以=,+,-,@等字符开头的内容,必须采用TAB键+双引号的方式防命令或函数注入。
  7. =,+,-,@等字符开头添加任意个\0,仍存在注入风险,需清除\0, 然后继续处理。
  8. CSV含有,\r\n特殊字符
    • ,\r\n属于CSV文件单元格换行分隔符,这些字符分割后跟=,+,-,@(等效于单元格内容以这些字符开头),有注入风险。如果需要使用这些字符,可使用"(双引号限制符)限制,如",=123"
  9. "用于限制单元格内容。如1,"test",2,第二个单元格内容实际为test, 也能被命令注入。如果必须使用双引号,要用两个双引号转码""且整个单元格都要用"进行限制。如"""=12呈现内容为"=12