解决DDE注入攻击
2022-06-24 本文已影响0人
Neuro_annie
很多人很容易忽略的是DDE注入:导出格式为csv,xls时,或许你可以尝试构造这个漏洞,它不会对网站本身产生危害,但会对终端用户造成任意OS命令执行等危害。
Excel解析机制
在Excel任何以
'='
字符开头的单元格都将被电子表格软件解释为公式,如果我们输入=1+2
,则表格会显示为:3
等于'='
加'+'
减号' - '
在'@'
符号都可用于在Microsoft Excel中触发公式解释,这个可以帮助我们在等号=
被过滤时,使用其他运算符绕过
![](https://img.haomeiwen.com/i4726228/05650ac1636532e5.png)
![](https://img.haomeiwen.com/i4726228/8a0d6cb30c7128aa.png)
漏洞危害
可以使用
= cmd | '/ C calc' !A0
弹计算器,或者使用=cmd|'/k ipconfig'!A0
弹出ipconfig命令。如果系统可以实现弹框效果,说明我们可以执行任意的js代码,比如:
添加用户
开启任意应用程序:IE
操作注册表
信息泄露,超链接功能 Hyperlink创建快捷方式并进行跳转 等
防御手段
- 一般的防御手段为,在生成电子表格时,以任何危险符号开头的字段应该以单引号、撇号(')或空格作为前缀,确保单元格不被解释为公式,但存在可能被绕过的风险
// tableExport.js 部分源码
function preventInjection (str) {
if (str.length > 0 && defaults.preventInjection === true) {
var chars = '=+-@';
if (chars.indexOf(str.charAt(0)) >= 0)
return ('\'' + str); // 若查找到以=+-@开头的字符,添加单引号'作为前缀
}
return str;
}
![](https://img.haomeiwen.com/i4726228/b8d8b8f4f03ab9ca.png)
- 更好的防御手段为,根据业务需求控制用户输入为字母数字字符;或黑名单过滤
=
或-
号开头的单元格数据,过滤=(-)cmd
或=(-)HYPERLINK
或concat
等
- 通过给导出的td添加
style="mso-number-format:'\@'; vnd.ms-excel.numberformat:'\@'"
,设置单元格为文本格式,可以完美解决代码被解析
<!-- 我是用这种方法解决的 -->
<!-- 首先需要处理的td标签上加上 data-tableexport-msonumberformat="\@" -->
<td data-tableexport-msonumberformat="\@">=1+2</td>
// tableExport.js 部分源码
// 获取td标签上data-tableexport-msonumberformat属性值,并设置style
var tdcss = $(cell).attr('data-tableexport-msonumberformat');
if (typeof tdcss === 'undefined' && typeof defaults.mso.onMsoNumberFormat === 'function')
tdcss = defaults.mso.onMsoNumberFormat(cell, row, col);
if (typeof tdcss !== 'undefined' && tdcss !== '')
tdstyle = 'style="mso-number-format:\'' + tdcss + '\';vnd.ms-excel.numberformat:\''+ tdcss + '\'';
![](https://img.haomeiwen.com/i4726228/ba7807cb4fc486aa.png)