level 1
观察地址栏得知是GET请求,参数是name,值为test
修改参数值定位位置,发现是在 h2标签内,判断为反射型xss
于是直接在把name参数赋值为:
1 | <script>alert('xss')</script> |
从浏览器观察直接弹出来了,查看一下源码,发现有一个str变量,值是name,同时str变量又被放在了h2标签中,且没做任何过滤处置。
1 | $str = $_GET["name"]; |

level 2
从地址栏观察URL发现依旧是GET方式来传递参数,不言而喻是反射型XSS
使用第一关的<script>alert('xss')</script>,发现并没有出现弹窗,查看页面源代码,发现在h2标签中,<script>的<>被HTML实体化了
- < -->
< - > -->
>
但 input 标签中的 value 参数没有被 HTML 编码,于是用">分别闭合value属性和input标签,最后用//注释后面的">
1 | // payload |
最后在 less-2.php 中查看,发现标签h2之所以被编码,是因为有htmlspecialchars()函数,换言之在网页上输入的字符会经过htmlspecialchars()函数对其进行 HTML 实体才会展示在页面上。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
1 | $str = $_GET["keyword"]; |


level 3
修改参数值定位具体位置,发现和 level 2 是一样的,在h2和input标签中
顾忌到会有编码之类,使用<script>alert('xss')</script>来测试,然后 Ctrl + U 查看页面源代码。果不其然,与 level 2 不同的是,这关h2和input标签中的str变量皆难逃被编码之命
- < -->
< - > -->
>
因为过滤了<>,这说明不可以用新标签,只能在标签内通过'闭合前面的属性的方式,为后面新增属性来绕过,与此同时想到的是“鼠标事件”
1 | // 用 ' 闭合 value 的值,新增点击事件,在 input 框中去点击一下即可触发 |
1 | $str = $_GET["keyword"]; |


level 4
修改参数值定位具体位置,依旧是在h2和input标签中,用<script>alert('xss')</script>来测试,查看页面源代码,发现h2标签的参数依旧被 HTML 实体,仍然是<>字符
但与之前不同的是,input标签中的value属性的值,没有出现<>字符,所以还是用闭合属性新增鼠标事件的方式来绕过
1 | " onclick ="javascript:alert(1)"// |
最后在 less-4.php 中查看,出现了str_replace() 函数
str_replace(">","",$str);--> 在 str 变量中,将<>字符替换为空htmlspecialchars() 函数--> 把一些预定义的字符转换为 HTML 实体。
1 | $str = $_GET["keyword"]; |


level 5
-
用
<script>alert('xss')</script>来测试,在h2标签中仍是<>字符被 HTML 实体了,而input标签的value属性中,完整的script被_断开了script-->scr_ipt
-
尝试
" onclick ="javascript:alert(1)"//,发现在h2标签中"双引号被 HTML 实体了,而input标签的value属性中的值,完整的onclick被_断开了onclick-->o_nclick
-
于是换一种思路,用
">来闭合 input 标签,利用a标签的href属性可以执行 JavaScript 伪协议的特性,绕过众多检测
1 | "> <a href=javascript:alert(1)>1</a>// |
- 最后在 less-5.php 中查看,出现了
strtolower() 函数
strtolower() 函数--> 把字符串转换为小写,赋值给str变量,这样大小写绕过就失效了str_replace--> 加入了_破坏完整的字符
1 | $str = strtolower($_GET["keyword"]); |



level 6
用<script>alert('xss')</script>来测试,发现在h2标签中仍是<>字符被 HTML 实体了,而input标签的value属性中,完整的script被_断开了
尝试点击事件" onclick ="javascript:alert(1)"//,发现在h2标签中"双引号被 HTML 实体了,而input标签的value属性中的值,完整的onclick被_断开了
试一下伪协议"> <a href=javascript:alert(1)>1</a>//,完整的href被_断开了
于是使用*大小写绕过*
1 | // 点击事件大小写绕过 |
查看 level6.php,可以看到 str_replace 函数分别破坏了<script、on、src、data、href等元素。h2 标签处做了 HTML 实体
1 | $str = $_GET["keyword"]; |

