目錄
一、href
1、常見取值類型
2、使用示例
3、安全風險
二、源碼分析
1、進入靶場
2、代碼審計
3、滲透思路
三、滲透實戰
1、注入payload1
2、注入payload2
3、注入payload3
本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關)滲透集合,通過對XSS關卡源碼的代碼審計找到安全風險的真實原因,講解XSS的原理并進行滲透實踐,本文為XSS09關卡XSS之href輸出的滲透部分。
一、href
href(Hypertext Reference)是 HTML 中用于定義超鏈接目標地址的核心屬性,常見于 <a>、<link> 和 <area> 標簽。href 屬性的值可以是任何有效文檔的相對或絕對 URL,包括片段標識符和 JavaScript 代碼段。
<a>標簽的 href 屬性是 HTML 中用于創建超鏈接的關鍵屬性,它定義了鏈接的目標地址,用于指定超鏈接目標的 URL。如果用戶選擇了<a>標簽中的內容,那么瀏覽器會嘗試檢索并顯示 href 屬性指定的 URL 所表示的文檔,或者執行 JavaScript 表達式、方法和函數的列表。
1、常見取值類型
其值可以是 URL(如 https://example.com)、錨點(如 #section)或 協議鏈接(如 mailto:、tel:)具體如下所示。
-
絕對 URL:指向完整的網頁地址,如?
https://www.example.com
。這是最常見的用法,用于鏈接到其他網站。 - 相對 URL:相對于當前頁面的路徑,如?
page2.html
?或?../subfolder/page3.html
。常用于鏈接到同一網站內的其他頁面。 - 電子郵件地址:使用?
mailto:
?前綴,如?mailto:info@example.com
。點擊鏈接時會打開默認的郵件客戶端,創建一封新郵件。 - 錨點:指向當前頁面或其他頁面中的特定位置,如?
#section2
。常用于創建頁面內的導航鏈接。
2、使用示例
<a href="https://www.example.com">訪問示例網站</a>
<a href="mailto:info@example.com">發送郵件</a>
<a href="#section2">跳轉到頁面內的特定位置</a>
3、安全風險
通過合理使用 <a> 標簽的 href 屬性,可以為用戶提供便捷的導航和交互體驗。但若未過濾用戶輸入,攻擊者可注入 javascript: 偽協議(如 javascript:alert(1))或惡意 data: URI,觸發 XSS 攻擊。
二、源碼分析
1、進入靶場
打開pikachu靶場第09關XSS之href,完整URL地址如下所示,這是一個輸入框頁面,如下所示。
http://127.0.0.1/pikachu/vul/xss/xss_03.php
2、代碼審計
查看xss_03.php源碼內容,如下所示使用htmlspecialchars函數且參數為ENT_QUOTES對輸入參數進行了過濾處理,這說明沒法用上一個關卡的單引號進行XSS滲透了,具體如下所示。
這段 PHP 代碼的主要功能是處理用戶通過 GET 請求提交的 message 參數。盡管代碼使用了?htmlspecialchars
?函數并指定?ENT_QUOTES
?對用戶輸入進行處理,但仍然存在 XSS安全風險,主要原因如下:
- 協議限制缺失:代碼沒有對用戶輸入的 URL 協議進行嚴格限制,攻擊者可以使用?
javascript:
?協議來注入惡意腳本。即使使用?htmlspecialchars
?對特殊字符進行了編碼,javascript:
?協議本身并不會被阻止,仍然可以觸發 XSS 攻擊。 - 僅依賴字符編碼:僅僅依靠?
htmlspecialchars
?進行字符編碼是不夠的。對于 URL 輸入,需要額外的驗證和過濾機制來確保其安全性,防止惡意協議的使用。
對源碼進行詳細注釋,具體如下所示。
<?php
// 檢查 $_GET 數組中是否存在名為 'submit' 的元素
// 這一步用于判斷用戶是否通過 GET 請求提交了表單,只有提交了表單才會進入后續邏輯
if (isset($_GET['submit'])) {// 檢查 $_GET 數組中名為 'message' 的元素是否為空if (empty($_GET['message'])) {// 如果 'message' 為空,向 $html 變量中追加一段提示信息// 提示用戶應該輸入一個 URL$html .= "<p class='notice'>叫你輸入個url,你咋不聽?</p>";}// 檢查用戶輸入的 'message' 是否等于 'www.baidu.com'if ($_GET['message'] == 'www.baidu.com') {// 如果等于 'www.baidu.com',向 $html 變量中追加一段提示信息$html .= "<p class='notice'>我靠,我真想不到你是這樣的一個人</p>";} else {// 輸出在 a 標簽的 href 屬性里面, 這里注釋提示可以使用 javascript 協議來執行 js// 并給出防御建議:只允許 http 和 https 協議,其次再進行 htmlspecialchars 處理// 使用 htmlspecialchars 函數對用戶輸入的 'message' 進行處理// ENT_QUOTES 標志表示同時對單引號和雙引號進行轉換// 這樣可以將特殊字符轉換為 HTML 實體,避免一些 XSS 攻擊$message = htmlspecialchars($_GET['message'], ENT_QUOTES);// 向 $html 變量中追加一個超鏈接元素// 超鏈接的 href 屬性使用處理后的 $message 變量,文本提示用戶點擊自己輸入的 URL$html .= "<a href='{$message}'> 閣下自己輸入的 url 還請自己點一下吧</a>";}
}
?>
3、滲透思路
雖然代碼使用了 htmlspecialchars 函數對用戶輸入進行處理,但仍然有XSS安全風險,攻擊者可以通過????使用?javascript:
?協議來對該XSS安全風險進行攻擊。攻擊者可以輸入?javascript:alert('XSS')
?作為?message
?參數的值。當用戶點擊生成的超鏈接時,瀏覽器會執行?javascript:
?協議后面的代碼,彈出一個包含?XSS
?的警告框。
三、滲透實戰
1、注入payload1
輸入注入語句javascript:alert(1019),如下所示彈框“1019”,滲透成功。
2、注入payload2
輸入注入語句javascript:alert("ljn"),如下所示彈框“ljn”,滲透成功。
3、注入payload3
輸入注入語句javascript:alert('ljn'),如下所示彈框“ljn”,滲透成功。