XSS-DOM 2

目錄

1 DOMPurify

1.1 漏洞源碼

1.2 加載框架

?編輯

setTimeout

1.3 ok?

1.4 window和document

1.5 Overwrite(document.x)

1.5.1 打印cookie

1.6?Overwrite2(document.x.y)

1.6.1 form表單

1.7 toString

2. 設計目的:“重寫類型轉換邏輯”

3. 延伸:“類型轉換” 的場景

1.8 可控字符串a標簽的屬性等

1.8.1 a href

逐步驟分析結果由來:

最終結果的本質:

?打印代碼結果:

1.9 alert執行script

1.9.*? 和alert的區別

1.10 利用DOM破壞

1.10.1 ok

1.10.2 payload:

1.10.3 setTimeout

?1.11 DOM框架過濾了JavaScript惡意代碼


1 DOMPurify

1.1 漏洞源碼

<h2 id="boomer">Ok, Boomer.</h2>
<script>boomer.innerHTML = DOMPurify.sanitize(new URL(location).searchParams.get('boomer') || "Ok, Boomer")setTimeout(ok, 2000)
</script>

1.2 加載框架

Release DOMPurify 3.2.6 · cure53/DOMPurify · GitHub

可以去GitHub上面將此框架下載下來,加載到這個代碼中,并且加載路徑寫到js之前執行

setTimeout

//這是一個定時器,js定時器有兩個,一個是setTimeout 在指定延遲的時間內執行一次,2秒后執行ok
// setInterval 循環執行

1.3 ok?

1 ok從哪里來的,沒有進行定義?

2 所以ok大概率是我們的payload惡意代碼

3 框架如何過濾呢?(這個框架非常的安全基本上沒有繞過的可能性)

4 ok引入

所以思考:我們該如何創建一個OK。讓setTimeout執行呢?

1.4 window和document

<body><img id="x"><img name="y">
</body>
<script>console.log(x);console.log(y);console.log(document.x);console.log(document.y);console.log(window.x);console.log(window.y);

window是js所有元素的祖先

document是整個頁面

訪問看一下打印運行的結果

1.5 Overwrite(document.x)

1.5.1 打印cookie

自帶的cookie值,網站:

最開始是沒有cookie的

1.5.2 給他重新定義,寫一個cookie

<body></body>
<script>let div = document.createElement('div')div.innerHTML = '<img name=cookie>'document.body.appendChild(div)console.log(document.cookie)
</script>
</html>

再次訪問頁面的cookie

改變了系統自帶的cookie值

所以直接覆蓋掉了系統函數的document.cookie

1.6?Overwrite2(document.x.y)

1.6.1 form表單

<body><form name="body"><img id="appendChild" src=1 onerror="alert(1)"></form>
</body>
<script>console.log(document.body.appendChild)
</script>

?

訪問彈一,并且取代了系統函數打印出來是這個

1.7 toString

按照以上兩種我們獲取的都是html的標簽elment元素的值,但是其實對于大多數的情況我們需要的應該是一個可控的字符串的類型

  • toString()?是什么?
    是 JavaScript 等語言中?對象的內置方法(繼承自?Object.prototype),默認行為是返回類似?[object 構造函數名稱]?的字符串(比如?{}.toString()?返回?[object Object][].toString()?返回?[object Array])。

  • “派生類” 指什么?
    指?繼承自父類的子類(比如自定義類?class Dog extends Animal?中,Dog?就是?Animal?的派生類)。

2. 設計目的:“重寫類型轉換邏輯”
  • 默認邏輯的不足
    原生?Object.prototype.toString()?只反映對象的 “類型標簽”(如?Object/Array),但實際開發中,我們希望對象轉成字符串時?攜帶更具體的信息(比如?person.toString()?返回?"{name: 'Alice', age: 20}")。

  • 重寫的作用
    通過在?派生類中重寫?toString(),可以自定義?“對象 → 字符串” 的類型轉換規則。例如:

    javascript

    class Person {constructor(name) { this.name = name; }// 重寫 toString,自定義字符串轉換邏輯toString() { return `Person: ${this.name}`; }
    }
    const alice = new Person('Alice');
    console.log(alice.toString()); // 輸出 "Person: Alice"(而非默認的 "[object Object]")
    
3. 延伸:“類型轉換” 的場景

