Level1
查看源码,可以发现 get 传参 name 的值 test 插入了 html 里头,还回显了 payload 的长度

插入如下 payload:
<script>alert(123)</script>
原理:
-
漏洞点:网页通过 GET 参数
name接收用户输入,并直接将其插入到 HTML 页面中,没有进行任何过滤或转义处理。 -
攻击方式:通过在 URL 参数中注入 JavaScript 代码:
?name=<script>alert(123)</script>当这个 URL 被访问时,
<script>alert(123)</script>会被直接插入到页面 HTML 中并执行。 -
漏洞利用:由于注入的脚本代码被浏览器解析执行,弹出了包含"123"的警告框,证明 XSS 攻击成功。
-
漏洞本质:这是典型的反射型 XSS,攻击代码通过 URL 参数注入,服务器未做任何处理就直接反射回页面中。
Level2

插入如下 payload:
"><script>alert(123)</script>
原理:
-
漏洞点:网页通过搜索表单的
keyword参数接收用户输入,并将输入值直接放入 input 标签的 value 属性中,没有进行任何过滤或转义处理。 -
攻击方式:通过构造特殊的输入闭合原有 HTML 标签并注入新代码:
"><script>alert(123)</script>这个输入会:
- 首先用双引号(
")闭合 value 属性的值 - 然后用
>闭合 input 标签 - 最后注入新的
<script>标签
- 首先用双引号(
-
URL 编码后的攻击载荷:
?keyword="><script>alert%28123%29</%2Fscript>&submit=搜索(其中 %28=左括号,%29=右括号,%2F=斜杠)
-
漏洞利用效果:注入的脚本代码成功执行,弹出警告框,然后页面重定向到 level3。
-
特殊处理:页面重写了 alert 函数,使其显示确认框并自动跳转,这是题目设计的通关反馈机制。
-
漏洞本质:由于用户输入被直接插入到 HTML 属性中且未做转义,攻击者可以闭合原有标签并注入新标签,属于存储型 XSS 的一种变体。
Level3
输入第二关的 payload,发现符号被实体化了

查看源码

发现符号被实体化了,但是 htmlspecialchars 函数只针对 <> 大于小于号进行 html 实体化,我们还可以利用其他方法进行 xss 注入,这里我们可以利用 onfocus 事件绕过
输入 payload,点击搜索
' onfocus=javascript:alert() '
会发现 payload 被成功注入了 html 代码中,此时再点击输入框,触发 onfocus 事件即可过关

原理:
-
防御措施:这一关使用了
htmlspecialchars()函数对输入进行了过滤,将特殊字符(如 <、> 等)转换为 HTML 实体,阻止了直接注入<script>标签的攻击方式。 -
绕过方法:虽然无法使用
<script>标签,但可以利用 HTML 标签的事件属性来执行 JavaScript 代码。这里使用了onfocus事件属性。 -
payload:
' onfocus=javascript:alert() '- 单引号(
')用于闭合原有的 value 属性值 onfocus事件会在元素获得焦点时触发javascript:alert()是要执行的代码
- 单引号(
-
URL 编码后的攻击载荷:
?keyword=%27+onfocus%3Djavascript%3Aalert%28%29+%27&submit=搜索 -
攻击流程:
- 注入的代码被放入 input 标签的 value 属性
- 当用户点击输入框使其获得焦点时,触发 onfocus 事件
- 执行 alert()函数弹出警告框
onfocus 事件详解:
onfocus 是 HTML 元素的一个事件属性,当元素获得焦点时触发。常见特点:
- 触发时机:
- 用户点击元素
- 用户通过 Tab 键导航到元素
- 元素通过代码调用 focus()方法获得焦点
- 常用元素:
<input><textarea><select><a>(当有 href 属性时)- 任何设置了 tabindex 属性的元素
- XSS 利用价值:
- 不需要直接注入脚本标签
- 可以绕过基础的 HTML 标签过滤
- 需要用户交互才能触发(点击或聚焦)
Level4
查看源码


这里是双引号闭合, 标签,所以我们还能继续利用 onfocus 事件,构建 payload,并点击搜索
" onfocus=javascript:alert(123) "
点击输入框触发 onfocus 事件

防御措施分析
- 过滤机制:
- 使用
str_replace()函数过滤了<script中的<和空格 - 保留了双引号(
")未过滤 - 输入值被直接放入 input 标签的 value 属性中
- 使用
- 防护缺陷:
- 只过滤了
<和空格,未过滤其他关键字符 - 未对事件处理属性(如 onfocus)进行防护
- 双引号未被转义,允许闭合 HTML 属性
- 只过滤了
攻击原理
-
攻击向量:
- 利用双引号闭合 value 属性
- 注入 onfocus 事件处理程序
- 不需要使用
<script>标签
-
有效 Payload:
" onfocus=javascript:alert(123) "- 第一个
"闭合 value 属性 onfocus添加事件处理器- 最后的
"保持 HTML 语法正确
- 第一个
-
URL 编码后的 Payload:
onfocus%3Djavascript%3Aalert%28123%29+&submit=搜索
攻击执行流程
-
用户提交恶意输入后,生成的 HTML 代码为:
<input name=keyword value="" onfocus=javascript:alert(123) ""> -
当用户点击该输入框使其获得焦点时:
- 触发 onfocus 事件
- 执行 javascript:alert(123)
- 弹出警告框完成攻击
漏洞本质
这是一个基于 HTML 事件处理器的反射型 XSS 漏洞,特点包括:
- 绕过了基本的标签过滤
- 需要用户交互(点击输入框)才能触发
- 利用了未转义的双引号和允许的事件属性
Level5
输入上一关的 payload:
" onfocus=javascript:alert(123) "发现“onfocus”变成了“o_nfocus”

查看本关源码:

这里发现过滤了 js 的标签还有 onfocus 事件,虽然 str_replace 不区分大小写,但是有小写字母转化函数,所以就不能用大小写法来绕过过滤了,只能新找一个方法进行 xss 注入,这里我们用 a href 标签法
构建 payload 并注入
"> <a href=javascript:alert()>hack!</a> <"

点击“hack”触发重定向即可

防御机制分析
- 过滤规则:
- 使用
strtolower()将所有输入转为小写 - 将"script"替换为"src.jspt"(破坏 script 标签)
- 将"on"替换为"o_n"(破坏 on*事件处理器)
- 保留了双引号未过滤
- 使用
攻击原理
-
使用
<a>标签的 href 属性:"><a href=javascript:alert()>back!</a><"- 第一个
">闭合 input 标签 - 插入新的
<a>标签 - 利用 javascript:伪协议执行代码
- 最后的
<"保持 HTML 结构完整
- 第一个
-
攻击流程:
- 注入的代码生成可点击的"back!"链接
- 用户点击该链接时触发 JavaScript 执行
漏洞本质
这是一个基于 HTML 标签属性(href)的 XSS 绕过案例,特点包括:
- 绕过了对事件处理器的过滤
- 利用了未完全过滤的 HTML 标签
- 需要用户交互(点击链接)才能触发
- 使用 javascript:伪协议作为执行载体
Level6
查看源码,发现过滤了“script”“on”“src”“data”“href”,但是没有添加小写转化函数,导致能用大写绕过

构造 payload,直接用
