XSS Challenges闯关笔记

前言

做xss做疯了再来一个。

地址:https://xss-quiz.int21h.jp/ ,这个貌似是日本的一个安全研究员yamagata21做的。

XSS Challenges闯关笔记_第1张图片

 

做到第九关就跪了,而总共有二十关。一半都还没有,实在是惭愧。第九关考的是utf-7编码绕过实体编码的问题,但是我在最新的chrome和firefox都不能复现。查了好一会资料才发现,utf-7 bom xss是用来bypass ie 7的。

这。。。。

又因为这个挑战后面的关卡,貌似必须得过了前面的关卡才能通关。所以,只好做到这里了,先做个记录,留着以后做吧

关于这个utf-7 xss实在是没弄明白,还有这个关卡通关问题希望有知道的大佬能够指点指点,谢谢了。

百度了一下,看了一些wp,发现一些大佬们关于utf-7 xss的也是没有复现成功。很好奇他们怎么过的,竟然直接firebug前端弹框解决。

我。。。。(这都没想到,™真的是脑塞了。。。)

 

Level 1

第一关通常都非常简单,这里也确实是这样。

没有任何过滤,输出点在标签之间,闭合标签,构造新标签搞定。

参考payload:

"

XSS Challenges闯关笔记_第2张图片

 

Level 2

输出点在标签属性内,闭合双引号,构造on事件。

参考payload:

" οnmοuseοver=alert(document.domain)>

XSS Challenges闯关笔记_第3张图片

 

Level 3

这道题有两个参数,第一个参数是过滤的了,用第二个参数,什么都没过滤。

需要burpsuite抓一下包。

参考payload:


XSS Challenges闯关笔记_第4张图片

成功弹框

XSS Challenges闯关笔记_第5张图片

 

Level 4

这一关有三个参数,一二两个参数都做了过滤,直接看第三个参数。

XSS Challenges闯关笔记_第6张图片

 

我的做法是闭合双引号,闭合input标签,构造新标签。

参考payload:

">%0a  

同样需要抓包

XSS Challenges闯关笔记_第7张图片

 

XSS Challenges闯关笔记_第8张图片

 

Level 5,6

这一关考回头了,和Level 2的payload是一样的,对了,还有Level 6也是一样的payload直接过。

闭合属性,构造on事件。

参考payload:

" οnmοuseοver=alert(document.domain)%0a  

全程开着burpsuite,根本没感受到输入框的长度限制。

XSS Challenges闯关笔记_第9张图片

XSS Challenges闯关笔记_第10张图片

 

Level 7

空格分割属性,参考payload:

test οnmοuseοver=alert(document.domain)

XSS Challenges闯关笔记_第11张图片

XSS Challenges闯关笔记_第12张图片

 

Level 8

javascript:伪协议在a标签的使用

参考payload:

javascript:alert(document.domain)

XSS Challenges闯关笔记_第13张图片

 

Level 9

这一关是利用utf-7编码的,需要环境是IE 7

我用了ie复现也是不能成功,留下个payload吧。

参考payload:

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

直接firebug弹框,过!!2333

 

Level 10

发现过滤了domain关键字,但是只是替换为空而已。

那么可以双写绕过,参考payload:

" οnmοuseοver=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的第八关。

XSS Challenges闯关笔记_第14张图片

得到的是这样子的

XSS Challenges闯关笔记_第15张图片

 

而这里在我用几乎一样的思路的时候却过不了,如payload:

">test  

XSS Challenges闯关笔记_第16张图片

得到的却是这样子的

XSS Challenges闯关笔记_第17张图片

也就是说后面的那一段被截断了。

右键检查发现:

XSS Challenges闯关笔记_第18张图片

被分割为href和pt:alert(1)两个属性了。

起初我怀疑是get和post两种提交方式造成的。

然后本地搭建对比发现之后,其实是一样的。

后台代码如下:

 1 
 2 
 3 test
 4 
 5 
 6 echo 'Post data: '.@$_POST['p'].'
