知识点

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

一、CSRF-无检测防护-检测&生成&利用

检测:黑盒手工利用测试,白盒看代码检验(有无token,来源检验等)

生成:BurpSuite->Engagement tools->Generate CSRF Poc

get型直接利用url网址构造即可,post需要使用burp生成html文件

利用:将文件放在自己的站点下,诱使受害者访问(或配合XSS/文件上传触发访问)

二、CSRF-Referer同源-规则&上传&XSS

CSRF攻击绕过策略与防范技术-CSDN博客

严谨代码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校验-值删除&复用&留空

CSRF攻击绕过策略与防范技术-CSDN博客

严谨代码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、环境绑定 打转。
渗透测试者关注的永远是:凭证能否被窃取、重放、或伪造。

总结

鸡肋 了解会简单的利用即可

欢迎来访 这是我的小窝~ 网安弱鸡 健身屌丝 好不容易搭出来的 大佬略过我
最后更新于 2025-11-24