安全测试之SSRF请求伪造

前言

SSRF漏洞是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。
很多Web应用都提供了从其他的服务器上获取数据的功能,根据用户指定的URL,Web应用可以获取图片、下载文件、读取文件内容等。这种功能如果被恶意使用,将导致存在缺陷的Web应用被作为代理通道去攻击本地或远程服务器。这种形式的攻击被称为服务端请求伪造攻击。
一般情况下,SSRF攻击的目标是外网无法访问的内部系统
本文主要分享以下技术:
一、漏洞原理
二、SSRF挖掘技巧
三、常见的SSRF攻击
3.1、针对服务器本身的SSRF攻击
3.2、针对其他后端系统的SSRF攻击
3.3、端口扫描
3.4、对内网web应用进行指纹识别及攻击其中存在漏洞的应用
3.5、文件读取和命令执行
四、绕过SSRF的常见防御
4.1、绕过利用黑名单防御
4.2、绕过利用白名单的防御
4.3、通过开放重定向绕过SSRF过滤器
五、SSRF防御
SSRF防御

漏洞原理

SSRF的形成大多是由于服务端提供了从其他服务器获取数据的功能,但是没有对目标地址进行过滤和限制。
主要攻击方式:
1.对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
2.攻击运行在内网或者本地的应用程序。
3.对内网的web应用进行指纹识别(通过请求默认文件得到特定的指纹),对资产信息进行识别。
4.利用file协议读取本地文件。
5.攻击内外网的web应用,主要是使用HTTP GET请求就可以实现的攻击等。
比如,一个正常的Web应用本应该从指定URL获取网页文本内容或加载指定地址的图片,而攻击者利用漏洞伪造服务器端发起请求,从而突破了客户端获取不到数据的限制,如内网资源、服务器本地资源等。
如下代码:

<?php$url=$_GET['url'];echo file_get_contents($url);
?> 

