??? ??鄭重聲明:?本文所有安全知識與技術,僅用于探討、研究及學習,嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任,本人不承擔任何責任。 如需轉載,請注明出處且不得用于商業盈利。?
? ? 💥👉點贊?? 關注🔔 收藏?? 評論💬💥?
? ? 更多文章戳👉Whoami!-CSDN博客🚀
??????
𖤐?嘿,經過前面的預熱,我們正式打開這扇門,來吧 !?
𖤐 𝓗𝓮𝔂,?𝓪𝓯𝓽𝓮𝓻 𝔀𝓪𝓻𝓶-𝓾𝓹,𝔀𝓮'𝓻𝓮 𝓷𝓸𝔀?𝓸𝓯𝓯𝓲𝓬𝓲𝓪𝓵𝓵𝔂 𝓸𝓹𝓮𝓷𝓲𝓷𝓰 𝓽𝓱𝓲𝓼 𝓭𝓸𝓸𝓻,𝓒𝓸𝓶𝓮 𝓸𝓷?!?
→ 信息收集
→ 漏洞檢測
→ 初始立足點?WEB應用攻擊?XSS攻擊理論基礎-----我們在這兒~?🔥🔥🔥
→?權限提升?
→ 橫向移動
→ 報告/分析
→ 教訓/修復??
目錄
1.跨站腳本攻擊(XSS)
1.1 XSS類型
1.1.1 存儲型XSS(持久型XSS)
1.1.2??反射型XSS(非持久型XSS)
1.1.3?基于DOM的XSS
1.1.3.1 什么是DOM
1.DOM可視化表示
2.HTML文件與DOM樹的區別
3.DOM樹的三大特點
4.示例說明
1.1.3.2 DOM XSS概述
1.與傳統XSS的對比
2.DOM型XSS攻擊流程
1.1.3.3?防御策略與最佳實踐
1.關鍵防御措施
2.框架安全實踐
3.檢測與排查建議
1.2?JavaScript概述
1.2.1 JavaScript在Web中的角色
?1.2.2 JavaScript 的雙面性:功能與風險
1.2.3?JavaScript概述
1.3 識別XSS漏洞
1.3.1?XSS漏洞識別流程
1.3.2?常見XSS入口點
1.3.3?特殊字符過濾檢測
?1.3.4 Web應用程序編碼方式
💥創作不易💥求一波暴擊👉點贊?? 關注🔔 收藏?? 評論💬
1.跨站腳本攻擊(XSS)
? ? ? ? 跨站腳本攻擊(XSS)是一種利用網站對用戶信任的安全漏洞,攻擊者通過注入惡意腳本(如:JavaScript)到網頁中,當其他用戶訪問時執行這些腳本。曾經被認為是低風險漏洞,如今XSS已成為高風險且普遍的安全威脅。
? ? ? ??XSS漏洞根源在于數據清理不足:即Web應用程序未能正確處理用戶輸入,未刪除或轉換危險字符和字符串,導致攻擊者能夠注入并執行惡意代碼。
1.1 XSS類型
?XSS類型對比表:
類型 | 存儲機制 | 影響范圍 | 持久性 | 觸發方式 |
---|---|---|---|---|
🔒 存儲型XSS | 惡意代碼存儲在服務器數據庫 | 所有訪問受影響頁面的用戶 | 長期存在 | 用戶瀏覽正常頁面 |
?? 反射型XSS | 不存儲,通過URL參數傳遞 | 僅點擊惡意鏈接的用戶 | 一次性 | 用戶點擊特制鏈接 |
1.1.1 存儲型XSS(持久型XSS)
解釋:存儲型XSS是將惡意內容“存儲”在服務器上,之后當任何人訪問該頁面時,惡意代碼就會自動執行,影響到所有訪問該頁面的用戶。
比喻:就像把一張惡意紙條放入公共郵箱,所有查看郵箱的人都會受到影響。
詳細步驟:
-
用戶輸入評論?- 在輸入框提交包含惡意JavaScript的文本(如:
<script>alert('XSS Attack!')</script>
-
客戶端操作?- 點擊“提交”按鈕,評論內容通過AJAX或表單提交發送到服務器端。
-
服務器端存儲?- 未經充分過濾直接將評論內容存入數據庫的某個表中。
-
數據庫保存?- 保存的內容若沒有做適當的過濾或轉義,惡意的 <script> 標簽也會一起存儲)。
-
展示評論?- 其他用戶訪問時該頁面時,網站從數據庫讀取并展示評論內容,惡意的 <script> 標簽可能會被插入到頁面中,發給客戶端瀏覽器。
-
XSS攻擊發生?- 客戶端瀏覽器渲染頁面時,惡意的JavaScript代碼就會被執行。例如,惡意的JavaScript代碼觸發彈出警告框,或者進行其他有害操作(例如竊取用戶的Cookies、重定向用戶等)。
1.1.2??反射型XSS(非持久型XSS)
比喻:就像收到含惡意鏈接的郵件,只有點擊鏈接的人才會受到影響。惡意信息就會通過鏈接進入到你的瀏覽器中。
詳細步驟:
- 攻擊者構造惡意URL
- 誘導用戶點擊
- 服務器返回含惡意代碼的響應
- 瀏覽器執行惡意腳本
特點:
- 攻擊惡意代碼不存儲在服務器上
- 通過URL參數傳遞惡意載荷
- 需要社交工程誘導用戶點擊
1.1.3?基于DOM的XSS
1.1.3.1 什么是DOM
DOM(文檔對象模型)?是瀏覽器用來表示和操作網頁的內部數據結構。當網頁加載時,瀏覽器將HTML轉換為樹形結構(DOM):每個標簽、文本和屬性都成為樹的一個節點。瀏覽器根據這個結構渲染頁面。
1.DOM可視化表示
?
2.HTML文件與DOM樹的區別
特性 | HTML文件 | DOM樹 |
---|---|---|
本質 | 靜態純文本文件 | 動態樹狀結構 |
內容 | 標簽、屬性和內容 | 節點(Node)及其關系 |
狀態 | 固定不變 | 可動態修改,通過JavaScript修改 |
用途 | 描述網頁結構和內容 | 瀏覽器內部頁面表示 |
樣式:
?
3.DOM樹的三大特點
① 樹狀結構
-
每個HTML元素都是一個節點(Node)
-
節點間形成父子關系
-
html
是根節點,head
和body
是其子節點
② 動態性(?? 安全關鍵)
-
可通過JavaScript動態修改
-
能添加、刪除或修改節點
-
正是這一特性導致DOM XSS攻擊的可能性
③ 可訪問性
-
可通過JavaScript訪問任何節點
-
提供豐富的API進行操作
4.示例說明
?
以上是JavaScript 代碼。功能:修改?<h1>
?標簽內容。該代碼通過操作 DOM(文檔對象模型),實現對網頁中?<h1>
?標簽文本內容的修改,各部分說明如下:
代碼片段 | 類型 | 作用說明 |
---|---|---|
document | 對象 | JavaScript 中代表當前網頁文檔的根對象,是訪問和操作整個 DOM 樹的入口。 |
.querySelector('h1') | 方法 | document ?的內置方法,通過?CSS 選擇器查找元素:-? 'h1' ?為 CSS 選擇器,匹配所有?<h1> ?標簽;- 僅返回第一個匹配的? <h1> ?元素。 |
.textContent | 屬性 | DOM 元素的內置屬性,用于獲取或設置元素的純文本內容(不含 HTML 標簽)。 |
= '你好!' | 賦值操作 | 將找到的?<h1> ?元素的?textContent ?屬性值設置為?'你好!' ,替換其原有文本。 |
1.1.3.2 DOM XSS概述
基于DOM的XSS攻擊利用瀏覽器解析機制,通過修改頁面DOM植入惡意JavaScript代碼,在用戶瀏覽器中觸發執行。
1.與傳統XSS的對比
特性 | 傳統XSS(存儲型) | 基于DOM的XSS |
---|---|---|
執行位置 | 服務器端 | 純客戶端(通過JS操作) |
服務器依賴 | 需要服務器返回惡意代碼 | 不依賴服務器響應 |
檢測難度 | 相對容易 | 難以檢測 |
數據流 | 服務器-客戶端 | 客戶端內部 |
2.DOM型XSS攻擊流程
-
🖊? 用戶輸入提交?- 在網頁的表單/輸入框提交包含惡意腳本的評論內容:
<script>alert('XSS Attack!');</script>
-
🔄 客戶端處理?- 網站JavaScript代碼從網頁上獲取評論內容,并通過document.getElementById方法動態地將其插入到網頁中:
// 危險示例:未經過濾直接使用 const userInput = document.getElementById('comment').value;
-
🌳 DOM操作?- 通過
innerHTML
、document.write()
等方法動態插入內容document.body.innerHTML += userInput; // 直接插入DOM
-
? 瀏覽器解析?- 如果網站的JavaScript代碼沒有正確處理你的輸入,惡意的 <script> 標簽會被當做代碼直接執行(直接彈框),即在客戶端瀏覽器執行了惡意 <script> 標簽。
-
💥 攻擊執行?- 惡意腳本在用戶瀏覽器中執行,比如:竊取cookie、重定向等。
1.1.3.3?防御策略與最佳實踐
1.關鍵防御措施
-
? 輸入驗證與過濾
-
對所有用戶輸入進行嚴格驗證
-
使用白名單機制允許安全內容
-
-
? 安全DOM操作
-
避免使用
innerHTML
、outerHTML
、document.write()
-
優先使用
textContent
、setAttribute
-
-
? 使用安全API
-
采用DOMPurify等庫進行HTML清理
-
實施內容安全策略(CSP)
-
-
? 編碼輸出
-
對動態內容進行適當的編碼
-
區分HTML編碼、JavaScript編碼和URL編碼
-
2.框架安全實踐
// ? 危險方式:直接插入HTML
element.innerHTML = userInput;// ? 安全方式:文本內容設置
element.textContent = userInput;// ? 安全方式:使用專用API
const safeHTML = DOMPurify.sanitize(userInput);
element.innerHTML = safeHTML;
// React示例:自動轉義內容
<div>{userInput}</div> // 自動安全處理// Vue示例:安全模板渲染
<template>{{ userInput }}</template>
3.檢測與排查建議
代碼審查要點
-
檢查所有使用
innerHTML
的地方 -
審查
eval()
、setTimeout()
、setInterval()
中的動態代碼 -
檢查URL解析和處理邏輯(
location
、hash
、search
)
測試方法
-
使用自動化掃描工具(如OWASP ZAP、Burp Suite)
-
手動測試:輸入特殊字符觀察行為
-
檢查數據流:從源點到危險函數調用
1.2?JavaScript概述
JavaScript是一種高級編程語言,已成為現代Web應用程序的核心組成部分。所有現代瀏覽器都內置JavaScript引擎,能夠在瀏覽器中直接執行JavaScript代碼。
1.2.1 JavaScript在Web中的角色
瀏覽器處理流程:
?1.2.2 JavaScript 的雙面性:功能與風險
1.正常功能
JavaScript的核心作用:訪問和修改頁面DOM(文檔對象模型),從而實現:
- 交互式用戶體驗(如點擊按鈕后即時更新內容)
- 動態頁面效果(無需重新加載整個頁面即可更新內容)
- 提升網頁的交互性和響應速度
2.安全風險(從攻擊者角度)
若攻擊者成功將惡意JavaScript代碼注入應用程序,可利用其DOM訪問能力實施不法行為:
- 篡改頁面元素(如重定向登錄表單至釣魚網站)
- 竊取敏感信息(如提取用戶輸入的密碼)
- 盜用用戶會話(如獲取并利用會話 Cookie)
1.2.3?JavaScript概述
函數聲明與調用
// 第1-3行:函數聲明
function multiplyValues(x, y) {return x * y;
}// 第5行:函數調用
let a = multiplyValues(3, 5);// 第6行:控制臺輸出
console.log(a); // 輸出: 15
🔤 弱類型語言特性
JavaScript是弱類型語言,變量類型由賦值自動推斷,無需給變量定義類型:
let variable = 15; // 數字類型
variable = "文本"; // 現在變為字符串類型
variable = true; // 現在變為布爾類型
🛠? 瀏覽器“開發者工具”實踐
-
在Firefox瀏覽器打開
about:blank
空白頁 -
通過以下方式打開開發者工具:
-
菜單:Web開發者?→?Web控制臺
-
快捷鍵:
Ctrl+Shift+K
?(Windows) /?Cmd+Shift+K
?(Mac) -
在控制臺中,執行函數并檢索輸出。將值打印到瀏覽器的控制臺console。
-
?
1.3 識別XSS漏洞
1.3.1?XSS漏洞識別流程
1.3.2?常見XSS入口點
入口點類型 | 示例 | 風險等級 |
---|---|---|
🔍 搜索框 | 網站搜索功能 | 🔴 高風險 |
💬 評論框 | 博客評論、論壇回復 | 🔴 高風險 |
📝 表單字段 | 聯系表單、注冊表單 | 🔴 高風險 |
👤 用戶資料 | 用戶名、個人描述 | 🟡 中風險 |
🌐 URL參數 | ?search=keyword | 🔴 高風險 |
📊 文件上傳 | 文件名、元數據 | 🟡 中風險 |
💡?檢測提示:重點關注所有接受用戶輸入的區域,特別是那些會將輸入內容返回給用戶的功能。
1.3.3?特殊字符過濾檢測
如果應用程序不刪除或編碼這些字符,說明它容易受到XSS攻擊。因為應用程序將這些字符解釋為代碼,從而使額外的代碼得以執行。
關鍵測試字符集:
字符 | HTML用途 | XSS測試意義 | 編碼表示 |
---|---|---|---|
< > | 標簽界定 | 腳本標簽注入 | < ?> |
' " | 字符串界定 | 屬性逃逸 | ' ?" |
{ } | 代碼塊界定 | JS函數注入 | { ?} |
& | 實體引用 | 編碼繞過 | & |
; | 語句結束 | 多語句注入 | ; |
測試方法:
-
輸入基本測試載荷:
<script>alert('XSS')</script> # 彈框效果
-
檢查響應:
- 如果彈窗出現 → 說明漏洞存在
- 如果字符被編碼/過濾 → 需要進一步分析
?1.3.4 Web應用程序編碼方式
編碼(Encoding)在Web應用中的作用,尤其是利用編碼方式進行XSS(跨站腳本攻擊)。雖然有多種類型的編碼,但在Web應用程序中最常遇到的是HTML編碼和URL編碼。
📊 編碼類型對比表:
編碼類型 | 目的 | 示例 | 安全意義 |
---|---|---|---|
🔗 URL編碼 (百分比編碼) | 保護URL結構 | 空格 →?%20 | 防止URL注入 |
🌐 HTML編碼 | 防止特殊意義的字符(比如 <, >, &, ", ' 等)被誤解釋為HTML標簽、屬性或腳本的一部分 | < ?→?< | XSS防護關鍵 |
📝 JavaScript編碼 | JS字符串安全 | " ?→?\x22 | 防止JS注入 |
🛡? HTML編碼詳解:
字符 | 編碼 | 說明 |
---|---|---|
< | < | 小于號 |
> | > | 大于號 |
& | & | 和號 |
" | " | 雙引號 |
' | ' | 單引號 |
HTML編碼示例:
<!-- 原始文本: -->
<script>alert("XSS")</script><!-- HTML編碼后: -->
<script>alert("XSS")</script>
URL編碼示例:
原始URL:https://example.com/search?q=<script>
編碼后:https://example.com/search?q=%3Cscript%3E
又例如:
如果想在網頁上顯示 < 和 >,直接寫 < 和 >會讓瀏覽器誤認為它們是HTML標簽的標記。需要使用HTML編碼來顯示這些字符。即:<和>以文本方式輸出,而非HTML標簽的標記。
?
💥創作不易💥求一波暴擊👉點贊?? 關注🔔 收藏?? 評論💬
您的支持是我創作最大的動力!
?