知识点
CSRF-无检测防护-检测&生成&利用
CSRF-Referer同源-规则&上传&XSS
CSRF-Token校验-值删除&复用&留空

一、CSRF-无检测防护-检测&生成&利用
检测:黑盒手工利用测试,白盒看代码检验(有无token,来源检验等)
生成:BurpSuite->Engagement tools->Generate CSRF Poc
get型直接利用url网址构造即可,post需要使用burp生成html文件
利用:将文件放在自己的站点下,诱使受害者访问(或配合XSS/文件上传触发访问)
二、CSRF-Referer同源-规则&上传&XSS
严谨代码PHP DEMO:
<?php
// 检测来源
function checkReferrer() {
$expectedReferrer = "http://example.com"; // 期望的来源页面
if (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] !== $expectedReferrer) {
die("非法访问");
}
}
// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 检测来源
checkReferrer();
// 获取用户输入的数据
$name = $_POST['name'];
$email = $_POST['email'];
// 输出用户输入的数据
echo "姓名:$name<br>";
echo "邮箱:$email<br>";
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<title>检测来源示例</title>
</head>
<body>
<h1>检测来源示例</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<label for="name">姓名:</label>
<input type="text" name="name" id="name" required />
<br>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" required />
<br>
<input type="submit" value="提交" />
</form>
</body>
</html>

绕过0:规则匹配绕过问题(代码逻辑不严谨)
1、<meta name="referrer" content="no-referrer">
2、http://xx.xx.xx.xx/http://xx.xx.xx.xx
绕过1:配合文件上传绕过(严谨使用同源绕过)
绕过2:配合存储XSS绕过(严谨使用同源绕过)
三、CSRF-Token校验-值删除&复用&留空
严谨代码PHP DEMO:
<?php
session_start();
// 生成并存储 CSRF Token
function generateCSRFToken() {
$token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $token;
return $token;
}
// 检查 CSRF Token 是否有效
function validateCSRFToken($token) {
return isset($_SESSION['csrf_token']) && $_SESSION['csrf_token'] === $token;
}
// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 检查 CSRF Token
if (!isset($_POST['csrf_token']) || !validateCSRFToken($_POST['csrf_token'])) {
die("CSRF Token 验证失败");
}
// 获取用户输入的数据
$name = $_POST['name'];
$email = $_POST['email'];
// 输出用户输入的数据
echo "姓名:$name<br>";
echo "邮箱:$email<br>";
exit;
}
// 生成 CSRF Token
$csrfToken = generateCSRFToken();
?>
<!DOCTYPE html>
<html>
<head>
<title>CSRF Token 示例</title>
</head>
<body>
<h1>CSRF Token 示例</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<input type="hidden" name="csrf_token" value="<?php echo $csrfToken; ?>" />
<label for="name">姓名:</label>
<input type="text" name="name" id="name" required />
<br>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" required />
<br>
<input type="submit" value="提交" />
</form>
</body>
</html>

绕过0:将Token参数值复用(代码逻辑不严谨)
绕过1:将Token参数删除(代码逻辑不严谨)
绕过2:将Token参数值置空(代码逻辑不严谨)
置空来源-添加后数据包请求头不带来源
举例
1、我抓到了支付的数据包
向zmx用户账号2291772752@qq.com 转账666的数据包请求
数据包:www.zmxupforever.cn/pay.html?name=zmx&account=2291772752@qq.com&money=666
2、我的网站首页或某个页面上写一个加载数据包代码(付款的数据包)www.zmxupforever.cn
3、受害者在支付宝登录状态 同时访问了www.zmxupforever.cn 等于触发付款数据包 666就付了
CSRF攻击(跨站点请求伪造)
对方访问一个网站,而这个网站藏有我伪造的数据包,对方用他的权限执行了我想让他执行的操作
付款请求:www.zmxupforever.cn 触发
请求伪造:www.alipay.com 数据包
最终触发--->www.zmxupforever.cn/alipay.html
利用条件
1、需要请求伪造数据包
如何伪造?常见的CMS自己搭建然后抓一下,很难搞到。
抓到了就用Burpsuite右键CSRF利用
2、无过滤防护 有过滤防护能绕过
①检测是否同源
目标:http://8.130.135.52:83/
攻击:http://47.94.236.117/
全部对比:一一对应 严谨对比
配合xss或上传(触发数据包保证是同一来源)
上传到目标服务器html,或者xss在目标服务器上执行代码,符合同源
匹配对比:有这个值 不严谨对比
条件:点击过来的
②逻辑漏洞
有的开发问题,不设置一定要检测来源,置空(Referer为空)
③csrf_token
三种方式:复写 置空 删除
3、受害者需要触发(诱惑)
so CSRF更加鸡肋 适合熟人作案
关于token补充
1、Token定义
Token 本质上是一个随机字符串,用来标识一次会话、一次操作、或一个用户的身份。
是人为插入的一道“额外确认”。
2、Token作用
Token 解决的问题其实非常朴素:服务器需要确认“你是不是你”,但又不能只靠 Cookie,因为 Cookie 会被浏览器自动带上,容易被攻击者利用。
3、基于时间戳的 Token
把时间因素引入 Token,使得 Token 即使泄露,也只能在短时间内被利用
如:服务器生成 Token 时,将 随机值 + 用户标识 + 时间戳 拼接,然后用某种方式哈希签名。
token = HMAC(secret, user_id + timestamp + random)
4、Token在CSRF的利用
CSRF(跨站请求伪造)攻击的核心利用点是:
浏览器会自动带上 Cookie,所以攻击者可以诱导用户访问一个恶意链接,浏览器帮忙发请求,然后服务器还以为这是用户本人。
攻击者不能从受害者浏览器里读出这个 Token(同源策略的保护),所以即使攻击者构造请求,也无法附带正确的 Token,服务器当然不会认账。
5、Cookie、session、Token、Jwt




6、总结此类鉴权漏洞思路
(1)服务器有没有严格验证签名或 token
(2)这个身份凭证是不是可以被读取(XSS、错误存储区)
(3)这个凭证有没有过期、绑定、一次性限制
许多场景里,真正能让攻击成功的都是“凭证被抢走后还能用”。
四者的安全问题本质都集中在凭证被读取、被预测、或验证机制缺失。
防护方案围绕 随机性、过期时间、签名、HttpOnly、Secure、SameSite、环境绑定 打转。
渗透测试者关注的永远是:凭证能否被窃取、重放、或伪造。

总结
鸡肋 了解会简单的利用即可
Comments NOTHING