level 7
通过测试,发现 input 标签的 value 属性的值 script、on、href被直接替代为了空,h2 标签依旧是 HTML 实体了
于是通过**双写绕过**的方式去绕过检测
1 | // script |
查看 level7.php,可以看到 str_replace 函数分别把<script、on、src、data、href替代为了空
h2 标签处做了 HTML 实体,strtolower()函数把字符串转换为小写
1 | $str =strtolower( $_GET["keyword"]); |

level 8
定位一下,第一个参数在 input 标签的 value 属性中, 第二个参数在 a 标签的 href 属性中
通过测试,发现在 input 标签的 value 属性中<> "被 HTML 编码了,a 标签的 href 属性把script、on、src、data、href用_截断了,同时"被 HTML 编码了
使用大小写绕过也失败了,说明有 strtolower 函数。
因为第二个参数在 href属性中,而href属性支持构造伪协议,但script被_所限制,于是尝试用编码的方式去绕过
1 | javascript:alert(1) |


level 9
定位参数,第一个参数照旧,第二个参数还是在 a 标签的 href 属性中
用javascript:alert(1)测试,a 标签的 href 属性的值显示“您的链接不合法”
一般而言,href 属性是要填 URL 的,那就补上一个https://www.google.com
输入javascript:alert(1)//http://www.baidu.com,从页面源代码处看到script被_截断了,那就 HTML 编码一下
1 | javascript:alert(1)//http://www.baidu.com |
从 level9.php 可以观察到,如果没有http://字符,会输出链接不合法
1 | if(false===strpos($str7,'http://')) |

level 10
从 URL 处输入测试参数,然后 CTRL+U 查看页面源代码发现有三个 input 标签,且 type=“hidden”,也就是隐藏表单。
把三个 input 标签的类型修改为 text,看在页面的显示情况
1 | // 发现页面出现文本框,t_sort,这证明可对其进行突破 |
从源码看把<>替换为空了,这恐怕只能在标签内部通过新增属性的方式来答题了
1 | $str = $_GET["keyword"]; |


level 11
查看源代码发现 t_ref 的 value 值为上道题的 URL,由此判断 value 值就是 referer,referer 用于告知服务器用户的来源页面,所以这道题直接篡改 referer 就可以了
1 | referer:"type="text" onclick="alert('xss') |



level 12
CTRL+U 查看源代码发现 t_ua 的 value 值为 User-Agent,也就是用户代理,通常标识浏览器、及其版本号及其主机操作系统。
1 | User-Agent: "type="text" onclick="alert('xss') |



level 13
CTRL+U 查看源代码发现 t_cook 的 value 值为call me maybe?,使用浏览器插件 Cookie Editor 查看 cookie 的值与之相似,于是判定 value 值就是 cookie
1 | user=" type="text" onclick="alert('xss') |




level 14
网页一直在响应,最终以失败告终,查看源码发现原链接已经失效
这关主要考察Exif,Exif 记录着照片的属性信息和拍摄数据,可以更改图片的参数把一张恶意的图片传到可执行该信息的网站

level 15
查看页面源码,最底部有一行 span 标签,class 属性是ng-include
1 | <span class="ng-include:"></span> |
查询了一下得知是前端框架 angular js 里面的,含义是文件包含
于是可以把本地文件level1.php包含起来让其执行 XSS
1 | ?src='level1.php?name=<img src=1 onerror=alert(1)>' |

level 16
用<script>alert('xss')</script>测试,查看页面源代码,发现参数值在 center 标签中,而用于构造 XSS 的script、/、空格被替换为了
/被编码这意味着像是<></>需要闭合的标签用不了,所以想到了<img>这种自闭和的标签
换行符 --URL编码后--> %0a
1 | // 直接输入发现“空格”被替换为了 因此考虑用 %0a 即换行符绕过空格 |


level 17
在 URL 中填上参数?arg01=1111&arg02=2222,然后查看页面源代码,发现有个 embed 标签,填入的参数在 src 属性中进行了拼接
<embed>标签就是引入一个swf文件【SWF格式是动画软件Flash的专用格式】
1 | <!-- 查看页面源代码 --> |
1 | ?arg01= onclick&arg02=alert(‘xss’) // |

level 18
和 level 17 是一样的
level 19、20
IE 浏览器和 flash 均已被历史淘汰