目錄
第十四關:存儲型XSS
1.打開靶場
2.源碼分析
3.滲透實戰
第十四關:存儲型XSS
本文通過《webug3靶場第十四關 存儲型XSS》來進行存儲型XSS關卡的滲透實戰。
存儲型 XSS(Stored Cross - Site Scripting),也被稱為持久型 XSS,是跨站腳本攻擊(XSS)的一種類型。它的特點是攻擊者將惡意腳本存儲在目標網站的服務器端數據庫、文件系統等持久化存儲介質中。當其他用戶訪問包含該惡意腳本的頁面時,惡意腳本會被瀏覽器執行,從而導致攻擊發生。
存儲型XSS漏洞對比上一關卡的反射型XSS漏洞,,最主要的區別如下所示。
- 存儲型 XSS:攻擊者把惡意腳本提交到目標網站的服務器,這些腳本會被持久化保存,像存儲在數據庫、文件系統里。當其他用戶訪問包含此惡意腳本的頁面時,腳本就會在其瀏覽器中執行。比如在論壇的留言板、評論區,攻擊者輸入惡意腳本,若網站未對輸入進行嚴格過濾,腳本就會被保存,之后其他用戶瀏覽該留言或評論時,惡意腳本就會執行。
- 反射型 XSS:攻擊者通過誘導用戶點擊包含惡意腳本的鏈接來發動攻擊。用戶點擊鏈接后,服務器會接收鏈接中的惡意腳本,并將其原樣反射到響應頁面中,隨后在用戶瀏覽器里執行。例如在搜索框中,若網站對輸入過濾不嚴格,攻擊者可構造包含惡意腳本的搜索鏈接,誘導用戶點擊,服務器返回的搜索結果頁面就會包含該惡意腳本。
整理來講,兩者區別如下所示。
對比維度 | 存儲型 XSS | 反射型 XSS |
---|---|---|
攻擊方式 | 攻擊者提交惡意腳本至服務器并持久保存,用戶訪問含該腳本頁面時執行 | 攻擊者誘導用戶點擊含惡意腳本鏈接,服務器將腳本反射到響應頁面執行 |
數據存儲 | 惡意腳本存于服務器端,持久存在 | 惡意腳本不存于服務器,僅臨時包含在響應中 |
影響范圍 | 影響所有訪問含腳本頁面的用戶,范圍廣、持續久 | 僅影響點擊惡意鏈接的用戶 |
檢測難度 | 相對容易,可掃描服務器數據發現 | 較困難,腳本臨時存在于響應中 |
防范難度 | 需嚴格過濾驗證輸入、清理檢查存儲數據,難度大 | 對輸入輸出嚴格過濾編碼,避免腳本注入執行 |
1.打開靶場
如下所示打開靶場,第14關卡如下圖紅框所示。
點擊第十四關,完整的URL地址如下所示。
http://192.168.71.1/webug3/pentest/test/10/
?很明顯這是一個留言區,頁面顯示了已有的多條留言信息。
這個留言板可能存在存儲型XSS漏洞。
2.源碼分析
如下所示對傳入的留言參數并未進行任何檢查過濾,而是直接存儲到數據庫中,很明顯可以通過注入XSS語句形成XSS存儲型漏洞。
<?php
//禁用錯誤報告error_reporting(0);
header("Content-Type: text/html;charset=utf-8");
require_once 'conn.php';
include'./key/config/sql.php';if(isset($_POST["comment"]))
{#$comment=$_POST["comment"];</script>中等級別
$date=date('y-m-d h:i:s',time());$query = "insert into comment(content, time) values('".$_POST['comment']."', '".$date."') ";//構建查詢語句$result = mysql_query($query);//執行查詢
if (!$result) {die("could not to the database\n" . mysql_error());
}
if (mysql_numrows($result)<=0) {echo "<script type='text/javascript'>alert('提交成功!');location.href='index.php'</script>";
}else{echo "<script type='text/javascript'>alert('提交失敗,請重新提交!');location.href='index.php'</script>";
}
}
?>
<!DOCTYPE html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>評論區</title>
<meta name="description" content="Test">
<meta name="author" content="MRYE+">
</head>
<body>
你覺得學好滲透需要自學哪幾本書?
<form action="" method="post">
<input type="text" id="comment" name="comment" /><input type="submit" id="submit" name="submit" value="留言"/>
</form>
<hr/>
<?php$query = "select * from comment ";//構建查詢語句$result = mysql_query($query);//執行查詢
while($result_row=mysql_fetch_row(($result)))//取出結果并顯示
{
$id=$result_row[0];
$content=$result_row[1];
$time=$result_row[2];
echo "序號為:".$id."</br>";
echo "評論為:".$content."</br>";
echo "評論時間:".$time."</br>";
echo "<hr/>";
echo "<hr/>";
}?>
</body>
</html>
這個漏洞是因為XSS內容未經過濾,并直接存入數據庫,導致出現異常。
$query = "insert into comment(content, time) values('".$_POST['comment']."', '".$date."') ";
3.滲透實戰
獲取cookie的XSS注入命令如下所示。
<script>alert(document.cookie)</script>?
向留言板中輸入如上語句。
點擊留言,接下來彈框獲取到cookie信息,如下所示滲透成功。
這之后,每次再進入到留言板界面,都會有彈出cookie的彈框,存儲型XSS獲取成功
4.存儲型XSS漏洞防范
防御層面 | 具體防御方法 | 原理 |
---|---|---|
輸入驗證 | 白名單驗證 | 只允許符合特定規則的字符(如字母、數字、部分特定符號)輸入,阻止惡意腳本代碼中的特殊字符(如<script> 等)進入系統,從源頭防止惡意腳本注入。 |
長度限制 | 限制用戶輸入內容的長度,避免攻擊者利用長串惡意代碼繞過過濾機制,減少惡意腳本成功注入的可能性。 | |
輸出編碼 | HTML 實體編碼 | 將用戶輸入內容中的特殊字符(如< 編碼為< 、> 編碼為> 等)轉換為 HTML 實體,使瀏覽器將其作為普通文本顯示,而不是解析為可執行的腳本代碼。 |
JavaScript 編碼 | 對輸出到 JavaScript 環境中的內容進行編碼,如對單引號(' )、雙引號(" )等進行轉義處理,防止惡意腳本破壞 JavaScript 代碼結構并執行。 | |
服務器端安全策略 | 定期漏洞掃描 | 使用專業安全工具定期掃描服務器,檢查是否存在存儲型 XSS 漏洞,及時發現并修復潛在的安全隱患。 |
權限控制 | 嚴格控制用戶對服務器資源的訪問權限,避免未授權用戶上傳惡意腳本,降低存儲型 XSS 攻擊風險。 | |
更新系統和應用 | 及時更新服務器操作系統、Web 應用程序及相關組件,修復已知的安全漏洞,防止攻擊者利用舊版本漏洞進行攻擊。 | |
設置 HTTP 安全頭 | Content - Security - Policy(CSP) | 通過設置 CSP 頭,明確指定頁面允許加載的資源來源,阻止瀏覽器從非信任源加載腳本,限制惡意腳本的執行環境。 |
開發規范與意識 | 安全編碼培訓 | 對開發人員進行安全編碼培訓,使其了解存儲型 XSS 的原理和危害,掌握正確的輸入驗證、輸出編碼等安全開發技巧。 |
代碼審查 | 在開發過程中,對代碼進行嚴格審查,檢查是否存在可能導致存儲型 XSS 漏洞的代碼邏輯錯誤,如未對用戶輸入進行過濾就直接存儲和使用。 |