xss-labs靶场1-8关通关详解

xss-labs靶场1-8关通关详解

2026年02月26日·20 分钟阅读·17 次阅读·0 点赞·0 条评论

Level1

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

插入如下 payload:

<script>alert(123)</script>

原理:

  1. 漏洞点:网页通过 GET 参数 name 接收用户输入,并直接将其插入到 HTML 页面中,没有进行任何过滤或转义处理。

  2. 攻击方式:通过在 URL 参数中注入 JavaScript 代码:

    ?name=<script>alert(123)</script>

    当这个 URL 被访问时,<script>alert(123)</script> 会被直接插入到页面 HTML 中并执行。

  3. 漏洞利用:由于注入的脚本代码被浏览器解析执行,弹出了包含"123"的警告框,证明 XSS 攻击成功。

  4. 漏洞本质:这是典型的反射型 XSS,攻击代码通过 URL 参数注入,服务器未做任何处理就直接反射回页面中。


Level2

插入如下 payload:

"><script>alert(123)</script>

原理:

  1. 漏洞点:网页通过搜索表单的 keyword 参数接收用户输入,并将输入值直接放入 input 标签的 value 属性中,没有进行任何过滤或转义处理。

  2. 攻击方式:通过构造特殊的输入闭合原有 HTML 标签并注入新代码:

    "><script>alert(123)</script>

    这个输入会:

    • 首先用双引号(")闭合 value 属性的值
    • 然后用 > 闭合 input 标签
    • 最后注入新的 <script> 标签
  3. URL 编码后的攻击载荷

    ?keyword="><script>alert%28123%29</%2Fscript>&submit=搜索

    (其中 %28=左括号,%29=右括号,%2F=斜杠)

  4. 漏洞利用效果:注入的脚本代码成功执行,弹出警告框,然后页面重定向到 level3。

  5. 特殊处理:页面重写了 alert 函数,使其显示确认框并自动跳转,这是题目设计的通关反馈机制。

  6. 漏洞本质:由于用户输入被直接插入到 HTML 属性中且未做转义,攻击者可以闭合原有标签并注入新标签,属于存储型 XSS 的一种变体。


Level3

输入第二关的 payload,发现符号被实体化了

查看源码

发现符号被实体化了,但是 htmlspecialchars 函数只针对 <> 大于小于号进行 html 实体化,我们还可以利用其他方法进行 xss 注入,这里我们可以利用 onfocus 事件绕过

输入 payload,点击搜索

' onfocus=javascript:alert() '

会发现 payload 被成功注入了 html 代码中,此时再点击输入框,触发 onfocus 事件即可过关

原理:

  1. 防御措施:这一关使用了 htmlspecialchars() 函数对输入进行了过滤,将特殊字符(如 <、> 等)转换为 HTML 实体,阻止了直接注入 <script> 标签的攻击方式。

  2. 绕过方法:虽然无法使用 <script> 标签,但可以利用 HTML 标签的事件属性来执行 JavaScript 代码。这里使用了 onfocus 事件属性。

  3. payload

    ' onfocus=javascript:alert() '

    • 单引号(')用于闭合原有的 value 属性值
    • onfocus 事件会在元素获得焦点时触发
    • javascript:alert() 是要执行的代码
  4. URL 编码后的攻击载荷

    ?keyword=%27+onfocus%3Djavascript%3Aalert%28%29+%27&submit=搜索

  5. 攻击流程

    • 注入的代码被放入 input 标签的 value 属性
    • 当用户点击输入框使其获得焦点时,触发 onfocus 事件
    • 执行 alert()函数弹出警告框

onfocus 事件详解:

onfocus 是 HTML 元素的一个事件属性,当元素获得焦点时触发。常见特点:

  1. 触发时机
    • 用户点击元素
    • 用户通过 Tab 键导航到元素
    • 元素通过代码调用 focus()方法获得焦点
  2. 常用元素
    • <input>
    • <textarea>
    • <select>
    • <a>(当有 href 属性时)
    • 任何设置了 tabindex 属性的元素
  3. XSS 利用价值
    • 不需要直接注入脚本标签
    • 可以绕过基础的 HTML 标签过滤
    • 需要用户交互才能触发(点击或聚焦)

Level4

查看源码

这里是双引号闭合, 标签,所以我们还能继续利用 onfocus 事件,构建 payload,并点击搜索

" onfocus=javascript:alert(123) "

点击输入框触发 onfocus 事件

防御措施分析

  1. 过滤机制
    • 使用 str_replace() 函数过滤了 <script 中的 < 和空格
    • 保留了双引号(")未过滤
    • 输入值被直接放入 input 标签的 value 属性中
  2. 防护缺陷
    • 只过滤了 < 和空格,未过滤其他关键字符
    • 未对事件处理属性(如 onfocus)进行防护
    • 双引号未被转义,允许闭合 HTML 属性

攻击原理

  1. 攻击向量

    • 利用双引号闭合 value 属性
    • 注入 onfocus 事件处理程序
    • 不需要使用 <script> 标签
  2. 有效 Payload

    " onfocus=javascript:alert(123) "

    • 第一个 " 闭合 value 属性
    • onfocus 添加事件处理器
    • 最后的 " 保持 HTML 语法正确
  3. URL 编码后的 Payload

    onfocus%3Djavascript%3Aalert%28123%29+&submit=搜索

攻击执行流程

  1. 用户提交恶意输入后,生成的 HTML 代码为:

    <input name=keyword value="" onfocus=javascript:alert(123) "">

  2. 当用户点击该输入框使其获得焦点时:

    • 触发 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”触发重定向即可

防御机制分析

  1. 过滤规则
    • 使用 strtolower() 将所有输入转为小写
    • 将"script"替换为"src.jspt"(破坏 script 标签)
    • 将"on"替换为"o_n"(破坏 on*事件处理器)
    • 保留了双引号未过滤

攻击原理

  1. 使用 <a> 标签的 href 属性

    "><a href=javascript:alert()>back!</a><"

    • 第一个 "> 闭合 input 标签
    • 插入新的 <a> 标签
    • 利用 javascript:伪协议执行代码
    • 最后的 <" 保持 HTML 结构完整
  2. 攻击流程

    • 注入的代码生成可点击的"back!"链接
    • 用户点击该链接时触发 JavaScript 执行

漏洞本质

这是一个基于 HTML 标签属性(href)的 XSS 绕过案例,特点包括:

  1. 绕过了对事件处理器的过滤
  2. 利用了未完全过滤的 HTML 标签
  3. 需要用户交互(点击链接)才能触发
  4. 使用 javascript:伪协议作为执行载体

Level6

查看源码,发现过滤了“script”“on”“src”“data”“href”,但是没有添加小写转化函数,导致能用大写绕过

构造 payload,直接用