目錄
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><?phpif ($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注入將計算器啟動,滲透成功