toString()?會在以下?隱式類型轉換場景?中被自動調用:

  • 拼接字符串時:console.log('Hello ' + alice)(等價于?'Hello ' + alice.toString())。
  • 使用?String()?函數轉換對象:String(alice)(內部調用?alice.toString())。

因此,重寫?toString()?本質是?定制對象在這些場景下的表現,屬于 “類型轉換邏輯” 的一部分。

簡單總結:toString()?讓對象能自己決定 “怎么變成字符串”,派生類重寫它,就是為了讓轉換結果更符合業務需求

要將基本的 Object.prototype.toString() 用于重寫的對象(或者在 null 或 undefined 上調用它),你需要在它上面調用 Function.prototype.call() 或者 Function.prototype.apply(),將要檢查的對象作為第一個參數傳遞(稱為 thisArg)。

1.8 可控字符串a標簽的屬性等

1.8.1 a href

a標簽的href屬性里面可以輸入可控的字符串,所以我們可以利用這個來進行,來獲取heref的內容

所以我們可以通過以下代碼來進行 fuzz 得到可以通過 toString 方法將其轉換成字符串類型的標簽

Object.getOwnPropertyNames(window).filter(p => p.match(/Element$/)).map(p => window[p]).filter(p => p && p.prototype && p.prototype.toString !== Object.prototype.toString)
逐步驟分析結果由來:
  1. Object.getOwnPropertyNames(window)
    先獲取?window?對象的所有 “自有屬性名”(字符串形式),包括可枚舉和不可枚舉屬性(如各種 DOM 構造函數、全局方法等)。

  2. .filter(p => p.match(/Element$/))
    篩選出屬性名?以 “Element” 結尾?的字符串。
    原因:DOM 元素的構造函數通常以此結尾(如?HTMLElementHTMLDivElementHTMLImageElementSVGElement?等)。

  3. .map(p => window[p])
    將上一步篩選出的屬性名,轉換為對應的?window?對象屬性值 —— 即?DOM 元素構造函數本身(如?window.HTMLDivElement?對應?HTMLDivElement?構造函數)。

  4. .filter(p => p && p.prototype && p.prototype.toString !== Object.prototype.toString)
    最終篩選出滿足以下條件的構造函數:

    • p?存在(排除 null/undefined);
    • p.prototype?存在(構造函數有原型對象);
    • 原型上的?toString?方法?不是?Object?原生的?toString(即該方法被重寫過)。
最終結果的本質:

返回所有?“名稱以 Element 結尾” 且 “原型重寫了 toString 方法” 的 DOM 元素構造函數

這些構造函數對應的 DOM 元素(如?<div><img>?等),其?toString?行為已被定制(而非使用?Object?的默認實現),例如?HTMLDivElement?實例的?toString()?可能返回更具體的字符串(而非?[object Object])。

?打印代碼結果:

分析知道有以下兩個:

我們可以得到兩種標簽對象:HTMLAreaElement (<area>) & HTMLAnchorElement (<a>) ,這兩個,標簽對象我們都可以利?href 屬性來進?字符串轉換。

1.9 alert執行script

首先看一下我們的1.4的內容知道可以通過console.log(x)打印HTML標簽,那么:
 <a  id="a" href="aaaa"></a>
console.log(a)

結果:

1.9.*? 和alert的區別

直接alert(a),他將我們的href屬性以string的形式給打印了出來

所以他用alert直接調用了a里面的tostring方法,將href里面的值打印了出來。

你將a當作函數的參數的時候,會自動調用a的tostring方法,而a的tostring是自身方法,不是繼承的,他可以打印herf中的內容

1.10 利用DOM破壞

1.10.1 ok

通過以上的分析和拓展我們應該有了一個大概的思路,首先回到1.3:

1 ok可以從a標簽的id來,因為通過打印a標簽的id可以直接將a標簽打印出來

1.10.2 payload:

2 惡意代碼payload:<a id=ok href=javascript:alert(1)>

1.10.3 setTimeout

3 這是個函數,查看官方文檔解釋:他可以執行字符串,就是說我的ok當傳入函數的參數,利用a標簽自帶的tostring方法將href里面的值當字符串傳遞給setTimeout進行執行

當輸入這個惡意代碼后,調試可以知道,它將JavaScript偽協議給過濾了:

?1.11 DOM框架過濾了JavaScript惡意代碼

