CSRF 攻击
CSRF 攻击
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的Web安全攻击手段。攻击者通过诱骗用户在已登录的Web应用中执行非本意操作,从而以用户身份执行恶意请求(如转账、改密码等)。
一、核心概念与攻击原理
1. 攻击本质
- 利用用户身份:攻击者借助用户已登录的身份,在目标网站执行非预期操作。
- 隐式身份验证:依赖浏览器自动携带的 Cookie、Session 等身份凭证。
2. 攻击条件
- 用户已登录目标网站(存在有效会话)。
- 目标网站存在未防护的状态修改操作(如转账、删除数据)。
- 攻击者构造恶意请求,诱导用户访问(如通过邮件、钓鱼链接)。
3. 典型场景
- 银行转账:攻击者诱导用户在已登录网银的浏览器中访问恶意页面,伪造转账请求。
- 社交平台:伪造发布内容、关注操作等。
- 企业系统:删除数据、修改权限等敏感操作。
二、攻击方式分类
1. GET 请求攻击
<!-- 隐藏图片,自动触发请求 -->
<img src="https://bank.com/transfer?to=attacker&amount=10000" style="display:none">
2. POST 请求攻击
<form action="https://bank.com/transfer" method="POST" id="maliciousForm"><input type="hidden" name="to" value="attacker"><input type="hidden" name="amount" value="10000">
</form>
<script>document.getElementById('maliciousForm').submit();
</script>
3. CSRF 与 JavaScript
- 同源策略限制:攻击者无法直接读取响应内容,但可触发请求。
- JSONP 漏洞:若接口支持 JSONP 且未验证来源,可能被利用。
三、防护措施
1. 同源验证(Origin/Referer)
- 验证请求来源:检查请求头中的
Origin
或Referer
字段。 - 适用场景:简单网站,无复杂跨域需求。
示例(Java):
String referer = request.getHeader("Referer");
if (referer == null || !referer.startsWith("https://trusted-domain.com")) {response.sendError(HttpServletResponse.SC_FORBIDDEN);return;
}
2. CSRF Token
- 生成随机令牌:服务器为每个用户会话生成唯一 Token。
- 表单 / 请求携带:将 Token 嵌入表单或请求头中。
- 服务器验证:处理请求时验证 Token 的有效性。
示例(HTML 表单):
<form action="/transfer" method="POST"><input type="hidden" name="_csrf" value="1234567890abcdef"><button type="submit">转账</button>
</form>
3. SameSite Cookie 属性
- Strict:完全禁止第三方 Cookie。
- Lax:允许部分安全的跨站请求(如链接跳转)携带 Cookie。
- None:允许所有跨站请求携带 Cookie(需配合 Secure 属性)。
示例(设置 Cookie):
Cookie cookie = new Cookie("session_id", "123456");
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setSameSite("Strict"); // 严格模式
response.addCookie(cookie);
4. 双重 Cookie 验证
- 生成随机值:服务器在 Cookie 和表单中设置相同随机值。
- 客户端验证:JavaScript 从 Cookie 读取值并添加到请求头。
- 服务器对比:验证两个值是否一致。
示例(JavaScript):
function getCookie(name) {const value = `; ${document.cookie}`;const parts = value.split(`; ${name}=`);if (parts.length === 2) return parts.pop().split(';').shift();
}// 发送请求时添加 X-CSRF-Token 头
fetch('/api/action', {headers: {'X-CSRF-Token': getCookie('csrf_token')}
});
四、框架防护实现
1. Spring Security
// 启用 CSRF 防护(默认开启)
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());}
}
五、测试与漏洞检测
1. 手动测试
- 构造恶意请求:使用 Burp Suite 等工具拦截并修改请求。
- 验证防护机制:尝试在无 Token 或错误 Token 的情况下提交请求。
2. 自动化工具
- OWASP ZAP:检测 CSRF 漏洞并生成报告。
- W3AF:扫描网站安全漏洞,包括 CSRF。
六、与其他攻击的对比
攻击类型 | 核心机制 | 防护重点 |
---|---|---|
CSRF | 利用用户已登录身份 | 验证请求来源、Token 机制 |
XSS | 注入恶意脚本执行 | 输入过滤、输出编码 |
SQL 注入 | 利用参数注入恶意 SQL | 参数化查询、输入验证 |
SSRF | 伪造服务器发起内部请求 | 限制请求范围、验证目标地址 |