xss-labs 通关教程

文章详细介绍了XSS靶场xss-labs的各个关卡,通过实际操作演示了多种XSS攻击方式,包括字符过滤绕过、HTML实体利用、URI注入等,强调了PHP的htmlspecialchars()函数在防止XSS攻击中的作用以及其局限性,展示了XSS攻击的常见手段和防御策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xss-labs 是一套基于 PHP 的 XSS 靶场,以闯关的形式让我们体验各种 XSS 漏洞利用方式。虽然已经是很多年前的了,但其中基本的 XSS 漏洞依然很有意义。

一共有 20 关,每一关的目标都是实现弹窗(alert(1)),如果成功就会自动进入下一关。

(本文首发于 blog.skywt.cn,建议 查看原文以获得更好的阅读体验。)

环境搭建

克隆这个代码仓库的代码,其中是 xss-labs 的 PHP 源文件。只要放在 PHP 环境下即可,推荐使用 XAMPP 或者 Docker。

部署完成后,访问 index.php,就可以看到入口了:

「点击图片开始你的 XSS 之旅吧」提示

Warm Up

前两关是对于 XSS 基本原理的应用,没有任何的防御。

Level 1:文本解析为 HTML

URL 为 level1.php?name=test 时,传入的参数是 test,显示的是「欢迎用户 test」。显然,这个页面会将我们传入的名字显示出来。

传入参数 <h1>test</h1> 作为 name,发现确实显示为了一级标题。看来传入的 name 直接被作为 HTML 显示了。于是尝试传入 <script>alert(1);</script> 作为 name,成功弹窗。

?name=<script>alert(1);</script>

Level 2:input 标签 value 注入

这关多了一个文本框。如果依然尝试传入 <script>alert(1);</script>,会发现在 h2 元素中符号被转义了(查看网页源代码能看到),比如 < 被转义成了 &lt; 等,所以不会被解析成 HTML。

然而,可以看到后面的文本框 input 元素,其 value 值并没有被转义。

<h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>

<input name=keyword  value="<script>alert(1)</script>">

既然如此,我们可以闭合 value 的内容的后引号,然后闭合这个 input 标签,接下来再加入我们想要注入的 <script>alert(1);</script>。只需要在其之前加上 "> 即可。

?keyword="><script>alert(1);</script>

字符过滤绕过

Level 3:htmlspecialchars() 的弱点

本题要求 PHP 版本低于 8.1.0。在 8.1.0 版本中此漏洞已经修复。

HTML 标准规定了一个叫做**实体(Entity)**的概念。在 HTML 中,<h1> 会被解释为标题标签,那我们如何以文本形式显示出 <h1> 这四个字符呢?答案是使用字符实体,将 <&lt; 替代,将 >&gt; 替代。在 HTML 中,如果我们写 &lt;h1&gt;,就会显示为 <h1> 而不会被解析。

在 PHP 中,后端需要渲染出一个 HTML 给前端,对传来的字符串就要进行这样的处理,将 < 这样的字符转换为 &lt; 这样的实体。Level 1 就是没有进行这种处理的下场。

一个通常的做法就是:使用 PHP 自带的 htmlspecialchars() 函数处理字符串,进行字符转义。具体用法可以参考官方文档

在 8.1.0 及以上的 PHP 版本中,这个函数默认会转义 <>&'" 这五个字符,基本可以防范这里的 XSS 攻击。
但是,8.1.0 以下版本的 PHP 默认只会转义 <>&" 这四个字符,不会转义单引号 '。这就给这个函数带来了巨大的安全隐患。

回到这题,我们仍然尝试 ?keyword=<script>alert(1)</script>,打开页面源码,观察这个 input 输入框:

<input name=keyword  value='&lt;script&gt;alert(1)&lt;/script&gt;'><
### XSS-Labs 通关教程与解决方案 XSS-Labs 是一个专注于跨站脚本攻击(XSS)的在线靶场,旨在帮助用户深入理解 XSS 攻击的原理及其防御机制。以下是关于 XSS-Labs 的详细通关指南和解决方案。 #### 理解 XSS 攻击 XSS(跨站脚本攻击)是一种常见的 Web 安全漏洞,攻击者通过注入恶意脚本代码到可信网站中,使其他用户的浏览器执行这些脚本。XSS 攻击通常分为三种类型:反射型 XSS、存储型 XSS 和 DOM 型 XSS[^1]。 #### 靶场基础 XSS-Labs 提供了一系列关卡,每个关卡都模拟了不同的 XSS 漏洞场景。用户需要通过构造特定的输入来触发 XSS 攻击并完成挑战。以下是一些常见关卡的解决方案: #### 关卡示例与解决方案 ##### 关卡 1:反射型 XSS 目标是通过 URL 参数注入恶意脚本。 ```html <script>alert('XSS')</script> ``` 将上述代码作为参数传递给目标 URL。例如: ``` http://xss-labs.samsclass.info/lesson2.php?name=<script>alert('XSS')</script> ``` 此方法利用了服务器未对用户输入进行过滤或转义的漏洞[^2]。 ##### 关卡 2:HTML 转义绕过 某些情况下,服务器会对特殊字符(如 `<` 和 `>`)进行 HTML 转义。可以尝试使用 Unicode 编码绕过: ```html <script>alert('XSS')</script> ``` ##### 关卡 3:事件处理程序 如果目标页面允许用户输入事件处理程序属性(如 `onclick`),可以通过以下方式触发 XSS: ```html <img src="x" onerror="alert('XSS')"> ``` ##### 关卡 4:DOM 型 XSS 在某些前端逻辑中,用户输入直接嵌入到页面中而未经过滤。可以通过 JavaScript 修改 DOM 结构来触发 XSS: ```javascript javascript:document.write('<img src=x onerror=alert("XSS")>'); ``` ##### 关卡 5:多字节编码绕过 当服务器使用多字节字符集(如 UTF-8)时,可以通过构造特殊的多字节序列绕过过滤规则。例如: ```html %3Cscript%3Ealert('XSS')%3C/script%3E ``` #### 注意事项 在某些高级关卡中,可能需要结合多种技术才能成功触发 XSS。例如,使用 Flash 插件或反编译工具分析目标代码[^4]。 #### 示例代码:自动化测试 XSS 漏洞 以下是一个简单的 Python 脚本,用于自动化测试目标 URL 是否存在 XSS 漏洞: ```python import requests url = "http://example.com/vulnerable-page" payloads = [ "<script>alert('XSS')</script>", "<script>alert('XSS')</script>", "<img src=x onerror=alert('XSS')>", ] for payload in payloads: response = requests.get(url, params={"input": payload}) if payload in response.text: print(f"Potential XSS vulnerability detected with payload: {payload}") ``` #### 防御机制 为了防止 XSS 攻击,开发人员应采取以下措施: 1. 对所有用户输入进行严格的验证和过滤。 2. 使用上下文相关的输出编码(如 HTML、JavaScript、CSS 编码)。 3. 实施内容安全策略(CSP),限制可执行的脚本来源[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值