XSS挑战之旅-level1-level20
0x01:前言
基础漏洞梳理,依旧白盒为主。
0x02:环境搭建
直接下载项目 https://github.com/do0dl3/xss-labs 放到lamp-html目录即可
0x03:开始练习
1、level 1
此关卡无任何过滤,直接拼接了参数,导致了任意标签执行
观察代码:
所以payload:<script>alert(1)</script>
2、level 2
此关卡为文本框xss,代码无过滤,代码如下
此关直接使用script标签已经无法弹窗,原因在于文本框本来就是input标签,我们查看源代码的from标签。
发现payload被value值的双引号包裹,这就意味着我们无论输入何值,它都会被当作一个字符串,也就无法执行script标签。
因此我们将value的第一个双引号闭合,再将input标签闭合,即可执行我们定义的标签。
payload:1"/><script>alert(1)</script>
3、level 3
我们查看源代码
源代码使用了htmlspecialchars()函数对尖括号等特殊符号进行转义,
htmlspecialchars()函数
htmlspecialchars()函数是使用来把一些预定义的字符转换为HTML实体,返回转换后的新字符串,原字符串不变。如果 string 包含无效的编码,则返回一个空的字符串,除非设置了 ENT_IGNORE 或者 ENT_SUBSTITUTE 标志;
被转换的预定义的字符有:
也就是说尖括号无法使用,也就无法使用标签,但是依然可以使用事件进行弹窗。
比如
onclick事件
当点击按钮时执行一段 JavaScript: 该属性由元素上的鼠标点击触发
我们查看源代码的from标签
我们首先要闭合value的单引号,那么我们就可以使用这样的payload:1' onclick=alert(1)
但是别忘了,input标签是未被闭合的,这就导致payload依然无法独立作为一个事件执行,但是我们可以注释掉input标签的后半段。
payload:1' onclick=alert(1)//
黑盒做法:
我们输入正常的payload进行测试,比如<script>alert</script>
点击发送后查看源代码
发现尖括号已经被转义,根据特征可知源代码使用的是 htmlspecialchars()函数 ,所以我们选择事件进行测试:
首先需要闭合value的单引号,然后要闭合input标签,所以给出payload: 1' onclick=alert(1)// ,测试后成功弹窗。
4、level 4
我们观察源码
可见此关卡对尖括号进行了删除操作,且使用了 htmlspecialchars()函数 二次过滤,导致无法使用html标签进行突破,但是事件并未过滤,所以突破点依然是事件。
我们观察页面源码的from标签
发现与level 3的区别仅仅在于value的单引号变为了双引号,因此给出payload: 1" onclick=alert(1)//
5、level 5
我们查看源代码
首先strtolower()函数将接收到的值全部转化为小写,这就过滤了大小写混合绕过这个姿势。然后使用正则将<script、on两个关键字替换,也就是说script标签和onclick事件无法使用了。
虽然过滤了onclick标签,但是a标签并未被过滤
<a>标签
<a>标签定义超链接,用于从一张页面链接到另一张页面。
<a>元素最重要的属性是href属性,它指示链接的目标。
示例:<a href="http://127.0.0.1">local</a>
这里给出一个payload:"><a href="javascript:alert(1)">//
首先闭合value的双引号,然后href属性调用javascript的alert()函数。最后将input标签后半段注释。
这里要注意的是,输入payload并不会马上弹窗,而是需要点击变为超链接的文本,如
之所以出现两个也很好解释
这两个都是因为由于未闭合<a>标签,<a>标签后的文本会被当作该超链接的介绍。所以就都变为了链接
6、level 6
我们查看源代码
可见过滤了script标签、onclick事件、和href。但是由于代码未进行统一大小写过滤,这就导致了可以使用大小写混合绕过。
payload: "><a hRef="javascRipt:alert(1)">//
同样需要点击超链接触发。
7、level 7
我们观察源码:
这次代码做了统一小写和正则过滤关键字,因此大小写混合绕过已经不行了,但是由于正则操作是删除动作,所以可以使用双写绕过。
payload: "><a hrhrefef="javascrscriptipt:alert(1)">//
同样需要点击超链接触发
8、level 8
我们查看源代码:
可见这次对于文本框的过滤已经很难突破了,代码做了统一小写,正则替换字符,和过滤危险符号操作。
但是由于该页面文本框功能为增加一个链接,所以href属性本来就存在,如上图,所以我们只需要将脚本实体绕过输入即可。
由于代码过滤了script关键字,且做了统一小写,所以无法使用大小写绕过和双写绕过,但是依然可以使用编码绕过。
如html编码:
payload:
9、level 9
我们查看源代码:
可见对于参数的过滤和level 8是相同的,但是与level 8不同的是增加了url合法性判断,即判断是否存在http://
所以只需在payload增加http://关键字即可,未免造成影响也可在payload后加注释符再拼接http://,虽然绕过了http://判断,但是script还是个问题,这里我们可以参照空格绕过的处理方式,用%0a、%09等绕过
payload:javascr%0aipt:alert(1)//http://
10、level 10
我们查看源码:
可见其将尖括号做了删除转义操作,所以从keyword参数无法进行xss,但是可见下面还有一个参数t_sort,且这个参数只进行了删除尖括号操作,所以可以通过这个参数突破。
当然这个参数也可以在源码from表单看见
我们可以通过测试得出哪个是真的参数。
:?keyword=well done!&t_ilnk=" tyoe="text" 1&t_history=" type="text" 2&t_sort=" type="text" 3
payload: ?keyword=well done! &t_sort=" type="text" onclick="alert(1)
11、level 11
我们观察源码
发现存在三个参数,其中参数keyword、t_sort已经无法进行xss,因为特殊符号已经被 htmlspecialchars()函数 转义。
但是还有一个参数HTTP_REFERER未过滤,所以这里就是突破点
由于HTTP_REFERER该参数取自http头中的referer参数,所以我们将payload放到http头的referer参数即可。
payload:Referer: " type="text" onclick="alert(1)
12、level 12
观察源码:
可见第三个参数由 Referer 变为了USER_AGENT,同样的,这也是http头的一个参数。抓包修改即可。
payload:" type="text" onclick="alert(1)"
13、level 13
依旧是查看源码
可见漏洞点由http头字段转向了cookie,$_COOKIE超全局变量,用于接收cookie中的数据
所以突破点在cookie的user字段,继续抓包改包即可
payload:Cookie: user=" type="text" onclick="alert(1)"
14、level 14
这里的网站已经炸了,不知道是需要翻墙还是网站自己关闭的,所以上不去。查看了先知社区后得知该关卡考点为图片的exif属性,也就是图片的属性(大小拍摄时间等等),也就是exif xss
大致攻击过程是上传一张属性改为js代码的图片,然后访问图片达到xss效果。
具体可以看下先知的帖子: https://xz.aliyun.com/t/1206?accounttraceid=74ab404d-2a01-4a1c-8b87-36ad367dbe11#toc-12
15、level 15
查看网页源码
发现一个特殊的指令ng-include
ng-include 指令用于包含外部的 HTML 文件。
也就是说相当于include,可以包含某个可以执行xss漏洞的文件 ,只要让alert触发即可,我们可以包含level1
查看源码后
发现$str变量被 htmlspecialchars()函数 处理,所以尖括号会被转义,所以暂时没过去。
留坑
16、level 16
查看源代码
此关卡对参数keyword进行了正则转义关键字,将空格 、斜杠等转义。
由于我们可以使用事件进行xss,所以/对我们来说无所谓,只需绕过空格即可,上面也有提过空格的绕过方法,即使用%0a、 %0d 绕过
payload:?keyword=<img%09src=1%0aonerror=alert(1)>
17、level 17
查看源代码
可见存在两个参数,只过滤了尖括号,所以使用onmouseover事件
onmouseover 属性在鼠标指针移动到元素上时触发。
payload:?arg01=a onmouseover=alert(1)&arg02=b
18、level 18
与17关相同,不知道这一关意义何在
payload: ?arg01=a onmouseover=alert(1)&arg02=b
19、level 19、20
这里属于flash xss 严格来讲已经脱离了web层的xss。有兴趣可以看一下 https://www.jianshu.com/p/4e3a517bc4ea
0x04:后记
关键在于姿势。