赞
踩
本系列文章主旨在于介绍一些漏洞类型产生的基本原理,探索最基础的解决问题的措施,不排除有些语言或者系统提供的安全的API可以更好地更直接地解决问题,也不排除可以严格地输入验证来解决。
关于CSV注入,可能平时关注的人比较少,不过,只要有以csv文件格式导出数据,它就可能存在。很多系统都会导出csv,将数据用于分析。
首先介绍一下CSV的含义,CSV就是 comma-separated-values,就是使用逗号分开的一串值,当使用excel打开时,逗号隔开的内容会被展开为对应行和列的一个cell的值。
例如:下面是一个含有三行内容的csv文件
使用Excel打开,会显示为:
当CSV的内容添加了注册日期,修改为一下内容是:
使用Excel打开,
=TODAY() 没有被显示,而是显示计算出来的一串数值,说明注入的函数被执行。也可以注入去执行一些命令,例如:当输入的内容是:=calc|a!z,打开CSV文件,就会显示如下对话框,
同样如果在CSV中通过函数注入LINK,如下:
使用EXCEL打开此文件,显示如下:
Click Me 一栏里,会显示一个连接,使用鼠标点击,就会提示框选择使用什么应用程序打开。由于是从公司的网站导出的数据,所以,用户一般都会信任此CSV,也就会点解确定按钮去访问。
通过以上几个例子可以看出,在导出CSV时,如果导出的内容中有特殊字符,可能会注入一些命令或者链接等。
CSV注入:也称为公式注入,是在将内容已csv的方式导出到一个文件时,由于特殊字符经过任何处理,直接输出到csv文件导致的注入,可以导致执行任意命令。由于使用者从系统导出数据,他是信任这个文件的,所以,当他打开这个导出的文件时,就不会怀疑会有什么恶意的内容或者操作,即使有时弹出警告框,使用者也会直接点击确定继续,导致CSV很容易被利用。
最根本导致CSV注入的是一些特殊字符有特殊的含义,例如 以+, -, =, @ 以及"等开头的字符串。
如果需要输入一个公式到CSV中,需要注意了,在上例子中有:=SUM(1,2),计算两个数值之和,也可能需要计算两列之和,例如:=SUM(A1,B1),这时,急需要将此公式使用双引号括起来,如:“=SUM(A1,B1)”。由此,有会引起另外一个问题就是,如果我的字符串中又含有" 该怎么处理? (是不是感觉上了连环套的计谋), 此时,双引号的转义方式是使用两个双引号(是否似曾相识的感觉?对了,此处和Windows命令行注入章节的双引号转义一样),例如:AAAA"BBBB转义之后为AAAA""BBBB。
如果字符串中是以 +, -, =, @ 开头等字符该如何处理呢?
在服务器端输出的时候,可以考虑在输出时,在字符串前面加一个单引号(')或者空格字符,例如输出的内容就是=SUM(1,2), 输出到CSV时把内容改为“ =SUM(1,2)”,就可以显示为=SUM(1,2),不过,前面多了一个空格。
不管是添加单引号也好,还是添加一个空格也好,都会修改了CELL中的值,会影响数据的完整性。这个需要在使用的地方进行反向处理,去掉开头的空格或者单引号。
如果有的字符已经以单引号或者空格开头了,该如何处理? 答案是:统一处理,即使已经有了,还需要再添加一个,这样在使用的地方才能知道开头的字符是后来添加的还是原本字符串本身的。
在下面的表格列出了对CSV注入的特殊字符处理:
漏洞类型 | 特殊字符 | 处理方式 | 例子 |
CSV注入 | 以 + - = @ 开头 | 使用双引号括起来 | 例如 =SUM(1,2) -> "=SUM(1,2)" |
,逗号 | 使用双引号括起来 | 例如:a,b -> "a,b" | |
" 双引号 | 使用两个双引号代替 | " -> "" |
如果有不妥之处,希望可以留言指出。谢谢!
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。