Pikachu靶场-Cross-Site Scripting
字数 2034 2025-08-24 20:49:22

XSS(跨站脚本)攻击全面解析与防御指南

1. XSS概述

XSS(Cross-Site Scripting)简称为"CSS",为避免与前端层叠样式表缩写冲突,故称XSS。XSS漏洞在OWASP TOP10中长期位列前三,危害性极大。

XSS分类

  1. 反射型XSS:恶意脚本来自当前HTTP请求
  2. 存储型XSS:恶意脚本存储在服务器上
  3. DOM型XSS:通过客户端脚本处理DOM时产生

XSS危害

  • 窃取用户会话(Cookie)
  • 篡改网页内容
  • 重定向到恶意网站
  • 键盘记录等恶意操作

防御原则

  • 输入过滤:过滤可能导致XSS的特殊字符
  • 输出转义:根据输出位置对内容进行适当转义

2. 反射型XSS攻击

反射型XSS(GET)

特征

  • 输入特殊字符('"<>)可原封不动输出
  • 前端可能限制输入长度(可通过审查元素修改)

攻击步骤

  1. 构造payload:<script>alert(/xss/)</script>
  2. 提交后立即触发XSS

后台代码分析

  • 无任何输入过滤
  • 直接输出用户输入

反射型XSS(POST)

攻击步骤

  1. 登录系统(如admin/123456)
  2. 在输入框直接提交payload:<script>alert(/xss/)</script>
  3. 触发弹窗

3. 存储型XSS攻击

特征

  • 恶意脚本存储在服务器数据库
  • 每次访问相关页面都会触发

攻击步骤

  1. 输入payload:<script>alert(/xss/)</script>
  2. 提交后存储到数据库
  3. 每次访问该页面都会触发弹窗

后台代码分析

  1. 检查message是否存在且非空
  2. 对输入进行SQL注入防护转义
  3. 将message存入数据库
  4. 显示所有存储的留言(持久化触发)

4. DOM型XSS攻击

原理

  • 通过JavaScript操作DOM时产生
  • 不依赖服务器端处理

基础DOM XSS

攻击方式1

'>
  • 闭合前标签,插入新标签
  • 鼠标悬停时触发

攻击方式2

' onclick="alert('xss')">
  • 点击元素时触发

DOM XSS-X(复杂场景)

攻击步骤

  1. 输入payload:'>
  2. 点击"请说出你的伤心往事"
  3. 点击"有些费尽心机..."
  4. 鼠标移动到图片位置触发

或:

  1. 输入payload:' onclick="alert('xss')">
  2. 点击"有些费尽心机..."
  3. 点击"就让往事都随风"触发

5. XSS盲打

特点

  • 攻击者输入不会在前端显示
  • 当管理员查看后台时触发

攻击步骤

  1. 输入常规payload:<script>alert(/xss/)</script>
  2. 提交到后台
  3. 管理员登录后台(如/xssblind/admin_login.php)时触发

6. XSS绕过技术

过滤绕过

场景

  • 后端过滤<script标签(替换为空格)
  • 仅过滤小写

绕过方法

  1. 大小写混合:<SCRIPT>alert(/xss/)</sCRIpt>
  2. 使用替代标签:
    
    
    

htmlspecialchars绕过

函数特性

  • 转换预定义字符为HTML实体:
    • &&amp;
    • "&quot;
    • '&#039;
    • <&lt;
    • >&gt;

漏洞点

  • 未对所有上下文进行转义
  • 单引号可能未被处理

攻击payload

#' onclick='alert(/xss/)
  • 第一个单引号闭合href属性
  • 第二个单引号闭合onclick属性

href输出绕过

场景

  • 常规XSS过滤已生效
  • 但允许javascript伪协议

攻击payload

javascript:alert(/xss/)

JS输出绕过

场景

  • 用户输入被放入JavaScript变量

攻击payload

</script><script>alert(/xss/)</script>';alert(1);//
  • 闭合原JS代码
  • 插入新脚本

7. 防御措施

通用防御

  1. 输入验证

    • 白名单验证(仅允许预期字符)
    • 黑名单过滤(过滤特殊字符)
  2. 输出编码

    • HTML实体编码(&, <, >, ", '
    • 根据输出上下文选择适当编码
  3. CSP(内容安全策略)

    • 限制脚本来源
    • 禁止内联脚本

特定场景防御

  1. DOM XSS防御

    • 避免使用innerHTML
    • 使用textContent代替
    • 对动态插入内容进行净化
  2. 存储型XSS防御

    • 数据库层输入过滤
    • 输出时统一编码
  3. Cookie安全

    • 设置HttpOnly标志
    • 设置Secure标志(HTTPS)
    • 设置SameSite属性

8. 测试与验证

测试方法

  1. 基础测试

    • 输入'"<>观察输出
    • 尝试简单payload:<script>alert(1)</script>
  2. 进阶测试

    • 尝试各种事件处理器(onmouseover, onerror等)
    • 测试大小写混合
    • 尝试编码绕过
  3. 工具辅助

    • 使用Burp Suite等工具测试
    • 自动化扫描工具

验证要点

  1. 确认所有用户输入点都经过处理
  2. 验证输出编码是否适用于所有上下文
  3. 检查CSP策略是否有效实施

通过全面理解XSS攻击原理、掌握各种攻击技术并实施恰当的防御措施,可有效保护Web应用免受XSS攻击威胁。

XSS(跨站脚本)攻击全面解析与防御指南 1. XSS概述 XSS(Cross-Site Scripting)简称为"CSS",为避免与前端层叠样式表缩写冲突,故称XSS。XSS漏洞在OWASP TOP10中长期位列前三,危害性极大。 XSS分类 反射型XSS :恶意脚本来自当前HTTP请求 存储型XSS :恶意脚本存储在服务器上 DOM型XSS :通过客户端脚本处理DOM时产生 XSS危害 窃取用户会话(Cookie) 篡改网页内容 重定向到恶意网站 键盘记录等恶意操作 防御原则 输入过滤 :过滤可能导致XSS的特殊字符 输出转义 :根据输出位置对内容进行适当转义 2. 反射型XSS攻击 反射型XSS(GET) 特征 : 输入特殊字符( '"<> )可原封不动输出 前端可能限制输入长度(可通过审查元素修改) 攻击步骤 : 构造payload: <script>alert(/xss/)</script> 提交后立即触发XSS 后台代码分析 : 无任何输入过滤 直接输出用户输入 反射型XSS(POST) 攻击步骤 : 登录系统(如admin/123456) 在输入框直接提交payload: <script>alert(/xss/)</script> 触发弹窗 3. 存储型XSS攻击 特征 : 恶意脚本存储在服务器数据库 每次访问相关页面都会触发 攻击步骤 : 输入payload: <script>alert(/xss/)</script> 提交后存储到数据库 每次访问该页面都会触发弹窗 后台代码分析 : 检查message是否存在且非空 对输入进行SQL注入防护转义 将message存入数据库 显示所有存储的留言(持久化触发) 4. DOM型XSS攻击 原理 : 通过JavaScript操作DOM时产生 不依赖服务器端处理 基础DOM XSS 攻击方式1 : 闭合前标签,插入新标签 鼠标悬停时触发 攻击方式2 : 点击元素时触发 DOM XSS-X(复杂场景) 攻击步骤 : 输入payload: '> 点击"请说出你的伤心往事" 点击"有些费尽心机..." 鼠标移动到图片位置触发 或: 输入payload: ' onclick="alert('xss')"> 点击"有些费尽心机..." 点击"就让往事都随风"触发 5. XSS盲打 特点 : 攻击者输入不会在前端显示 当管理员查看后台时触发 攻击步骤 : 输入常规payload: <script>alert(/xss/)</script> 提交到后台 管理员登录后台(如/xssblind/admin_ login.php)时触发 6. XSS绕过技术 过滤绕过 场景 : 后端过滤 <script 标签(替换为空格) 仅过滤小写 绕过方法 : 大小写混合: <SCRIPT>alert(/xss/)</sCRIpt> 使用替代标签: htmlspecialchars绕过 函数特性 : 转换预定义字符为HTML实体: & → &amp; " → &quot; ' → &#039; < → &lt; > → &gt; 漏洞点 : 未对所有上下文进行转义 单引号可能未被处理 攻击payload : 第一个单引号闭合href属性 第二个单引号闭合onclick属性 href输出绕过 场景 : 常规XSS过滤已生效 但允许javascript伪协议 攻击payload : JS输出绕过 场景 : 用户输入被放入JavaScript变量 攻击payload : 闭合原JS代码 插入新脚本 7. 防御措施 通用防御 输入验证 : 白名单验证(仅允许预期字符) 黑名单过滤(过滤特殊字符) 输出编码 : HTML实体编码( &, <, >, ", ' ) 根据输出上下文选择适当编码 CSP(内容安全策略) : 限制脚本来源 禁止内联脚本 特定场景防御 DOM XSS防御 : 避免使用 innerHTML 使用 textContent 代替 对动态插入内容进行净化 存储型XSS防御 : 数据库层输入过滤 输出时统一编码 Cookie安全 : 设置HttpOnly标志 设置Secure标志(HTTPS) 设置SameSite属性 8. 测试与验证 测试方法 基础测试 : 输入 '"<> 观察输出 尝试简单payload: <script>alert(1)</script> 进阶测试 : 尝试各种事件处理器(onmouseover, onerror等) 测试大小写混合 尝试编码绕过 工具辅助 : 使用Burp Suite等工具测试 自动化扫描工具 验证要点 确认所有用户输入点都经过处理 验证输出编码是否适用于所有上下文 检查CSP策略是否有效实施 通过全面理解XSS攻击原理、掌握各种攻击技术并实施恰当的防御措施,可有效保护Web应用免受XSS攻击威胁。