';?> 7 echo 'Get data: '.@$_GET['g'].'
';?> 8 9 10 11

post和get的payload一样,一同输出

XSS Challenges闯关笔记_第19张图片

 

得到的超链接都是"127.0.0.1/javascri"

右键检查发现都是被划分为了两个属性:

XSS Challenges闯关笔记_第20张图片

换了个payload:

javascri%09pt:alert(1)

然后输出在href里面,如同text.xss.tv第八关的输出点一样。

XSS Challenges闯关笔记_第21张图片

 

结果发现两个都被正确解析为了javascript:alert(1)。

经过对比之后,我得出了这样的结论。

%09也就是tab制表符,使用在单个标签之内,会被浏览器`正确`去除,而在跨标签的时候(也就是闭合前面原有标签,使用在构造者构造的新标签的时候)不会被正确去除。也仅仅是%09,其十进制编码和十六进制编码都不会受影响。

后面测试发现%0a和%0d一样受到影响。

在得出了结论之后,我在想为什么会是这样的呢?浏览器解析修正html语法的时候是怎么样修正的呢?

想了很久也查了一些资料,依旧没办法得出结论,也只能暂时先埋个坑在这里了。希望路过的大佬能够解释一下,谢谢!

那么这道题应该怎么过呢?

参考payload:

">test //	 tab制表符html十进制编码
">test //
是html5的换行符,:是冒号

 

成功弹框

XSS Challenges闯关笔记_第22张图片

 

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

 查看提示:

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

把\x00-\x20的字符与及<,>,",'都替换为空。

想着还有什么能够替换空格呢?用 的话还是会没办法跳处value属性。

看了一下sherlock17 大佬的wp,发现了竟然还有一个符号,学到东西了。但是得在IE下才可以。

`  

由于IE的特性,或者说浏览器竞争时代百家争鸣导致的结果,会把`解析为引号。

XSS Challenges闯关笔记_第23张图片

 

那么我们的payload可以是

``οnmοuseοver=alert(1)  

在IE下成功弹框

XSS Challenges闯关笔记_第24张图片

 

Level 13

这一关提示说是style attribute,也就是style的属性问题。

想着闭合双引号试试?结果发现被过滤了,那么就只能是style的payload了。

在wooyun上和owasp上找到了一些payload

如:

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

但在firefox下无法弹框,后来查了写资料发现。

expression这个语法只存在ie上。

于是用ie测试了一下payload,成功弹框,但是陷入了死循环弹框中。(请谨慎使用)

XSS Challenges闯关笔记_第25张图片

 

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

\x3csvg\x2fοnlοad=alert(document.domain)\x3e  

因为是在js范畴,document.write在输出的时候会JavascriptDecode一下数据,会把数据原有\去除,即php里面的stripslashes

所以我们最终的payload应该是这样的。

\\x3csvg\\x2fοnlοad=alert(document.domain)\\x3e

成功弹框:

XSS Challenges闯关笔记_第26张图片

 

Level 16

提示说

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

把\\x 替换成了\\\\x,但是js编码又不止16进制,还有八进制,unicode编码

用unicode编码

\\u003cimg src=x οnerrοr=alert(document.domain)\\u003e

XSS Challenges闯关笔记_第27张图片

 

用八进制编码,同样可以

\\74img src=x οnerrοr=alert(document.domain)\\76

XSS Challenges闯关笔记_第28张图片

 

Level 17,Level 18

https://xss-quiz.int21h.jp/stage-No17.php?sid=0c8ab14016a836126b35d4ed081076aa3ded3aff

看了一下别人的wp,这两关都是考的字符集的问题,且复现有浏览器要求需要在IE 6上复现。暂时不做研究,毕竟夜深了,但日后再研究!

 

总结:

通过这次的xss闯关,总算有点入门的感觉了。xss的世界真的是复杂而又美妙! 

转载于:https://www.cnblogs.com/r00tuser/p/7413526.html

你可能感兴趣的:(XSS Challenges闯关笔记)