目錄
一、源碼分析
1、進入靶場
2、代碼審計
3、攻擊思路
二、滲透實戰
1、探測過濾信息
2、注入Payload1
3、注入Payload2
4、注入Payload3?
本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關)滲透集合,通過對XSS關卡源碼的代碼審計找到安全風險的真實原因,講解XSS原理并進行滲透實踐,本文為XSS關卡第07關XSS過濾關卡的滲透部分。
一、源碼分析
1、進入靶場
打開pikachu靶場第07關XSS過濾,完整URL地址如下所示,這是一個輸入框頁面,如下所示。
http://127.0.0.1/pikachu/vul/xss/xss_01.php
2、代碼審計
查看xss_01.php源碼內容,如下所示使用preg_replace函數對輸入參數進行了簡單過濾,具體如下所示。
不過,盡管代碼嘗試使用正則表達式過濾<script>?標簽,但仍然存在 XSS安全風險,原因如下:
- 正則匹配不全面:正則表達式僅對<script>標簽進行匹配替換,攻擊者可以利用其他 HTML 標簽或 JavaScript 事件來注入惡意腳本。例如,使用?
<img>
?標簽的?onerror
?事件、<body>
?標簽的?onload
?事件等,這些情況不會被當前的正則表達式匹配到。 - 大小寫和編碼繞過:攻擊者可以使用不同的大小寫組合(如<ScRiPt>?)來繞過正則匹配,因為當前正則表達式對大小寫敏感且未處理編碼情況。
我們對關鍵源碼進行詳細注釋,具體如下所示。
<?php
// 初始化一個空字符串變量 $html,用于存儲后續要輸出的 HTML 內容
$html = '';// 檢查 $_GET 數組中是否存在名為 'submit' 的元素,并且是否存在名為 'message' 的元素且其值不為 null
// 即判斷用戶是否通過 GET 請求提交了 'submit' 參數,同時也提交了 'message' 參數且該參數有值
if (isset($_GET['submit']) && $_GET['message'] != null) {// 使用正則表達式對用戶提交的 'message' 參數進行過濾處理// 正則表達式 '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/' 嘗試匹配任何包含 <script> 標簽的字符串// 無論 <script> 標簽中的字母是否被其他字符分隔,都會被匹配到// preg_replace 函數將匹配到的內容替換為空字符串,即過濾掉所有類似 <script> 的標簽$message = preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);// 檢查經過過濾后的 'message' 參數的值是否等于 'yes'if ($message == 'yes') {// 如果等于 'yes',向 $html 變量中追加一段提示信息$html .= "<p>那就去人民廣場一個人坐一會兒吧!</p>";} else {// 如果不等于 'yes',向 $html 變量中追加一段提示信息,其中包含用戶輸入的 'message' 內容$html .= "<p>別說這些'{$message}'的話,不要怕,就是干!</p>";}
}
?>
3、攻擊思路
攻擊者可以構造如下惡意輸入進行攻擊:
- 利用 HTML 事件:構造類似 <img src="nonexistent.jpg" οnerrοr="alert('XSS')"> 的輸入,當頁面顯示該內容時,由于 src 屬性指向的圖片不存在,會觸發 onerror 事件,從而執行其中的 JavaScript 代碼。
- 大小寫繞過:輸入 <ScRiPt>alert('XSS')</ScRiPt>,由于正則表達式對大小寫敏感,該輸入不會被過濾,頁面會執行其中的惡意腳本。
二、滲透實戰
1、探測過濾信息
輸入關鍵字判斷是否有過濾,關鍵字包括:單引號、雙引號、左右尖括號、問號、&、字符串以及數字<script>'">?&ljn20241019,如下所示發現?<script> 被過濾了。
這說明本關卡存在XSS過濾,將關鍵字script過濾了,這與我們源碼分析的結果一致。?
2、注入Payload1
大小寫繞過
<sCriPt>alert('ljn')</ScripT>
<ScRiPT>alert("ljn")</ScRIPT>
3、注入Payload2
使用非 script關鍵字的js腳本進行滲透,如下所示。
<a herf="#" οnclick=" alert('ljn')">
點擊鏈接后彈框“ljn”,說明滲透成功,具體如下所示。
4、注入Payload3?
輸入非 script關鍵字的js腳本<img src="nonexistent.jpg" οnerrοr="alert('ljn')">
<img src="nonexistent.jpg" onerror="alert('ljn')">
由于我們的注入語句種src 屬性指向的圖片不存在,會觸發 onerror 事件,從而執行其中的 XSS代碼彈出“ljn”,如下所示滲透成功。?