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

相关推荐
宋浮檀s14 小时前
春秋云镜——CVE-2020-25540
网络·安全·web安全
郑洁文14 小时前
面向Web安全的Python渗透测试系统设计与实现
python·安全·web安全
woniu_buhui_fei17 小时前
常见的网络攻击
web安全
WangX-西石油21 小时前
DVWA靶场Low级别Brute Force学习
学习·web安全·网络安全
小熊officer21 小时前
网络渗透(Network Penetration)
网络·安全·web安全
Dreamboat¿1 天前
Web 框架识别全攻略(含 Spring Boot、Django、Laravel 等)
web安全
小熊officer1 天前
网络渗透和网络安全
网络·安全·web安全
上海云盾第一敬业销售1 天前
服务器遭受攻击的应对策略及快速防护实践
运维·服务器·web安全·ddos
其实防守也摸鱼2 天前
告别单个变量,用列表和字典批量管理你的 Python 数据
开发语言·网络·软件测试·python·web安全·数据结构,编程教程
路baby2 天前
2026第十届御网杯网络安全大赛线上赛 区域赛WP (MISC和Crypto)(详解-思路-脚本)
安全·web安全·网络安全·密码学·ctf·misc·御网杯