公式注入(Formula Injection)攻击

Table of Contents

早在 2013 年、2014 年就相继有人提出 Cell Injection、CSV Injection,诱导受害者打开带有恶意公式的 Excel 文件,在打开文件后执行 Excel 公式。凡是带这种公式计算功能的表格处理软件或多或少都会受影响,如 WPS、LibreOffice 等等。

现在越来越多的云端产品都提供了数据导出为 CSV、xlsx 文件格式,如果能控制它们的数据源,并且未做内容验证,就可以触发公式注入,最近我在一些内部平台中就相继发现不少这类问题。

作为一个简单的测试,test.csv 文件内容如下:

1,"=SUM(1,2)"

其中第二列为计算公式,用 Excel、WPS或者 LibreOffice 打开后,都可以看到 B1 的数据为计算结果 3。

除了“=”开头会当作公式执行,“@”、“-”、“+”开头的都可以,不过在测试中发现 WPS 不会执行“@”开头的。

现在把 test.csv 改为:

1,"=HYPERLINK(""http://www.shellcodes.org"",""blog"")"

注:上方出现两个连续的双引号是为了转义,Excel 解析时会将两个双引号转义为单个双引号。

用 Excel 打开后,第二列呈现的是“blog”超链接,单击后即可通过浏览器打开。

再进一步,改为:

1,=cmd|' /C notepad.exe'!A0

用 Excel 打开后,会出现确认安全提示,只要点了确认就可以打开记事本。

图1.png

图2.png

不过,执行外部命令需要用到 Excel 的 DDE(Dynamic Data Exchange,动态数据交换),在新版本的 Excel 中(我的为 Excel 2016)需要修改设置才能复现:

文件 > 选项 > 信任中心 > 信任中心设置 > 外部内容

在“动态数据交换的安全设置”中勾选“启用动态数据交换服务器查找”和“启用动态数据交换服务器启动”。

虽然微软默认关闭了 DDE 让执行外部命令有一些难度,但并不表示这个漏洞就无用武之地,毕竟公式是可以改变数据最终呈现的,比如上文提到的 HYPERLINK 能用来钓鱼、泄露信息,或者涉及金额计算的地方用来修改金额等。

这类漏洞通常出现在涉及导出数据的地方,比如导出日志、统计信息、配置信息等等位置。

1. 漏洞防范

  1. 根据业务场景来严格限制输入格式,比如填 URI 的地方判断 URI 格式是否正确;
  2. 生成表格文件时,凡是公式字符开头(=、+、-、@)数据,可以添加单引号在首部来阻止被解析。

2. 参考资料