URLConnection()和openStream()两个方法产生SSRF的原理和修复方法

2024-01-04 19:12

本文主要是介绍URLConnection()和openStream()两个方法产生SSRF的原理和修复方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今年是自主研发的第三个年份,也是重视安全的年份。

转一篇小文章:

0x00 前言

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定 URL 地址获取网页文本内容,加载指定地址的图片,下载等等。这里主要介绍java中URLConnection()openStream()两个方法产生SSRF的原理和修复方法

0x01 URLConnection

    @RequestMapping(value = "/urlConnection/vuln", method = {RequestMethod.POST, RequestMethod.GET})public String URLConnectionVuln(String url) {return HttpUtils.URLConnection(url);}

这里调用的是HttpUtils.URLConnection(url)

    public static String URLConnection(String url) {try {URL u = new URL(url);URLConnection urlConnection = u.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); //send request// BufferedReader in = new BufferedReader(new InputStreamReader(u.openConnection().getInputStream()));String inputLine;StringBuilder html = new StringBuilder();while ((inputLine = in.readLine()) != null) {html.append(inputLine);}in.close();return html.toString();} catch (Exception e) {logger.error(e.getMessage());return e.getMessage();}}

跟进URLConnection方法,而URLConnection里又调用了URL.openConnection()来发起请求, 这个请求可以直接执行url协议(伪协议)
漏洞利用:
使用file协议读文件


使用http协议访问百度


修复方法:
这里先是对url调用了SecurityUtil.isHttp()来进行检查

    @GetMapping("/urlConnection/sec")public String URLConnectionSec(String url) {// Decline not http/https protocolif (!SecurityUtil.isHttp(url)) {return "[-] SSRF check failed";}try {SecurityUtil.startSSRFHook();return HttpUtils.URLConnection(url);} catch (SSRFException | IOException e) {return e.getMessage();} finally {SecurityUtil.stopSSRFHook();}}

SecurityUtil.isHttp()比较简单,就是判断url是否是以http://或https://开头

    public static boolean isHttp(String url) {return url.startsWith("http://") || url.startsWith("https://");}

单纯的ban掉其他协议显然是不够的,还不能够防止对内网进行探测,于是在获取url内容之前,开启了一个hook来对用户行为进行监听,SecurityUtil.startSSRFHook(),就有效防止了ssrf攻击

0x02 openStream

openStream()方法的实现也是调用了openConnection生成一个URLConnection对象,然后再通过这个对象调用的getInputStream()方法的

    @GetMapping("/openStream")public void openStream(@RequestParam String url, HttpServletResponse response) throws IOException {InputStream inputStream = null;OutputStream outputStream = null;try {String downLoadImgFileName = WebUtils.getNameWithoutExtension(url) + "." + WebUtils.getFileExtension(url);// downloadresponse.setHeader("content-disposition", "attachment;fileName=" + downLoadImgFileName);URL u = new URL(url);int length;byte[] bytes = new byte[1024];inputStream = u.openStream(); // send requestoutputStream = response.getOutputStream();while ((length = inputStream.read(bytes)) > 0) {outputStream.write(bytes, 0, length);}} catch (Exception e) {logger.error(e.toString());} finally {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}}}

通过WebUtils.getNameWithoutExtension(url) + "." + WebUtils.getFileExtension(url)来获取下载文件名,然后执行inputStream = u.openStream();来看一下openStream(),也是调用了openConnection(),也会根据传入的协议的不同来进行处理

    public final InputStream openStream() throws java.io.IOException {return openConnection().getInputStream();}

由此可以得知,openStream()方法同样也可以进行ssrf来探测内网以及文件下载,修复方案同上

0x03 总结

关键词:
URLConnection、openConnection、openStream
漏洞利用:
关于SSRF漏洞利用相关可以看这篇文章,总结的很详细!
从一文中了解SSRF的各种绕过姿势及攻击思路

原:URLConnection()和openStream()两个方法产生SSRF的原理和修复方法-电子发烧友网

这篇关于URLConnection()和openStream()两个方法产生SSRF的原理和修复方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570318

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu