准备条件
这里我已经配置好了工具,使用phpstudy在windows7上搭建好了靶场
第一关(直接注入)
第一关比较简单,直接在name参数后面加上payload <script>alert(1)</script>

第二关(">闭合绕过)
这一关的漏洞点在搜索框,也就是keywords这个参数,使用上一关的payload但是没有触发

然后我们吧payload改成 "><script>alert(1)</script><"即可绕过

第三关(鼠标事件绕过)
使用上一关的payload,发现行不通,然后查看源代码发现使用的是单引号闭合

在输入框中输入payload ' onfocus=javascript:alert() ' ,然后当我们点击搜索框的时候就成功触发了

第四关(尖括号过滤)
这一关使用上一关的payload,结果没成功,发现源代码使用的是双引号,

我们把payload也改成双引号就可以" onfocus=javascript:alert() "

第五关(js伪协议标签绕过)
我们输入payload <svg onload=alert(1)>,结果发现被替换成了<svg o_nload=alert(1)>

查看源码发现,这一关把许多关键字都过滤了

我们使用<a>标签的固有行为的payload测试发现没有被替换<a href="javascript:alert(1)">click</a>
但是没有被执行,是闭合方式的问题,改成"><a href="javascript:alert(1)">click</a><"成功执行,点击链接就通关了

第六关(大小写绕过)
这次我们使用上一关的payload结果没有链接可以点击,我们查看源码,发现它基本上把能用的payload都转换了,导致无法执行

但是相比上一关,他没把我们的输入转换成小写,所以我们可以使用大小写绕过
由于html标签名大小写不敏感,所以可以大小写绕过,但是标签内部的js代码需要严格区分大小写,不然无法执行,
所以我们使用payload "><SvG OnLoAd=alert(1)><" ,然后就成功绕过了

第七关(双写绕过)
这一关我们使用上一关payload,结果发现它貌似进行了小写转换,还把on删了

然后看下源码,发现他不仅进行了小写转换,还会把关键字替换成空,所以我们可以试试双写绕过,写成oonn,它只删除了中间的on,剩下o和n又变成了on

然后执行payload "><svg oonnload=alert(1)><" 成功绕过

第八关(实体编码绕过)
这一关他会把我们输入的内容制作成链接,然后我们点击链接才能访问

查看源码发现这一关不仅把关键字都过滤了,而且还把双引号实体化了

但是href可以自动解码HTML实体编码,10进制还是16进制的都可以,但是要注意我们最后点击友情链接最后跳转的是一个链接我们如果直接把之前的payload编码还是不会成功的,我们找一个html实体编码平台,我用的是在线Html实体编码解码-HTML Entity Encoding/Decoding,然后把payload: javascript:alert() 编码(其实javascript:confirm() 也可以弹窗,但是不会显示你成功通关)

把得到的编码输入再点击添加友链,点击生成的友链即可通关
javascript:alert() 
第九关(http://注释绕过)
这一关的源码和上一关相比加了一个判断条件,strpos会查找我们输入的字符串中http://的位置,没找到返回false,若false===false就会显示"您的链接不合法",所以我们输入的字符串是实体化编码的同时需要包含http://,但是如果开头加上了http://实体化编码,这样子就不会成功跳转了,url没法顺利访问了,公网没http://实体化编码这个站点。

所以我们可以把这个http://注释掉,构造payload
javascript:alert(1)/*http://*/然后就成功了

第十关(隐藏参数+修改type)
这一关连搜索框都没了,我们连输入的地方都没了,我们查看一下源码

可以发现处理接收keyword参数,还有一个t_sort参数,然后这一关过滤了尖括号,所以我们就无法使用带尖括号的payload,而且注入点不在href内,无法使用js伪协议,那我们就使用onclick事件,但这个需要我们鼠标去点击才能触发,所以需要把type改成text,构造payload
?传参后点击输入框即可通关

第十一关(referer注入)
这一关和上一关比较相似,但是注入点不同,查看网页源码可以发现存在t_ref这个参数的值是上一关的链接同时包含了我们的payload,这是我们打完上一关然后跳转过来的,如果点击刷新还有,但是重新请求第十一关的页面就没了
referer是http请求头中的一个参数,作用就是再浏览器给服务器发送请求的时候告诉服务器,这个网页是从哪个链接过来的

查看这一关的源码我们这一关我们要传的参数还是t_sort ,还是需要修改type

抓包,填写上一关payload:?t_sort="onclick=alert(1) type=text"

然后触发弹窗,通关

第十二关(UA注入)
这一关,我们先右键查下源代码,然后发现了UA头

有了上一关的经验,我们直接抓包,再ua处填写payload: ?t_sort="onclick=alert(1) type=text"

点击输入框,直接成功

第十三关(cookie注入)
这一关我们查看页面源代码,发现有个t_cook参数,这应该是要我们抓包去cookie头注入的

抓包我们直接填写payload Cookie: ?t_sort="onclick=alert(1) type=text"结果没有出现输入框,估计哪里搞错了
查看下源码,发现接收cookie需要一个user这个参数,我们刚刚抓包把user直接删了

重新抓包试试,填写正确payload : Cookie: user=?t_sort="onclick=alert(1) type=text"

然后放行点击输入框,成功通关

第十四关(exif图片xss)
靶场环境修改
这一关本来是我们使用exiftool修改图片元数据,植入xss代码,但是这一关使用的网址失效了,所以我使用ai把这一关修改了一下,在本地复现这一关
首先新建exif.php
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>EXIF Viewer</title>
</head>
<body>
<h2 align=center>EXIF Viewer - 上传图片查看EXIF信息</h2>
<center>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*">
<input type="submit" name="submit" value="查看EXIF">
</form>
</center>
<?php
if (isset($_POST["submit"])) {
if ($_FILES["image"]["error"] > 0) {
echo "<center><p>上传出错: " . $_FILES["image"]["error"] . "</p></center>";
} else {
$ext = strtolower(pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION));
if (!in_array($ext, ["jpg", "jpeg", "tiff", "tif"])) {
echo "<center><p>请上传JPEG或TIFF格式图片</p></center>";
} else {
$filename = "upload_" . time() . "." . $ext;
move_uploaded_file($_FILES["image"]["tmp_name"], $filename);
$exif = exif_read_data($filename, 0, true);
echo "<center><table border=1 cellpadding=5>";
foreach ($exif as $key => $section) {
echo "<tr><td colspan=2><b>" . $key . "</b></td></tr>";
foreach ($section as $name => $val) {
echo "<tr><td>" . $name . "</td><td>" . $val . "</td></tr>";
}
}
echo "</table></center>";
}
}
}
?>
</body>
</html>
然后修改下level14.php
html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<body>
<h1 align=center>欢迎来到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="exif.php" frameborder=no width="80%" scrolling="auto" height=80%></iframe></center><center>这关成功后不会自动跳转。成功者<a href=level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>
然后我们需要修改靶机上的php环境,启用扩展php_mbstring 和 php_exif,我在phpstudy 2018上没启用成功,就修改了php.ini,在php.ini搜索如下
extension=php_mbstring.dll
extension=php_exif.dll把前面的注释取消掉,然后保存,重启phpstudy服务即可正常打第14关了

正式开始通关:
首先我们需要准备一个exiftool这个工具,然后准备一张jpeg格式的照片,执行如下命令,<img src=x onerror=alert(1)>是我们的payload
exiftool -ImageDescription="<img src=x onerror=alert(1)>" 1.jpeg
然后可以看到图片的详情信息里面已经植入了我们的payload,把他上传,点击查看EXIF ,成功触发

第十五关 (ng-include文件包含)
这一关出现了一个陌生的东西ng-include,然后问下ai,给出的解释:ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。默认情况下,包含的文件需要包含在同一个域名下。

我们不难发现还有一个src的参数,所以这一关应该是需要我们包含php文件,前面的关卡任意一个php文件即可,然后插入关卡对应payload,最终payload为?src='level1.php?name=<img src=123 onerror=alert(1)>'
tips:<img>标签里面的src是<img>标签自带的,不是参数src,可以随便写,但是必须要有

第十六关 (空格绕过)
这一关我们使用payload:<img src=1 οnerrοr=alert(1)>发现被转义了

查看源码发现空格都script和空格被转义了

我们可以使用%0a,%0d,%0c来绕过,构造payload
<img%0asrc%3D1%0aonerror%3Dalert(1)>
<img%0csrc%3D1%0conerror%3Dalert(1)>
<img%0dsrc%3D1%0donerror%3Dalert(1)>
第十七关 (embed标签绕过)
接下来几关都需要安装flash插件,这一关涉及到embed标签,embed标签本来是用来划定一片地方放置多媒体文件,比如图片,音频,视频等,右键查看发现它有两个参数arg01和arg02,我们修改这两个参数的值可以发现我们加其他内容它解析了,然后输入空格,解析就中断了

看一下源码,显然我们不能动arg01这个参数,会导致语句紊乱,只能放到arg02后面才能让语句顺利执行

然后我们构造payload,晃动鼠标即可触发,别的onclick,onerror等都没有成功,就用了这个
?arg01=a&arg02=b onmouseover=alert()

第十八关
这一关和上一关没啥不同的,好像就flash的文件不同,不影响,直接用上一关payload ?arg01=a&arg02=b onmouseover=alert(),就直接通关了

第十九关和第二十关
这两关需要flash反编译,没有必要,flash已经淘汰好多年了,就不搞了