Pikachu靶场-Cross-Site Scripting
字数 2034 2025-08-24 20:49:22
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:
' onclick="alert('xss')">
- 点击元素时触发
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实体:
&→&"→"'→'<→<>→>
漏洞点:
- 未对所有上下文进行转义
- 单引号可能未被处理
攻击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. 防御措施
通用防御
-
输入验证:
- 白名单验证(仅允许预期字符)
- 黑名单过滤(过滤特殊字符)
-
输出编码:
- HTML实体编码(
&, <, >, ", ') - 根据输出上下文选择适当编码
- 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攻击威胁。