目录
CSV注入漏洞
1.CSV漏洞简介
CSV公式注入(CSV Injection)是一种会造成巨大影响的攻击向量。攻击包含向恶意的EXCEL公式中注入可以输出或以CSV文件读取的参数。当在Excel中打开CSV文件时,文件会从CSV描述转变为原始的Excel格式,包括Excel提供的所有动态功能。在这个过程中,CSV中的所有Excel公式都会执行,从而可能导致黑客利用此功能进行渗透,形成CSV漏洞
2.漏洞原理
(1)公式执行
当输入一个公式,会被Excel自动运算并执行。如下图执行公式=1+2+3
回车后这一行数据就会变为6
(2)DDE机制
而当你输入一个别的Excel本身不存在的功能时,Excel就会被微软的另一种机制:DDE机制调用。
DDE是Windows下进程间通信协议,是一种动态数据交换机制,使用DDE通讯需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。DDE支持Microsoft Excel,LibreOffice和Apache OpenOffice。 Excel、Word、Rtf、Outlook都可以使用这种机制,根据外部应用的处理结果来更新内容。因此,如果我们制作包含DDE公式的CSV文件,那么在打开该文件时,Excel就会尝试执行外部应用。
(3)OS命令执行
通过在CSV文件中构建DDE公式,可以调用系统cmd执行命令,从而达到执行操作系统命令的目的,形成命令执行漏洞
如下图所示,在单元格中输入1+cmd|’/C calc’!A0
1+cmd|'/C calc'!A0
回车后Excel会弹出一个框,提醒Excel需要启动另外一个程序(cmd)
点击是,Windows会弹出计算器窗口。
因此,利用这种漏洞危害,我们可以在用户的操作系统上执行添加用户、开启任意程序、操作注册表、反弹shell等命令。
3.漏洞防御
1、确保单元格不以特殊字符(“+、-、@、=”)开头;
2、对单元格的内容进行特殊字符(“+、-、@、=”)过滤;
3、先对原始输入内容进行转义(双引号前多加一个双引号),然后在添加tab键和双引号防止注入;
4、禁止导出CSV、Excel格式;
5、导出为Excel格式前,利用代码把单元格的格式设置为文本(对CSV不生效)。
第08关 CSV注入
1.打开靶场
初始打开效果如下所示
2.修改源码
这是因为源码有问题,需要修改源码csv_vuln.php,修改后如下所示
<?php
$conn = mysqli_connect('localhost', 'root', 'root', 'webug');
if ($conn) {
$sql = "select * from data_crud";
$res = $conn->query($sql);
}
if (isset($_POST['daochu'])){
$headerArray = ['name','age','email'];
$string = implode(",",$headerArray)."\n";//先做出表头
while (list($id, $name, $age, $email, $deflag) = mysqli_fetch_row($res)){
$data = [
['name'=>urldecode($name),'age'=>urldecode($age),'email'=>urldecode($email)]
];
foreach ($data as $key => $value) {
//把需要的字段一一对应起来,如果已经对应好 直接 $outArray = $value;
$outArray['name'] = $value['name'];
$outArray['age'] = $value['age'];
$outArray['email'] = $value['email'];
$string .= implode(",",$outArray)."\n"; //用英文逗号分开
}
}
@$filename = date('Ymd').'.csv'; //设置文件名
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
exit(mb_convert_encoding($string, "GBK", "UTF-8"));
}
?>
<?php
require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
header("Location:../login.php");
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<style>
body{font-family: Arial, Helvetica, sans-serif;}
table{border-collapse: collapse;
width: 50%;
text-align: center;}
td,th{border:1px solid #ccc; padding: 2px 5px;}
button{padding: 5px;}
div {
line-height: 3;
}
</style>
<body>
<?php
$i_name = urlencode($_POST[name]);
$i_age = urlencode($_POST[age]);
$i_email = urlencode($_POST[email]);
if ($dbConnect) {
if ($i_name != null && $i_age != null && $i_email != null){
$sql = "INSERT INTO data_crud(name,age,email) VALUES ('$i_name','$i_age','$i_email')";
$res = $dbConnect->query($sql);
}
}
if ($dbConnect) {
$sql = "select * from data_crud";
$res = $dbConnect->query($sql);
}
?>
<table id="table">
<tr>
<th>Name</th>
<th>Age</th>
<th>Email</th>
</tr>
<?php
if ($res) {
while (list($id, $name, $age, $email, $deflag) = mysqli_fetch_row($res)){
echo '<tr>';
echo '<input type="text" hidden="hidden" name="id[]" value="'.$id.'">';
echo '<td><div contenteditable="true">'.urldecode($name).'</div></td>';
echo '<td><div contenteditable="true">'.urldecode($age).'</div></td>';
echo '<td><div contenteditable="true">'.urldecode($email).'</div></td>';
echo '</tr>';
}
}
?>
</table>
<form action="#" method="post">
<input name="daochu" type="submit" value="导出"/>
</form>
<br>
<h2>添加新用户信息</h2>
<form action="#" method="post">
<table id="table">
<tr>
<td>Name</td>
<td>Age</td>
<td>Email</td>
</tr>
<tr>
<td><input name="name" type="text" size="20"/></td>
<td><input name="age" type="text" size="20"/></td>
<td><input name="email" type="text" size="20"/></td>
</tr>
</table>
<div>
<input name="submit" type="submit" value="确认添加"/>
</form>
</div>
</body>
<script src="../../../aa/html/table-to-excel.js"></script>
<script>
var tableToExcel = new TableToExcel();
document.getElementById('button').onclick = function () {
tableToExcel.render("table");
};
</script>
</html>
修改源码后,打开页面如下所示
3.注入命令
在添加用户信息处,任选一项name处,添加1+cmd|'/C calc'!A0这个csv注入命令,其他两项甜味18和ljn,接下来点击确认添加
添加后如下所示
这个时候点击导出,将excel表导出,很明显此时导出的表格中会包含此csv注入命令。
4.导出excel表
点击导出后效果如下,此时导出成功会提示是否打开,选择打开
5.打开excel表
打开后,当点击=1+cmd|'/C calc'!A0项数据时,提示如下
这个时候如果点击是的话,如下所示通关excel表的csv注入将计算器启动,渗透成功