Webug4.0通关笔记06- 第8关CSV注入

目录

CSV注入漏洞

1.CSV漏洞简介

2.漏洞原理

(1)公式执行

(2)DDE机制

(3)OS命令执行

3.漏洞防御

第08关 CSV注入

1.打开靶场

2.修改源码

3.注入命令

4.导出excel表

5.打开excel表


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注入将计算器启动,渗透成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值