目錄
第09關 反射型XSS
1.打開靶場
2.源碼分析
3.滲透實戰
第10關 存儲型XSS
1.打開靶場
2.源碼分析
3.滲透實戰
本系列為通過《Webug4.0靶場通關筆記》的滲透集合,本文為反射型和存儲型XSS漏洞關卡的滲透部分,通過對XSS關卡源碼的代碼審計找到漏洞的真實原因,講解XSS漏洞的原理并進行滲透實踐。
第09關 反射型XSS
- 反射型 XSS:攻擊者構造包含惡意腳本的 URL,誘使用戶點擊。用戶點擊鏈接后,惡意腳本隨頁面請求提交給服務器,服務器處理后將腳本反射回客戶端瀏覽器,由瀏覽器解析并執行,整個過程類似 “客戶端 — 服務器 — 客戶端” 的反射,惡意腳本不存儲在服務器。
- 存儲型 XSS:攻擊者將惡意腳本提交到目標網站的數據庫或文件中,如在論壇發帖、評論、留言等操作時注入。當用戶訪問包含該惡意腳本的頁面時,腳本從服務器被加載到客戶端瀏覽器并執行。
1.打開靶場
打開反射型靶場,如下所示此關卡有flag
反射型XSS的網址如下所示
http://192.168.71.1/webug4/control/xss/xss_1.php?id=1
根據url可知參數為id=1,如下圖紅框所示,1輸出在頁面中,那么可以從id的參數入手嘗試注入
?隨手將參數修改為id=2,如下所示輸出在頁面中
嘗試將id改為字符串,發現完整字符串輸出在頁面中,猜測存在xss漏洞,可能輸入內容未加過濾直接輸出
2.源碼分析
如下所示,參數id包含alert時將flag復制到cookie中
<?phprequire_once "../../common/common.php";
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}
setcookie("flag", "", time() - 1);
if (isset($_GET["id"])) {if (!empty($_GET["id"])) {if (strstr($_GET['id'], 'alert')){$sql = "SELECT * FROM env_list WHERE id = 9";$res = $dbConnect->query($sql);$row = mysqli_fetch_assoc($res);setcookie("flag", $row['envFlag']);}}
}
require_once TPMELATE."/xss_1.html";
這段代碼是一個存在反射型XSS漏洞的PHP腳本,主要邏輯如下:
-
檢查用戶是否登錄(未登錄則跳轉至登錄頁)。
-
清除名為
flag
的Cookie(但未設置安全屬性)。 -
檢查
id
參數是否存在且非空,若包含alert
字符串,則查詢數據庫并設置flag
?Cookie(存儲敏感信息)。 -
最終加載模板文件
xss_1.html
,但未對id
參數進行任何輸出編碼或嚴格過濾。
?據此,我們如果想獲取到flag,需要將cookie提取出來,也就是通過document.cookie獲得,這時候可以通過反射型注入語句獲取,即<script>alert(document.cookie)</script>
3.滲透實戰
構造包含alert的獲取cookie的XSS注入命令
id=<script>alert(document.cookie)</script>
完整url注入為
http://192.168.71.1/webug4/control/xss/xss_1.php?id=<script>alert(document.cookie)</script>
滲透結果如下
如上所示,獲取到
flag=fsdafasdfas
?提交到系統中
?提示正確,本關卡滲透成功
第10關 存儲型XSS
1.打開靶場
?打開反射型靶場,如下所示此關卡有flag
反射型XSS的網址如下所示
http://192.168.71.1/webug4/control/xss/xss_2.php
頁面打開后如下所示
該界面具有迷惑性,鼠標一直向下滑會出現留言板界面, 根據經驗這很可能是存儲型XSS漏洞如下所示
2.源碼分析
如下所示對傳入的參數message進行處理
<?phprequire_once "../../common/common.php";
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}
setcookie("xss2_flag", "", time() - 1);
if (isset($_POST["message"])) {if (!empty($_POST["message"])) {$filter = array('insert', 'update', 'select', 'delete', 'from');$message = strtolower(trim($_POST["message"]));$userId = $_SESSION['user'];if (in_array($message, $filter)) {echo "<script>alert('Please don\'t try to deposit dangerous characters')</script>";exit();}else{if (strstr($message, "alert")) {$s = "SELECT * FROM env_list WHERE id = 10";$r = $dbConnect->query($s);$w = mysqli_fetch_assoc($r);setcookie("xss2_flag", $w['envFlag']);}$sql = "INSERT INTO storage_xss(content, userId) VALUES('{$message}', '{$userId}')";$res = $dbConnectWidth->query($sql);}}
}$sql1 = "SELECT * FROM storage_xss WHERE userId = '".$_SESSION['user']."'";
$res1 = $dbConnectWidth->query($sql1);
require_once TPMELATE."/xss_2.html";
代碼實現了一個簡單的留言存儲功能,主要邏輯包括:
-
檢查用戶登錄狀態,未登錄則跳轉
-
清除名為
xss2_flag
的Cookie -
接收用戶提交的
message
參數,進行簡單的SQL關鍵字過濾(如select/insert等),這個過濾是為避免二次SQL注入進行filter處理(不過這個代碼卡法這寫的有問題,因為in_array函數的處理有問題,實際上也等于沒有這個函數,基本上也無法過濾) -
如果
message
包含"alert"則設置包含敏感信息的Cookie,即當message包含alert關鍵字時,將flag寫入到cookie中 -
將用戶輸入存儲到數據庫(將message信息存儲到數據庫中)并顯示歷史留言
如上所示存在存儲型XSS注入,并可以通過將調用獲取cookie的XSS注入語句實現注入,XSS漏洞主要原因包括:
-
輸入過濾不徹底:僅過濾部分SQL關鍵字(如select/insert)和"alert"字符串,未對HTML/JS特殊字符(如
<>'"
)進行編碼或過濾 -
直接數據庫存儲:用戶輸入的原始
message
直接存入數據庫,未做凈化處理 -
未輸出編碼:在
xss_2.html
模板中直接輸出數據庫內容時,未使用htmlspecialchars
等函數進行編碼 -
Cookie設置不安全:
setcookie
未設置HttpOnly/Secure屬性,易被XSS竊取
3.滲透實戰
構造包含alert的獲取cookie的XSS注入命令
<script>alert(document.cookie)</script>
在留言處進行注入并點擊提交
如下所示,獲取到flag
如上所示,flag獲取成功
xss2_flag=asdfsdfadfsdrew
提交flag
滲透成功