xss-labs靶场练习
xss-labs靶场练习
Level 1
观察url的构造,这里是向服务器提交了个名为name的参数,值为text,并且值和值的长度都在页面有回显。
查看网页源码

name参数的值直接插入到了
标签之中。那么这样看来这一关主要就是考察反射型XSS。payload:name=<script>alert('xss')</script>
Level 2

从url地址来看,依然是get方式传递参数,所以猜测考察的还是反射型XSS。只不过这一关将参数名换成了keyword。
查看页面源码

这里有两个地方回显值的地方,利用第一关的payload试试

观察源码,第一处回显处的特殊字符被编码了,不能利用,第二处的回显处可以完整的回显值,可以利用这里构造payload,
这里需要构造闭合
"><script>alert('xss')</script>
Level 3
url构造同上一关

页面源码和上一关的差不多,只是双引号变成单引号

尝试构造payload:
'><script>alert('xss')</script>
发现并没有弹窗,继续观察源码

发现这关的<,>被编码成了html实体。经过查看php文件,在这两处都用htmlspecialchars()函数进行了处理。

所以这里不能用含有<>的payload
这里可以通过<input>标签的一些特殊事件来执行js代码:
' onmouseover=javascript:alert(1) '
Level 4

查看源码

这一关只是把上一关的单引号变成了双引号,payload构造如下
" onmouseover=javascript:alert(1) "
Level 5

查看页面源码

这和上一关的源码差不多,直接用上一关的payload,无法弹窗

发现onmouseover变成了o_nmouseover,经过测试<script>和onclick也被_分隔了
这里不用<input>标签了,把它闭合掉,用a标签试试
"><a href="javascript:alert(1)">link</a> <"

点击link弹窗。进入下一关
Level 6

源码和上一关差不多

尝试使用上一关的payload,并没有出现弹窗


发现这里的href也被_分隔了
因为html对大小写不敏感,即不区分大小写,这里可以试试下面的payload
"><a Href="javascript:alert(111)">link</a> <"

点击link弹窗。进入下一关
Level 7

页面源码与上一关的雷同,用上一关的payload:"><a Href="javascript:alert(1)">link</a> <"试试

发现这里过滤了script和href,可以用双写绕过,即在script里面再插入一个script,如scrscriptipt,
当script被过滤后,剩下的拼接起来刚好能组合成script,href也同理
payload
"><a hRhrefef="javascriscriptpt:alert('111')">link</a><"

点击link弹窗。进入下一关
Level 8

这关多了一个“友情链接”,按照套路,这里应该是利用点
首先先查看页面源码

回显值的地方有两个,用上一关的payload试试水

可以发现,第一个回显处被htmlspecialchars()函数进行了处理,第二个回显处href和script都被_分隔了
可以对第二处进行构造payload
javascript:alert(1)
这里的scrpit会被分隔,所以将它进行unicode编码
javascript:alert(1)

点击友情链接即可弹窗
Level 9

查看源码

这里显示链接不合法,经过测试,提交的内容里只要含有http://就合法,https://不行

尝试payload : javascript:alert(http://)

发现script被分隔了,可以将script进行unicode编码绕过
javascript:alert('http://')

点击友情链接即可弹窗
Level 10

传递keyword值为<script>alert(111)</script>进行测试

可以看到回显值的地方被htmlspecialchars()函数进行了处理,还有三个隐藏的输入框,尝试向它们传值
?keyword=1111&t_link=222&t_history=333&t_sort=444

发现t_sort有回显,在这里构造payload
t_sort=" onmouseover=javascript:alert(1) " type="text


Level 11

这关的页面源码和上一关的雷同,多了个隐藏的输入框t_ref,value值为上一关的url

这里可以猜测,这个参数的值,是来源于请求头Referer,通过referer来传入payload
" onmouseover=javascript:alert(1) " type="text

可以弹窗进入下一关

Level 12

这一关又多了个隐藏的输入框t_ua,看它的值可以知道它的值来源于User-Agent

通过User-Agent传入上一关的payload即可弹窗


Level 13

查看页面源码,发现这次的隐藏输入框是t_cook,它的值是来自Cookies

同样的套路,吧上一关的payload加到cookie即可

成功弹窗进入下一关

Level 14
这一关是Exif xss,php的exif_read_data函数读出exif信息,读出的值直接未经过滤的输出,就会导致Xss的发生。
网站打不开,这关跳过
Level 15

查看源码发现angular.min.js

URL的src参数回显在下面的ng-include

ng-include相当于php的include函数,所以我们包含一个有XSS漏洞的URL就可触发这里的XSS。
在本地写个html文件,把地址传给src即可
<input type="text" name="" onclick=alert('xss')>
http://localhost/xss-labs/level15.php?src="http://localhost/2.html"

Level 16

观察url构造,发现这一关是通过get一个keyword来传递参数

参数值回显在<center>标签中,使用<img>标签来弹窗
<img src='' onerror=alert(111)>
http://localhost/xss-labs/level16.php?keyword=<img src='' onerror=alert(111)>
传值后没有弹窗,观察页面源码得知,空格被转义了

空格可以用%20 %09 %0a %0b %0c %0d %a0 %00代替,经过测试%0d可以用
所以payload为
http://localhost/xss-labs/level16.php?keyword=<img%0dsrc=''%0donerror=alert(111)>
弹窗成功
Level 17

这有个flash,但是这关和它没有关系
发现url有个?arg01=a&arg02=b,再观察一下页面源码

发现两个参数的值回显在<embed>标签中,可以通过构该标签的特殊事件进行弹窗
?arg01=a%0aonmouseover&arg02=alert(1)


Level 18
这一关的页面源码和上一关的没什么区别,直接用上一关的payload即可

Level 19/20
摆烂!