这段代码使用file_get_contents函数从用户指定的URL获取图片并展示给用户。此时如果攻击者提交如下payload,就可以获取到内网主机HTTP服务8000端口的开放情况(http://example.com/ssrf.php?url=http:192.168.209.134:8000)

SSRF挖掘技巧

目前常见的漏洞挖掘方式有两种:

1、从web功能上挖掘

①分享:通过url地址分享网页内容

②转码服务

③在线翻译

④图片的下载与加载

⑤图片、文章收藏功能

⑥未公开的API实现及调用URL的功能

2、从URL关键字挖掘

Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain……

常见的SSRF攻击

SSRF攻击通常利用信任关系来进行攻击并执行未经授权的操作。这些信任关系可能与服务器本身有关,也可能与同一系统内的其他后端系统有关。

3.1、针对服务器本身的SSRF攻击

在针对服务器本身的SSRF攻击中,攻击者诱使应用程序通过其环回网络接口向承载应用程序的服务器发出HTTP请求。通常,这将涉及为URL提供一个主机名,例如127.0.0.1(指向回送适配器的保留IP地址)或localhost(同一适配器的常用名称)。

例如:一个购物应用程序,该应用程序使用户可以查看特定商店中某商品是否有库存。为了提供库存信息,应用程序必须根据所涉及的产品和商店查询各种后端REST API。该功能是通过将URL通过前端HTTP请求传递到相关的后端API端点来实现的。因此,当用户查看某件商品的库存状态时,他们的浏览器会发出如下请求:

他们的浏览器会发出如下请求:

POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1

服务器向指定的URL发出请求,检索库存状态,然后将其返回给用户。

在这种情况下,攻击者可以修改请求以指定服务器本身本地的URL。例如:

POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118stockApi=http://localhost/admin

在这里,服务器将获取/admin的内容并将其返回给用户。

现在攻击者可以直接访问/admin;但是,通常只有适当的经过身份验证的用户才能访问管理功能。因此,直接访问URL时将不会看到任何有价值的内容。但是,当对/admin的请求来自本地计算机时,将绕过常规的访问控制,该应用程序授予对管理功能的完全访问权限,因为该请求来自受信任的位置。
为什么应用程序会以这种方式运行,并且隐式信任来自本地计算机的请求?发生这种情况可能有多种原因:

1、该访问控制检查可能会在应用服务器的前面,利用一个不同的组件来实现,与服务器本身建立连接后,将绕过检查。

2、为了灾难恢复的目的,该应用程序可能允许无需登录即可对本地计算机上的任何用户进行管理访问,这为管理员提供了一种在丢失凭据的情况下恢复系统的方法。这里假设是来自服务器本身的用户才能完全受信任。

3、管理界面可能正在侦听的端口号与主应用程序不同,因此用户可能无法直接访问。

在这种信任关系中,由于来自本地计算机的请求与普通请求的处理方式不同,这些信任关系会使SSRF成为严重漏洞。

3.2、针对其他后端系统的SSRF攻击

SSRF引起的另一种信任关系是:服务器能够与用户无法直接访问的其他后端系统进行交互,这些系统通常具有不可路由的专用IP地址。由于后端系统通常受网络拓扑保护,因此它们的安全状态较弱。在许多情况下,内部后端系统包含敏感功能,能够与该系统进行交互的任何人都可以在不进行身份验证的情况下对其进行访问。

在前面的示例中,假设在后端URL处有一个管理界面 https://192.168.0.68/admin。在这里,攻击者可以通过提交以下请求来利用SSRF漏洞来访问管理界面:

POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118stockApi=http://192.168.0.68/admin

3.3、端口扫描

http://example.com/ssrf.php?url=http:ip:21/
http://example.com/ssrf.php?url=http:ip:443/
http://example.com/ssrf.php?url=http:ip:80/
http://example.com/ssrf.php?url=http:ip:3306/等

我们可以通过响应时间、返回的错误信息、返回的服务Banner信息、响应时间等来对端口开放情况进行给判断。

3.4、对内网web应用进行指纹识别及攻击其中存在漏洞的应用

大多数web应用都有一些独特的文件和目录,通过这些文件可以识别出应用的类型,甚至详细的版本。基于此特点可利用SSRF漏洞对内网Web应用进行指纹识别,如下Payload可以识别主机是否安装了WordPress:

http://example.com/ssrf.php?url=https%3A%2F%2F127.0.0.1%3A443%2Fwp-content%2Fthemes%2Fdefault%2Fimages%2Faudio.jpg

得到指纹后,便能有针对性地对其存在的漏洞进行利用,如下payload展示了如何利用SSRF漏洞攻击内网的JBOSS应用:

http://example.com/ssrf.php?url=http%3A%2F%2F127.0.0.1%3A8080%2Fjmx-console%2FHtmlAdaptor%3Faction%3DinvokeOp%26name%

3.5、文件读取和命令执行

1、文件读取

如果攻击者指定了file协议,则可通过file协议来读取服务器上的文件内容,如下:

http://example.com/ssrf.php?url=file:///etc/passwd

2、命令执行

例如PHP环境下,利用expect协议执行系统命令,如下:

http://example.com/ssrf.php?url=expect://id

绕过SSRF的常见防御

4.1、绕过利用黑名单防御

一些应用程序阻止包含主机名(如127.0.0.1和localhost)或敏感URL(如/admin)的输入/admin。在这种情况下,绕过方法如下:

1、替代IP127.0.0.1,例如2130706433、017700000001、127.1。

2、注册您自己的域名,该域名解析为127.0.0.1。您可以spoofed.burpcollaborator.net用于此目的。

3、使用URL编码或大小写变化对阻塞的字符串进行混淆。

4.2、绕过利用白名单的防御

某些应用程序仅允许输入匹配,以允许值开头或包含允许值的白名单的输入。在这种情况下,您有时可以利用URL解析中的不一致来绕过过滤器。

URL规范包含许多功能,在实现URL的临时分析和验证时可能会被忽略:

1、使用@字符在主机名之前的URL中嵌入凭据。例如:https://expected-host@evil-host。

2、使用该#字符来指示URL片段。例如:https://evil-host#expected-host。

3、利用DNS命名层次结构将所需的输入放入DNS名称中。例如:https://expected-host.evil-host。

4、使用URL编码字符来混淆URL解析代码,如果实现过滤器的代码与执行后端HTTP请求的代码以不同的方式处理URL编码的字符,则特别有用。

5、这些技术可以组合在一起使用。

4.3、通过开放重定向绕过SSRF过滤器

通过利用开放重定向漏洞,有时可以绕过任何基于过滤器的防御。

假设严格验证了用户提交的URL,以防止恶意利用SSRF行为,但是,允许使用URL的应用程序包含一个打开的重定向漏洞。提供用于使后端HTTP请求支持重定向的API,可以构造一个满足过滤条件的URL,并导致将请求重定向到所需的后端目标。

例如,假设应用程序包含一个开放重定向漏洞,其中包含以下URL:/product/nextProduct?currentProductId=6&path=http://evil-user.net返回重定向到:http://evil-user.net

以利用开放重定向漏洞绕过,并按如下方式利用SSRF漏洞:

POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118stockApi=http://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://192.168.0.68/admin

这种SSRF漏洞之所以有效,是因为应用程序首先验证了提供的stockAPIURL是否在允许的域上,然后,应用程序提供的URL,触发重定向,并向攻击者选择的内部URL发出请求。

SSRF防御

SSRF漏洞的防御主要是保证用户请求的合法性、服务器行为的合规性两个方面。

1、限制请求端口只能为web端口,只允许访问HTTP和HTTPS的请求;

2、过滤返回的信息;

3、禁止不常使用的端口;

4、限制不能访问内网的IP,防止对内网进行攻击;

5、对于DNS重绑定,使用DNS缓存或者Host白名单
安全测试

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

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

相关文章

Stable Diffusion 系列教程 - 6 Dreambooth及训练

Stable-Diffusion、Imagen等文生图大模型已经具备了强大的生成能力&#xff0c;假设我们的Prompt为 [Cyberpunk Style]&#xff0c;SD或许能很快画出赛博朋克风格的一幅画。但你作为一个不知名的人&#xff0c;不能奢求SD在训练的时候把你自己想要的风格也加进去吧&#xff1f;…

『C++成长记』日期类的实现

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、日期类的实现 &#x1f4d2;1.1日期类功能 &#x1f4d2;1.2拷贝日期 &#…

自动驾驶代客泊车PAVP功能规范

目录 1. 版本记录......................................................................................... 4 2. 引言................................................................................................ 5 2.1 目的/范围...............…

2023的线上事故复盘总结(OOM,数据库崩溃)持续更新中~

项目场景&#xff1a; 智慧门禁系统&#xff0c;公司研制的一个saas系统&#xff0c;基于Springcloud框架&#xff0c;主要是面向高校对老师学生的通行方式做统一的管理&#xff0c;可通过卡、码、脸等多种方式进出&#xff0c;可实现不同人员进出不同的场所&#xff0c;例如宿…

使用ChatGPT生成i项目需求文档模板

前言 我们在工作中需要编写的技术文档有多种形式&#xff0c;包括Word、Excel、PDF及一些在线形式。我们可以借助ChatGPT生成文本&#xff0c;然而&#xff0c;它不能直接生成Word、Excel、PDF等格式的文档。因此&#xff0c;我们需要利用其他工具来帮助我们生成一些模板&…

三、计算机理论-关系数据库-数据库的完整性与安全性,事务管理、并发控制、数据库的备份与恢复

数据库完整性 完整性是为了防止合法用户在使用数据库时向数据库中加入不符合语义的数据 实体完整性 实体完整性约束时通过主码的定义来实现的&#xff0c;使用PRIMARY KEY来定义&#xff0c;对于单个属性的主码可以使用列级完整性约束&#xff0c;若主码是一个属性组&#xff…

golang如何生成csv文件

在Go语言中&#xff0c;可以使用标准库中的"encoding/csv"包来生成CSV文件。下面是一个简单的示例代码&#xff0c;演示如何使用Go生成CSV文件&#xff1a; package mainimport ("encoding/csv""os" )func main() {// 创建一个新的CSV文件file,…

EtherCAT主站SOEM -- 14 --Qt-Soem通过界面采集从站IO进行显示

EtherCAT主站SOEM -- 14 --Qt-Soem通过界面采集从站IO进行显示 一 mainwindow.c 文件函数:1.1 自定义PDO配置1.2 主站初始化二 motrorcontrol.c 文件三 allvalue.h 文件该文档修改记录:总结一 mainwindow.c 文件函数: 1.1 自定义PDO配置 int IO_setup(uint16 slave) {int

YoloV7使用detect.py检测,结果图片不显示框

detect.py里画框部分默认是屏蔽的&#xff0c;需要自己打开。下图红框里屏蔽部分打开后&#xff0c;就显示框了。

QT上位机开发(日志调试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 程序开发中有很多的调试方法&#xff0c;比如说IDE调试&#xff0c;也就是设置断点、查看变量等等&#xff1b;比如说日志调试&#xff1b;比如说c…

PDF控件Spire.PDF for .NET【安全】演示:获取并验证 PDF 中的数字签名

在 PDF 中创建数字签名广泛用于保护 PDF 文件。因此&#xff0c;当您查看一些带有数字签名的PDF文件时&#xff0c;需要获取并验证数字签名。本文向您展示了一种通过使用Spire.PDF和 C# 代码来获取和验证 PDF 中的数字签名的解决方案。 Spire.PDF for .NET 是一款独立 PDF 控件…

【Linux】常用的基本命令指令①

前言&#xff1a;从今天开始&#xff0c;我们逐步的学习Linux中的内容&#xff0c;和一些网络的基本概念&#xff0c;各位一起努力呐&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &#x1f4af;代码…

CLIP is Also an Efficient Segmenter

表1 复现结果–Seed&#xff1a;70.7245673447014&#xff0c;dCRF&#xff1a;74.85437742935268 误差小于0.5个点&#xff0c;可以接受 表4 复现结果–训练300轮&#xff0c;Val&#xff1a;58.76741354153312&#xff0c;Test&#xff1a;59.18210 感想 VOC全部复现完成&…

基于SpringBoot的校园外卖服务系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的校园外卖服务系统,java…

小白入门基础 - tomcat

一&#xff1a;前言 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#x…

xxxView

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

【INTEL(ALTERA)】生产中使用多个目标设备,如何满足外部内存接口Intel Agilex® 7偏移匹配准则?

说明 对于外部内存接口Intel Agilex 7使用的引脚&#xff0c;不同的引脚兼容设备可能会有不同的封装延迟。如果您遵循《外部内存接口用户指南》中的“偏移匹配指南”部分所述的要求&#xff0c;您可能会发现无法同时满足多个器件的要求。用户指南仅适用于您计划在开发阶段使用…

【SpringBoot+dubbo+zk】实现服务之间rpc通信

0)前置准备&#xff0c;我们使用zk作为注册中心&#xff0c;先启动zk&#xff0c;也就是2181端口。 1)父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http…

【软件测试】概述

《软件缺陷》 定义 &#xff08;从产品内部看&#xff09;软件产品开发或维护过程中存在的错误、毛病等各种问题&#xff08;从产品外部看&#xff09;系统所需要实现的某种功能的失效或违背 表现形式(1) 软件没有实现产品规格说明所要求的功能模块(2) 软件中出现了产品规格说…

SpringBoot2.7升级项目到Springboot3踩坑指南

文章目录 概要国内顶级开源项目升级情况适配SpringBoot3指南技术细节小结 概要 由于SpringBoot3.x全面拥抱JDK17,兼容jdk21&#xff0c;jdk17乃是大势所趋。这里是从SpringBoot2.7-->SpringBoot3.1踩坑指南。 提前阅读&#xff1a;jdk8升级JDK17避坑指南&#xff08;适用于…