XSS 跨站脚本攻击(XSS)原理与防御
一、XSS 概述
1. 基本概念
- 全称: Cross Site Scripting(跨站脚本攻击),简称 XSS。
- 本质: 前端漏洞,主要利用 JavaScript 代码执行。
- 产生原因: 网站对用户输入过滤不足,导致恶意脚本在页面显示并执行。
2. 核心机制
- 输入输出特征: 必须存在数据交互的输入输出点。
- 执行条件: 服务器未严格过滤用户输入的恶意脚本。
- 触发方式: 浏览器直接执行注入的 JavaScript 代码。
3. 典型场景
- 数据交互点: GET/POST 参数、HTTP Headers。
- 输出点: 用户资料页、关键词标签、富文本编辑器等。
4. XSS 分类
- 反射型(非持久型): 恶意脚本通过 URL 参数即时触发。
- 存储型(持久型): 恶意脚本存储在服务器端持续影响。
- DOM 型: 完全在客户端完成攻击,不经过服务器。
- 特殊类型: mXSS(突变 XSS)、UXSS(通用 XSS)、Flash XSS、UTF-7 XSS。
5. 危害
- 信息窃取: 盗取用户 Cookie、会话凭证。
- 身份冒用: 利用被盗身份执行操作。
- 恶意传播: 对访问者进行病毒侵害。
- 扩展危害: 权限维持、钓鱼攻击、浏览器劫持。
二、XSS 攻击原理与示例
1. 攻击原理
- 本质: 通过网页开发漏洞注入恶意指令代码到网页。
- 执行方式: 用户加载并执行攻击者构造的恶意网页程序。
- 攻击媒介: 不仅限于 JavaScript,还包括 Java、VBScript、ActiveX、Flash 等。
- 攻击后果: 获取更高权限、窃取私密内容、会话和 cookie 等敏感信息。
2. 漏洞产生原理
- 关键条件:
- 输入点:网页接受用户输入(如搜索框)。
- 输出点:将输入内容直接输出到页面源代码中。
- 攻击过程:
- 将正常输入替换为 JS 代码。
- 浏览器渲染时会将 JS 代码识别并执行。
- 示例:搜索关键词显示在页面源代码中,若替换为
<script>alert(1)</script> 则会被执行。
3. 本地漏洞演示
$code = $_GET['x'];
echo $code;
- 漏洞表现: 通过 URL 参数直接输出未过滤内容。
- 测试方法:
xss.php?x=123 会输出 123,改为 xss.php?x=<script>alert(1)</script> 则执行弹窗。
4. DOM 型 XSS 示例
function domxss() {
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a>" + str + "</a>";
}
- 闭合技巧: 通过构造
'><img onmouseover="alert('xss')"> 等 payload 实现攻击。
- 防御要点: 需要对输出内容进行 HTML 实体编码。
三、存储型 XSS
1. 典型场景
- 订单查询功能: 演示使用老旧的订单系统作为案例,该系统具有订单查询功能,是典型的存储型 XSS 攻击面。
- 营销手段与商品展示: 药品、成人用品、保健品等特殊商品营销页面,通常包含'立即购买'、'获取资料'等表单提交功能。
- 招商网站示例: 包含项目资料领取功能,需要用户提交个人信息。
2. 攻击流程
- 攻击者在订单/留言中插入恶意脚本。
- 管理员登录后台查看新订单。
- 恶意脚本在管理员浏览器中执行。
3. 利用条件
4. 防御措施
- 输入输出过滤。
- 设置 HttpOnly 标志。
- 内容安全策略 (CSP)。
四、XSS 平台与工具
1. 平台选择
- 第三方平台: 网上有免费平台可用,但需注意信息可能被平台所有者获取。
- 自建优势: 完全掌控数据安全,避免信息泄露风险,适合隐蔽性要求高的项目。
2. BeEF 框架
- 部署方法: 通过 Docker 运行命令
docker run --rm -p 3000:3000 janes/beef 启动 BeEF 平台。
- 访问方式: 部署成功后访问
http://127.0.0.1:3000/ui/panel 进入控制面板。
- 功能特点: 专业 XSS 利用框架,支持多种浏览器攻击模块。
3. 攻击效果验证
- 验证方法:
- 观察浏览器请求包中是否包含 XSS 平台地址。
- 检查 XSS 平台是否接收到管理员 cookie 等敏感信息。
- 信息收集: 获取管理员访问的完整 URL 地址、当前会话的 cookie 信息、用户代理 (User-Agent) 等请求头数据。
4. 登录绕过
- 自动跳转机制: 未登录状态下访问后台地址会触发自动跳转。
- 认证信息伪造: 通过 Burp Suite 等工具伪造获取到的认证信息可实现登录绕过。
- 关键参数: uid 参数、cookie 值等认证信息是绕过登录的关键。
五、DOM 型 XSS 实例分析
1. 基本概念
- 核心区别: 与存储型、反射型不同,DOM 型 XSS 的漏洞触发完全在前端页面完成。
- 代码审计重点: 主要查看 HTML/JS 代码,无需审计 PHP/JAVA 等后端代码。
- 数据流向: 恶意输入→前端 JS 处理→DOM 操作→漏洞触发。
2. 帝国 CMS 漏洞实例
- 漏洞文件:
/e/d6/img/index.htm
- 关键代码: 通过 requestURL 获取浏览器地址栏参数,未过滤直接写入 DOM(document.write)。
- 攻击原理: 构造
javascript:alert(1) 形式 payload。
3. 漏洞利用方法
- 构造方式: 直接修改 URL 参数:
/e/d6/img/index.htm?url=javascript:alert(1)。
- 检测目标: 存在前端 URL 参数处理的页面。
- 特征识别: 使用 document.write/innerHTML 等动态 DOM 操作,存在 location/window.location 等 URL 参数获取。
六、知识总结
| 知识点 | 核心内容 | 关键要点 |
|---|
| XSS 漏洞原理 | 输入输出机制导致 JS 代码执行 | 接收用户输入数据;将数据输出到页面;JS 代码被浏览器解析执行 |
| XSS 分类 | 反射型/存储型/DOM 型对比 | 反射型:一次性构造利用;存储型:持久化数据库攻击;DOM 型:纯前端 JS 实现 |
| 反射型 XSS | 非持久化攻击特点 | 需构造恶意链接;依赖受害者点击;实战利用难度大 |
| 存储型 XSS | 数据库持久化危害 | 留言板/评论系统高发;可长期影响后续访问者;配合 XSS 平台窃取 cookie |
| DOM 型 XSS | 纯前端漏洞特征 | 不依赖后端处理;完全在浏览器环境触发 |
| XSS 利用工具 | XSS 平台/BEEF 框架 | XSS 平台:cookie 窃取基础功能;BEEF:浏览器劫持/钓鱼攻击 |
| 防御措施 | 常见防护与绕过 | 输入输出过滤;CSP 策略;httponly cookie 防护 |
| 实战案例 | 典型漏洞场景 | UA 查询平台反射案例;订单系统存储型案例;帝国 CMS DOM 型案例 |