xsslabs通关
前言
xss小游戏
level1
看了看level1的源码
1 | <!DOCTYPE html><!--STATUS OK--><html> |
通过$_GET[“name”],获取name的值,没有过滤通过echo直接进行了输出,get请求的name变量放入xss脚本,完整的返回在html中,浏览器响应xss脚本
构造payload:name=<script>alert("xss")</script>
在xss中拥有同样弹窗效果的函数不止alert
,还有confirm
以及prompt
从代码角度去看,可以发现就是直接用GET方式获取参数然后输出到浏览器上面,这是典型的没做过滤。怎么防御?可以加一个转义函数htmlspecialchars
把一些html格式的东西编码就可以有效防止了。
level2
像上一关一样输入<script>alert("xss");</script>
,并没有弹窗,回显如下:
再看看源码
划红线部分就是提交的参数了,我们发现这里是可以闭合前面的引号和**>**,再构造xss弹窗
payload:"/><script>alert("xss");</script>
level3
输入上一关的试试,当然没用
看看源码
发现提交的xss脚本中的**<**和**>**都没了,应该是被htmlspecialchars函数过滤了
所以这里可以用单引号闭合value,却没办法闭合input标签,但是可以注释掉后面标签然后用事件弹窗,这里介绍几个常用的事件函数,比如onchange, onclick, oninput
等等
payload:1' onclick=alert("xss")//
level4
输入"/><script>alert("xss");</script>
测试一下,
**<**和**>**依然被转义,再试试点击事件弹窗
payload:1" onclick=alert("xss")//
level5
输入"/><script>alert("xss");</script>
,发现<script>
标签被过滤
输入1" onclick=alert("xss")//
测试,
可以看到onclick也被过滤,但是可以看到尖括号没有被过滤
所以可以构造a标签,再尝试利用a标签的href属性执行javascript:伪协议,"><a href="javascript:alert(1)"
,没有对javascript进行过滤,触发xss
level6
输入"><script>alert("xss")</script>
测试,<script>
标签被过滤
输入" onclick=alert(1)//
测试,onclick被过滤
输入"><a href="javascript:alert(1)"
测试。发现href也被过滤
尝试是用大小写绕过
payload:"><a HREF=" javascript:alert(1)"
或者"> <Script>alert('123')</script> //
level7
按照前面的套路试了一遍,发现script、on、href都被过滤,大小写都被过滤
使用双写单词来绕过
payload1:" oonnclick=alert(1)//
payload:"><a hrhrefef=" javascscriptript:alert(1)"
level8
随便输了一个试试,查看源码
发现原本就有一个href标签,所以直接添加javascript:alert(1)即可,可是会发现script被过滤了,转换大小写也不行,
可以发现还有一处调用的字符串里面没有使用这样的函数去进行防护,可以利用这一点下功夫,尝试编码绕过,进行html编码之后可以成功饶过,
1 | javascript:alert(1) |
(其实这里编码的话只编码script其中一个字符就可以)
level9
输入javascript:alert(1)测试一下
发现这次的输入没有在href标签那里,所以,再试试"><script>alert(1)</script>
尖括号和引号都被过滤,看来害的编码
使用上一关的poc试试,也不行,,,只能看看源码
发现这里对url进行了限制,必须包含http://
尝试构造javascript:alert(1)http://
,居然不对、、、
确实不对,那该怎么办呢,两
个解决办法:注释或者把http://放到aler()里面
javascript:alert(1)//http://
javascript:alert("http://")
这里吧引号编码
level10
明面上没有看到输入框,但是url栏里可以输入
发现尖括号被过滤,但是这里有三个隐藏的参数,不明白,看看源码
keyword被htmlspecialchars过滤,但是还有一个参数t_sort没有防护,只是过滤了尖括号,然后放到了一个input标签中隐藏起来
可以闭合双引号,使用onclick
事件,然后把隐藏的标签用text
方式回显出来即可,最后的payload
t_sort=" onclick=alert(1) type="text"