JAVA安全——红队面试常问问题之XSS漏洞详解
字数 1675 2025-09-01 11:26:11
XSS漏洞详解与防御指南
一、XSS漏洞概述
跨站脚本攻击(XSS)是一种常见的Web安全漏洞,攻击者能够在受害者的浏览器中执行恶意脚本,从而窃取用户数据、劫持会话或进行其他恶意操作。
二、XSS类型详解
1. 反射型XSS
漏洞特点:
- 恶意脚本通过URL参数注入
- 服务器未正确过滤输入,直接反射回页面
- 需要诱骗用户点击恶意链接
攻击示例:
<iframe src="http://attacker.com/xss_payload"></iframe>
完整攻击流程:
- 攻击者在目标网站注入恶意iframe代码
- 用户访问包含恶意代码的页面
- iframe加载攻击者网站并执行XSS攻击
- 攻击者网站修改window.name
- 跳转回目标网站的恶意页面
- 读取并弹出修改过的window.name
攻击者网站代码:
<!DOCTYPE html>
<html>
<head>
<script>
window.name = '恶意代码已执行';
window.location.href = 'http://target.com/reflective_xss_page';
</script>
</head>
<body></body>
</html>
目标网站恶意页面代码:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>反射型XSS漏洞示例</h1>
<script>
alert(window.name);
</script>
</body>
</html>
2. DOM型XSS
漏洞特点:
- 通过修改页面DOM节点形成
- 不依赖服务器端处理
- 可绕过WAF和服务端检测
漏洞成因:
- 客户端代码直接使用未过滤的用户输入操作DOM
攻击示例:
<html>
<head>
<title>DOM Based XSS Demo</title>
<script>
function xsstest() {
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = "";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>
可能触发DOM型XSS的属性:
- document.referer
- window.name
- location
- innerHTML
- documen.write
常用DOM方法:
| 方法 | 描述 |
|---|---|
| getElementById() | 返回带有ID的元素 |
| getElementsByTagName() | 返回包含带有指定标签名称的所有元素的节点列表 |
| getElementsByClassName() | 返回包含带有指定类名的所有元素的节点列表 |
| appendChild() | 把新的子节点添加到指定节点 |
| removeChild() | 删除子节点 |
| replaceChild() | 替换子节点 |
| insertBefore() | 在指定子节点前面插入新的子节点 |
| createAttribute() | 创建属性节点 |
| createElement() | 创建元素节点 |
| createTextNode() | 创建文本节点 |
| getAttribute() | 返回指定的属性值 |
| setAttribute() | 把指定属性设置或修改为指定的值 |
输入来源:
- location.search (URL参数)
- location.href (完整URL)
3. 通用型XSS (UXSS)
漏洞特点:
- 利用浏览器或浏览器扩展漏洞
- 不依赖网站本身漏洞
- 危害性极大
漏洞成因:
- 浏览器或扩展程序存在安全漏洞
- 攻击者可绕过同源策略
典型案例:
-
IE6或火狐浏览器Adobe Acrobat扩展漏洞
- PDF阅读器中的bug允许执行客户端脚本
- 构造恶意页面利用扩展程序打开PDF时运行代码
-
Flash Player UXSS漏洞 (CVE-2011-2107)
- 通过构造的.swf文件可访问Gmail设置
- 攻击者可添加邮件转发地址窃取所有邮件
三、XSS防御措施
1. 输入过滤与验证
- 对所有用户输入进行严格过滤
- 使用白名单机制验证输入格式
2. 输出编码
- 根据输出上下文使用适当的编码
- HTML实体编码
- JavaScript编码
- URL编码
3. 安全HTTP头设置
- Content-Security-Policy (CSP)
- X-XSS-Protection
- HttpOnly Cookie标志
4. DOM操作安全
- 避免使用innerHTML等危险属性
- 使用textContent代替innerHTML
- 使用安全的DOM操作方法
5. 浏览器扩展安全
- 及时更新浏览器和扩展程序
- 仅安装可信来源的扩展
- 禁用不必要的扩展
四、总结
XSS攻击形式多样,从传统的反射型、存储型到基于DOM的XSS,再到危害更大的通用型XSS(UXSS),防御XSS需要从输入过滤、输出编码、安全头设置等多方面入手。特别需要注意的是,UXSS不依赖网站本身漏洞,而是利用浏览器或扩展程序漏洞,因此保持浏览器和扩展程序的及时更新至关重要。