level 0
靶场搭建
下载至phpstudy中的WWW目录。
下载地址:
git clone https://github.com/do0dl3/xss-labs.git
打开phpstudy,启动MySQL和Apache服务。创建网站,根目录选择下载的文件。之后打开网站即可。
level 1
没有任何过滤
在源码中找到我们传入的参数,发现插入到了元素<h2>
中。直接给我们的name
参数赋值一个简单的弹窗脚本,执行成功。这一关没有任何过滤,非常基础的反射型XSS。
level 2
htmlspecialchars()
插入点在元素的属性
按照第一题的思路,直接传参<script>alert(/xss/)</script>
,发现没有跳出弹窗。查看源代码发现我们的传递的参数被HTML实体编码
了。
继续检查源代码,发现我们提交的参数赋值给了<input>
元素的value
,所以这里我们可以通过提前闭合,利用on
事件执行一个简单的弹窗。
传递参数1" onmouseover="alert(/xss/)
,查看源码发现拼接成功。鼠标移动到该元素上跳出弹窗。
level 3
类似level 2
与level 2有些许不同,构造参数1' onmouseover='alert(/xss/)
,查看源码发现拼接成功。同level 2跳出弹窗。
level 4
无意思 和level 2构造同样的参数即可
level 5
on
事件被过滤,拼接创建新元素,利用JavaScript伪协议
继续使用上一关的参数,发现被过滤了on
事件。
这个元素没办法拼接代码的话,那么通过构造参数新建一个元素来执行代码。构造参数1"><a href="javascript:alert(/xss/)">click!</a><img src="
,这里没有过滤掉javascript
,查看源代码发现拼接成功,点击click!即可跳出弹窗。
level 6
大小写绕过
传入1" onmouseover="alert(/xss/)
,发现on
被过滤了。
继续尝试1"><a href="javascript:alert(/xss/)">click!</a><img src="
,发现href
也被过滤了。
尝试大写绕过1"><a HREF="javascript:alert(/xss/)">click!</a><img src="
,发现代码拼接成功.点击click!>即可跳出弹窗。
level 7
双写关键字
尝试参数1" onmouseover="alert(/xss/)
,on
又双叒叕被过滤了。
尝试创建新元素1"><a href="javascript:alert(/xss/)">click!</a><img src="
,也不行。
尝试双写关键字,拼接成功,跳出弹窗。
level 8
javascript伪协议+HTML实体编码绕过
随便上传一个链接。
尝试下javascript
伪协议。拼接的时候发现被插入了一个空格。尝试大写绕过,也不行。
试试HTML实体编码绕过。
javascript:alert(/xss/)
拼接成功,点击弹出窗口。
level 9
类似level 8
随便传入一串字符,发现不符合格式,需要http://
才能成功传入。构造参数javascript:alert(/xss/)//http://
,发现和level 8一样在script
中间插入了一个空格,直接尝试HTML实体编码绕过,拼接成功,点击后弹出窗口。
level 10
隐藏表单
检查源代码,发现有隐藏的输入框。同时给这些变量传值。
<form id="search">
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
</form>
http://xss-labs/level10.php?keyword=well done!&t_link=a&t_history=b&t_sort=c
只有t_sort
变量被赋值了。尝试传参重构这个元素。参数为1" type="" onmouseover="alert(/xss/)
。
拼接成功,跳出弹窗。