框架白名單:

?那我們思考是否可以利用白名單進行繞過呢,那白名單是否可以彈窗呢?試一下

ok,成功繞過?

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

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

相關文章

從數據丟失到動畫流暢:React狀態同步與遠程數據加載全解析

在前端開發中&#xff0c;數據狀態管理與界面同步始終是核心挑戰。近期我在處理一個書簽管理應用時&#xff0c;遇到了遠程數據加載后無法顯示、界面更新異常&#xff0c;甚至動畫閃爍等一系列問題。經過多輪調試與優化&#xff0c;最終實現了數據的正確加載與流暢的界面交互。…

MySQL半同步復制機制詳解:AFTER_SYNC vs AFTER_COMMIT 的優劣與選擇

目錄深入分析與利弊對比1. AFTER_COMMIT (不推薦)2. AFTER_SYNC (強烈推薦&#xff0c;MySQL 8.0 默認)總結與強烈建議最佳實踐 MySQL 半同步復制主要有兩種實現方式&#xff0c;其核心區別在于主庫何時回復客戶端事務提交成功&#xff08;即何時認為事務完成&#xff09;&…

GEE實戰 | 4種非監督分類算法深度解析,附可直接運行的完整代碼

在遙感影像處理領域&#xff0c;非監督分類憑借其無需人工標注樣本的優勢&#xff0c;成為快速了解地物分布的得力助手。它能自動依據像素光譜特征的相似性完成聚類&#xff0c;這種“無師自通”的特性&#xff0c;讓地理空間分析變得更加高效。 今天&#xff0c;我們就來深入…

基于落霞歸雁思維框架的軟件需求管理實踐指南

作者&#xff1a;落霞歸雁 日期&#xff1a;2025-08-02 摘要 在 VUCA 時代&#xff0c;需求變更成本已占軟件總成本的 40% 以上。本文將“落霞歸雁”思維框架&#xff08;觀察現象 → 找規律 → 應用規律 → 實踐驗證&#xff09;引入需求工程全生命周期&#xff0c;通過 4 個階…

企業級AI Agent構建實踐:從理論到落地的完整指南

&#x1f680; 引言 隨著人工智能技術的快速發展&#xff0c;AI應用正在從簡單的工具轉變為智能伙伴。企業級AI Agent作為這一變革的核心載體&#xff0c;正在重新定義我們與軟件系統的交互方式。本文將深入探討如何構建一個真正意義上的企業級AI Agent系統。 &#x1f3af; …

電商項目_性能優化_限流-降級-熔斷

針對電商系統&#xff0c;在遇到大流量時&#xff0c;必須要考慮如何保障系統的穩定運行&#xff0c;常用的手段&#xff1a;限流&#xff0c;降級&#xff0c;拒絕服務。 一、限流 限流算法&#xff1a;計數器、滑動窗口、漏銅算法、令牌桶算法。 限流的方案 前端限流接入…

javaweb開發之Servlet筆記

第五章 Servlet 一 Servlet簡介 1.1 動態資源和靜態資源 靜態資源 無需在程序運行時通過代碼運行生成的資源,在程序運行之前就寫好的資源. 例如:html css js img ,音頻文件和視頻文件 動態資源 需要在程序運行時通過代碼運行生成的資源,在程序運行之前無法確定的數據,運行時…

sqli-labs靶場less26/a

less261.我們打開這一關來看一下&#xff0c;他提示我們空格和其他一些什么都被過濾了2.我們來嘗試繞過,按照之前的做法&#xff0c;可以看到閉合方式為單引號&#xff0c;并且過濾了--與#3.我們來嘗試繞過一下&#xff0c;發現可以以下的方式繞過&#xff0c;空格用&#xff0…

從Docker銜接到導入黑馬商城以及前端登錄顯示用戶或密碼錯誤的相關總結(個人理解,僅供參考)

目錄 一、前言 二、從Docker銜接到導入黑馬點評 三、談談端口映射及我的前端登錄顯示用戶或密碼錯誤 四、總結 一、前言 在學習24黑馬SpringCloud課程時&#xff0c;說實話Docker那一塊再到導入黑馬商城是真的有點折磨&#xff0c;個人感覺老師水平還是很強的&#xff0c;但…

控制建模matlab練習10:滯后補償器

此練習主要是&#xff1a;關于滯后補償器。 ①滯后補償器作用&#xff1b; ②不同滯后補償器的效果&#xff1b; 一、為什么使用滯后補償器 滯后補償器&#xff1a;主要用于改善系統的穩態誤差&#xff1b;滯后補償器設計思路&#xff1a;同時為系統增加一個極點和零點&#xf…

力扣-108.將有序數組轉換為二叉搜索樹

題目鏈接 108.將有序數組轉換為二叉搜索樹 class Solution {public TreeNode Traverse(int[] nums, int begin, int end) {if (end < begin)return null;int mid (begin end) / 2;TreeNode root new TreeNode(nums[mid]);root.left Traverse(nums, begin, mid - 1);ro…

`npm error code CERT_HAS_EXPIRED‘ 問題

問題: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://r2.cnpmjs.org/string_decoder/-/string_decoder-1.3.0.tgz failed, reason: certificate has expired npm error A complete log of this run can be found in: /home…

數據結構---概念、數據與數據之間的關系(邏輯結構、物理結構)、基本功能、數據結構內容、單向鏈表(概念、對象、應用)

數據結構在數據結構部分&#xff0c;研究數據在內存中如何存儲。數據存儲的形式有兩種&#xff1a;變量和數組&#xff08;數據結構的順序表&#xff09;。一、什么是數據結構&#xff1f;數據類型被用來組織和存儲數據。程序設計 數據結構 算法二、數據與數據之間的關系1、邏…

CMS框架漏洞

一、WordPress姿勢一1.下載vulhub靶場cd /vulhub/wordpress/pwnscriptum docker-compose up -d2.我們進入后臺&#xff0c;網址拼接/wp-admin/3.我們進入WP的模板寫入一句話木馬后門并訪問其文件即可GetShell4然后我們拼接以下路徑/wp-content/themes/twentyfifteen/404.php&am…

控制建模matlab練習07:比例積分控制-③PI控制器的應用

此練習主要是比例積分控制&#xff0c;包括三部分&#xff1a; ①系統建模&#xff1b; ②PI控制器&#xff1b; ③PI控制器的應用&#xff1b; 以下是&#xff0c;第③部分&#xff1a;PI控制器的應用。 一、比例積分控制的應用模型 1、整個系統是如圖&#xff0c;這樣一個單位…

【MySQL】MySQL 中的數據排序是怎么實現的?

MySQL 數據排序實現機制詳解 MySQL 中的數據排序主要通過 ORDER BY 子句實現&#xff0c;其內部實現涉及多個優化技術和算法選擇。讓我們深入探討 MySQL 排序的完整實現機制。 一、排序基礎&#xff1a;ORDER BY 子句 基本語法&#xff1a; SELECT columns FROM table [WHERE c…

JVM-垃圾回收器與內存分配策略詳解

1.如何判斷對象已死1.1 對象引用的4種類型&#xff08;強軟弱虛&#xff09;1.1.1 強引用特點&#xff1a;最常見的引用類型&#xff0c;只要強引用存在&#xff0c;對象絕不會被回收Object strongObj new Object(); // 強引用注意&#xff1a;集合類型&#xff0c;如果對象不…

新手向:簡易Flask/Django個人博客

從零開始搭建個人博客:Flask與Django雙版本指南 本文將詳細講解如何使用兩種主流Python框架構建功能完整的個人博客系統。我們將從零開始,分別使用輕量級的Flask框架和功能全面的Django框架實現以下核心功能: 用戶認證系統: 用戶注冊/登錄/注銷功能 密碼加密存儲 會話管理…

使用 Trea cn 設計 爬蟲程序 so esay

使用 Trea cn 設計 爬蟲程序 so esay 在現代數據驅動的時代&#xff0c;網絡爬蟲已成為數據采集的重要工具。傳統的爬蟲開發往往需要處理復雜的HTTP請求、HTML解析、URL處理等技術細節。而借助 Trea CN 這樣的AI輔助開發工具&#xff0c;我們可以更高效地構建功能完善的爬蟲程…

MySQL Redo Log

MySQL Redo Log MySQL主從復制&#xff1a;https://blog.csdn.net/a18792721831/article/details/146117935 MySQL Binlog&#xff1a;https://blog.csdn.net/a18792721831/article/details/146606305 MySQL General Log&#xff1a;https://blog.csdn.net/a18792721831/artic…