目錄
第14關 鏈接注入
1.打開靶場
2.源碼分析
3.滲透實戰
(1)方法1:跳轉外部網頁
4.漏洞防御
本文通過《webug靶場第14關 鏈接注入》來進行滲透實戰。
第14關 鏈接注入
鏈接注入是修改站點內容的行為,其方式為將外部站點的 URL 嵌入其中,或將有易受攻擊的站點中的腳本 的 URL 嵌入其中。將 URL 嵌入易受攻擊的站點中,攻擊者便能夠以它為平臺來啟動對其他站點的攻擊,以及攻擊這個易受攻擊的站點本身。鏈接注入漏洞常被低估,但可能成為攻擊鏈的關鍵環節。
XSS漏洞與鏈接注入漏洞的主要區別如下所示。
特性 | XSS注入漏洞 | 鏈接注入漏洞 |
---|---|---|
本質 | 注入惡意腳本代碼 | 注入惡意URL或鏈接 |
執行方式 | 瀏覽器直接執行腳本 | 需要用戶交互(點擊/跳轉) |
攻擊目標 | 當前頁面/用戶會話 | 可能導向外部惡意站點 |
漏洞利用復雜度 | 中高(需繞過過濾) | 低至中(依賴用戶行為) |
鏈接注入漏洞的類型與特征如下表所示。
類型 | 描述 | 典型場景 |
---|---|---|
反射型鏈接注入 | 惡意鏈接通過URL參數臨時嵌入頁面 | 搜索結果、跳轉鏈接 |
存儲型鏈接注入 | 惡意鏈接被持久化存儲在系統中 | 用戶評論、個人資料頁 |
DOM型鏈接注入 | 前端JavaScript動態生成惡意鏈接 | SPA應用、AJAX加載內容 |
1.打開靶場
進入靶場的第14關,鏈接注入關卡,網址如下所示。
http://192.168.71.129:8006/control/xss/link_xss.php?id=1
2.源碼分析
對源代碼進行代碼審計,如下所示。
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}
setcookie("flag", "", time() - 1);
if (isset($_GET["id"])) {if (!empty($_GET["id"])) {$id = strtolower($_GET['id']);$filter = array('on', 'script');if (strstr($id, $filter)) {header("Content-type:text/html;charset=utf-8");echo "<script>alert('請不要包含惡意函數')</script>";exit();}}
}
require_once TPMELATE."/xss_1.html";
對代碼進行完整注釋,如下所示。
// 檢查會話中是否存在 'user' 變量
// 如果不存在,說明用戶未登錄
if (!isset($_SESSION['user'])) {// 將用戶重定向到登錄頁面header("Location:../login.php");
}// 刪除名為 'flag' 的 cookie
// 通過將過期時間設置為過去的時間來實現
setcookie("flag", "", time() - 1);// 檢查是否通過 GET 請求傳遞了 'id' 參數
if (isset($_GET["id"])) {// 檢查 'id' 參數是否不為空if (!empty($_GET["id"])) {// 將 'id' 參數的值轉換為小寫$id = strtolower($_GET['id']);// 定義一個包含敏感關鍵詞的數組$filter = array('on', 'script');// 檢查 'id' 參數中是否包含敏感關鍵詞if (strstr($id, $filter)) {// 設置響應的內容類型為 HTML,字符編碼為 UTF-8header("Content-type:text/html;charset=utf-8");// 彈出警告框提示用戶不要包含惡意函數echo "<script>alert('請不要包含惡意函數')</script>";// 終止腳本執行exit();}}
}
????????這段 PHP 代碼主要實現了兩個功能。首先,它會檢查用戶是否已登錄,如果會話中不存在 user 變量,就會將用戶重定向到登錄頁面。接著,它會刪除名為 flag 的 cookie。之后,代碼會檢查是否通過 GET 請求傳遞了 id 參數,如果傳遞了且不為空,會將其轉換為小寫,并檢查其中是否包含 on 或 script 這些敏感關鍵詞。若包含,則會彈出警告框提示用戶不要包含惡意函數,并終止腳本執行。
????????代碼存在XSS注入漏洞,原因在于其過濾機制不夠完善。代碼僅簡單地檢查了 id 參數中是否包含 on 和 script 這兩個關鍵詞,但攻擊者可以采用多種方式繞過這種簡單的過濾。例如,攻擊者可以使用變形的關鍵詞、大小寫混合、編碼轉換等方式,或者使用其他未被過濾的惡意關鍵詞和語句來實現注入攻擊。此外,代碼沒有對 id 參數進行全面的輸入驗證和安全處理,使得攻擊者有機會注入惡意代碼。
3.滲透實戰
(1)方法1:跳轉外部網頁
構造注入語句
<a href="https://www.baidu.com">baidu</a>
當傳入的鏈接注入語句 id=<a href="https://www.baidu.com">baidu</a> 時,該語句中不包含 on 和 script 這兩個關鍵詞,所以無法被過濾機制攔截。
點擊baidu鏈接,如下所示跳轉到百度網址,滲透成功
當然這里我使用的是百度的鏈接,如果是惡意鏈接地址會導致更嚴重的影響。?
(2)方法2:獲取cookie
注入語句如下所示。
<a href="javascript:alert(document.cookie)">點擊領獎</a>
點擊下圖中的“點擊領獎”,彈出cookie的窗框,漏洞滲透成功。?
4.漏洞防御
對于鏈接注入漏洞,防御方法如下表所示。
防御層面 | 具體方法 | 簡要說明 |
---|---|---|
輸入驗證 | 白名單驗證 | 確定合法鏈接規則,僅放行白名單內鏈接 |
正則表達式驗證 | 用正則驗證鏈接格式,確保合法 | |
輸出編碼 | HTML 實體編碼 | 輸出到 HTML 時對特殊字符編碼,防解析為惡意代碼 |
URL 編碼 | 作 URL 參數傳遞時對鏈接編碼 |