最近发现了几个专门训练XSS的网站,我在这方面还是弱项,决定把这几个网站的题都刷一遍,然后写一写WP,也算是增强记忆和理解吧,我找的几个网站如下:
首先我会记忆一下第一个网站的题目:
前三题都较简单,从第四题说起:
0x03
我们看一下网站代码,发现他是过滤了 圆括号。
绕过这个过滤,我们可以直接使用反引号:
关于反引号在XSS中的最新运用,大家可以参考下面的一片文章:
0x04
这道题,我们可以看到我们将 圆括号和 反引号都过滤了,也就是我们不能运用模板字符串了。
我们想到,我们是否可以使用 unicode 编码,来代替 圆括号。 这种思路没错,但是我们要遇到一个问题就是 unicode 编码怎么才会被转码实现了,如果只是正常的 html编码, unicode编码是不会有任何用的。
这里我们可以在了解一下 <svg> 这个标签,这是一个外部标签,可以显示文字,字符及其他数据。 而 <svg> 有一个 很重要的特性,便是 他可以和 xml 一样将 unicode 编码转码进行执行,也就是我们可以通过这个标签执行 unicode编码,关于这个标签的具体介绍,我们可以查看下面这篇资料:
https://www.hackersb.cn/hacker/85.html
又或者可以H5中iframe的特点,因为h5中iframe的srcdoc属性,srcdoc里的代码会作为iframe中的内容显示出来,srcdoc中可以直接去写转译后的html片段。
<iframe srcdoc="<script>alert(1)</script>">
0x05
这道题,我们过滤了 -->, 这是一个注释的结尾符, 但是我们又急需将这个网页中的 注释符 赶快闭合。
这里,我们可以知道 注释符的闭合符有两种:
<!-- xxx -->
<!- xxx --!>
所以,我们可以采用第二种注释符
0x06
这道题过滤了 auto字符串 或者 on或空开头到=之间的字符串 或者 > 。
所以,这里我们想直接 注入 <script> </script>是不成功的,因为,我们的 >会被过滤掉。
这里,我们看到在input标签注入,我么就可以使用 onmousemove这个属性,这个属性是当鼠标移到input这个输入框时,就会被执行的属性。 我们可以注入: οnmοusemοve=alert(1)
但是,我们这里还有一个问题,就是 onmousemove 这个注入,是以on开头且中间有=,所以我们最终的输入会被正则过滤如下:
onmosemove= 这段字符串会被过滤,所以这里我们需要想一些办法。
我们再来仔细查看上面的正则表达式:
on.*=
这个过滤,中间有 小数点:
那我们就知道,它不匹配换行符,所以如果我们在 onmousemove = alert(1)之间使用换行符,那么这个正则表达式就会匹配无法成功。
我们可以成功绕过
0x07
这道题主要是对 < 和 >进行了过滤,也就是我们不能同时输入 < 和 >。
所以,这里我们可以运用 浏览器的容错性,当我们少输入一个 >时,浏览器仍然会解释执行我们输入的标签语言。
所以,这里我们只需要考虑 输入一个 单标签 执行语句。
这里,大家可以参考下面这篇博文,我在里面发现了很多 XSS的payload,大家可以尽情测试:
然后,我测试成功了两个标签:
0x08
这道题,主要是对 </style> 这个字符串进行了过滤,但是我们仍然可以采用空格或者换行的方法进行绕过。
0x09
这道题,我们的输入需要含有这个网址,然后,我们需要闭合一个 <script>标签,然后注入我们的代码。
0x0B
题目我们可以看到,就是对我们的输入转为了大写。
但是,JS是严格区分大小写的,html是不区分的。
所以,这道题我们有两种思路:一是寻找JS中不区分大写的部分;二是使用 html标签
第一种:JS中的 src 的值是不区分大小写的,所以我们可以使用如下:
第二种,我们可以使用html标签,运用其解析unicode编码执行,如 img, audio,
0x0C
这道题,其实就是在上一题的基础上对 script进行了过滤,所以我们可以使用上一题的第二种方法绕过
0x0D
这道题的过滤,主要是对 < / " '进行了过滤。
而我们也需要对注释进行绕过,对于前面的注释,我们只需要一个换行符即可,但是对于后面的 ‘) 我不太明白 为什么 --> 可以进行绕过。
0x0E
这道题学到新知识了,我们看这个过滤,对以 < 开头的字符串进行过滤,那么基本上所有的 标签都会被过滤。
但是,我们发现了一个新字符: ſ 。 它大写之后会被转为S,然而他却不是字母。
那么,我们的过滤方法如下:
0x0F
这里我们可以看到这个过滤,是将一些字符进行了转码,但是我们的 ’ 和 / 都是被转为了 unicode编码,所以这个实体编码仍然可以执行。所以,我们目前的任务就是先闭合 console.error(''),仍然执行JS。
0x10
这道题,不用多说,直接闭合,然后写入 alert()
0x11
这道题过滤了相当多的符号。但是我们的思路,还是可以放到闭合符号再注入。
但是,由于我对JS的代码的了解不是太多,所以,导致这道题的闭合方法,我也有点不清楚,我贴一下别人的解决方法:
0x12
这道题由于将 " 替换成 \\", 但是在实际上只会输出 \" 。