安全测试之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的形成大多是由于服务端提供了从其他服务器获取数据的功能,但是没有对目标地址进行过滤和限制。
主要攻击方式:
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白名单
相关文章:

安全测试之SSRF请求伪造
前言 SSRF漏洞是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…...
php composer安装
引言 Composer 是 PHP 中的依赖管理工具。它允许您声明您的项目所依赖的库,并且它将为您管理(安装/更新)它们。 官网链接:Introduction - Composer 安装 要在当前目录中快速安装 Composer,请在终端中运行以下脚本。…...

【MyBatis】MyBatis基础操作
文章目录 前言注解方式书写 MyBatis打印 MyBatis 日志参数传递MyBatis 增加操作返回主键 MyBatis 删除操作MyBatis 修改操作MyBatis 查找操作1. 对查询结果进行别名2. Results注解3. 开启驼峰命名(推荐) XML 配置文件方法书写 MyBatis配置数据库的相关配…...
Automatic merge failed; fix conflicts and then commit the result.如何处理
当你在Git中遇到 “Automatic merge failed; fix conflicts and then commit the result.” 的错误时,这意味着你尝试合并两个分支时出现了冲突。Git无法自动解决这些冲突,因此需要你手动解决。以下是处理这种情况的步骤: 找出冲突文件: 运行…...

一文读懂 $mash 通证 “Fair Launch” 规则(幸运池玩法解读篇)
Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台,该平台旨在为 Solana 原生铭文项目,以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash,将会有更多的 Solana 生态的铭…...
Qt3D QGeometryRenderer几何体渲染类使用说明
Qt3D中的QGeometryRenderer派生出来的几何体类包括: Qt3DExtras::QConeMesh, Qt3DExtras::QCuboidMesh, Qt3DExtras::QCylinderMesh, Qt3DExtras::QExtrudedTextMesh, Qt3DExtras::QPlaneMesh, Qt3DExtras::QSphereMesh, Qt3DExtras::QTorusMesh, and Qt3DRender::QMesh 有球…...
pandasDataFrame读和写csv文件
从.csv文件读数据 import pandas as pd# 从CSV文件中读取数据 train_df pd.read_csv("datasets/train01.csv") val_df pd.read_csv("datasets/val01.csv") test_df pd.read_csv("datasets/test01.csv")# 显示数据框的前几行,确保…...
力扣122. 买卖股票的最佳时机 II
动态规划 思路: 假设 dp[i][0] 是第 i 天手上没有股票时的最大利润, dp[i][1] 是第 i 天手上有 1 支股票的最大利润;dp[i][0] 的迁移状态为: dp[i - 1][0],前一天手上已经没有股票,没有发生交易࿱…...
Go语言断言和类型查询
Go语言断言和类型查询 1、类型断言 类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接 口或者具体的类型。 在Go语言中类型断言的语法格式如下: // i.(TypeNname) value, ok : x.(T)其中&…...

02 Deep learning algorithm
Neural Networks target: inference(prediction)training my own modelpractical advice for building machine learning systemdecision Tress application: speech(语音识别) ----> images(计算机视觉)—> t…...

代码随想录算法训练营第二十四天 | 回溯算法
理论基础 代码随想录原文 什么是回溯法 回溯也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率 虽然回溯法很难,不好理解,但是回溯法并不是什么高效的算法。因为回溯的本…...

Spring Cloud Gateway 缓存区异常
目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常,在这里记录一下,直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…...

Spring Boot依赖版本声明
链接 官网 Spring Boot文档官网:https://docs.spring.io/spring-boot/docs/https://docs.spring.io/spring-boot/docs/ Spring Boot 2.0.7.RELEASE Spring Boot 2.0.7.RELEASE reference相关:https://docs.spring.io/spring-boot/docs/2.…...

Java项目:109SpringBoot超市仓管系统
博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 超市仓管系统基于SpringBootMybatis开发,系统使用shiro框架做权限安全控制,超级管理员登录系统后可根据自己的实际需求配角色&…...

【React系列】Redux(三) state如何管理
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer: function reducer(state ini…...

3D 纹理的综合指南
在线工具推荐:3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…...

LLM之RAG实战(十一)| 使用Mistral-7B和Langchain搭建基于PDF文件的聊天机器人
在本文中,使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序,可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few-…...
VLOOKUP的使用方法
VLOOKUP是Excel中一个非常有用的函数,用于在一个表格或范围中查找某个值,并返回该值所在行或列的相应数据。 VLOOKUP函数的基本语法如下: VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])lookup_value:要查…...

数据加密、端口管控、行为审计、终端安全、整体方案解决提供商
PC端访问地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是关于这几个概念的解释: 数据加密:这是一种通过加密算法和密钥将明文转换为密文,以及通过解密算法和解密密钥将密文恢复为明文…...

编码器原理详解
编码器 什么是编码器 编码器可以用来将信息编码成为二进制代码,有点类似于取代号,人为的将二进制代码与对应的信息联系起来。 如下图所示: 假设有这三种情况会发生,且每次只发生一种情况 为了给这三种情况做一个区分ÿ…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...