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

目录

CSV注入漏洞

1.CSV漏洞简介

2.漏洞原理

(1)公式执行

(2)DDE机制

(3)OS命令执行

3.漏洞防御

[第08关 CSV注入](#第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注入将计算器启动,渗透成功

相关推荐
你好我是小美30 分钟前
分析XSSstrike源码
学习·安全·web安全·网络安全·自动化
qq_243050791 小时前
Protos-SIP:经典 SIP 协议模糊测试工具!全参数详细教程!Kali Linux教程!
linux·网络·web安全·网络安全·黑客·voip·kali linux
黑客笔记4 小时前
网络安全的学习路线是怎么样的?
大数据·web安全
独行soc14 小时前
2025年渗透测试面试题总结-匿名[校招]高级安全工程师(代码审计安全评估)(题目+回答)
linux·安全·web安全·面试·职场和发展·渗透测试
mooyuan天天15 小时前
pikachu靶场通关笔记06 XSS关卡02-反射型POST
网络·web安全·反射型xss·pikachu靶场·xss漏洞
独行soc18 小时前
2025年渗透测试面试题总结-匿名[校招]安全研究员(SAST方向)(题目+回答)
linux·安全·web安全·面试·职场和发展·渗透测试
枷锁—sha21 小时前
【HW系列】—溯源与定位—Windows入侵排查
windows·安全·web安全
赛卡21 小时前
汽车安全 2030 预测 (功能安全FuSa、预期功能安全SOTIF、网络安全CyberSecurity):成本、效益与行业影响
人工智能·安全·web安全·车载系统·自动驾驶·汽车
这是另一个世界1 天前
Kali Linux从入门到实战:系统详解与工具指南
linux·运维·服务器·网络·学习·web安全·网络安全
midsummer_woo1 天前
五、web安全--XSS漏洞(2)--XSS相关payload
安全·web安全·xss