0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

哆啦安全 来源:哆啦安全 2023-04-28 15:45 次阅读

0x00 前言

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定 URL 地址获取网页文本内容,加载指定地址的图片,下载等等。这里主要介绍javaURLConnection()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协议读文件

e54b8f3e-e572-11ed-ab56-dac502259ad0.png


使用http协议访问百度

e56505e0-e572-11ed-ab56-dac502259ad0.png


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

    @GetMapping("/urlConnection/sec")
    public String URLConnectionSec(String url) {

        // Decline not http/https protocol
        if (!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);
            // download
            response.setHeader("content-disposition", "attachment;fileName=" + downLoadImgFileName);

            URL u = new URL(url);
            int length;
            byte[] bytes = new byte[1024];
            inputStream = u.openStream(); // send request
            outputStream = 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的各种绕过姿势及攻击思路


审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8183

    浏览量

    82732
  • URL
    URL
    +关注

    关注

    0

    文章

    135

    浏览量

    14872

原文标题:0x03 总结

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    笔记本电池损耗修复方法

    笔记本电池损耗修复方法
    发表于 08-20 12:59

    linux无法开机的修复方法概述

    概述:我们在使用linux的时候如果遇到无法开机了怎么办呢?难道要重装系统了吗?是不是看着那满屏幕的乱码(其实很有用)束手无策,本次博客,我来给大家尽量详尽的介绍几种linux常见错误的修复方法
    发表于 07-11 07:28

    GitHub图片加载失败的修复方法是什么

    HATEOAS是什么意思?UUID是什么?UUID有何作用?GitHub图片加载失败的修复方法是什么?
    发表于 08-17 07:25

    手机电池修复方法

    手机电池修复方法   修复手机电池的方法 对目前网上流行的几招修复手机锂离子电池的方法的测试!  &n
    发表于 10-26 16:54 304次下载

    电瓶修复方法简介

    电瓶修复方法简介 蓄电池坏损是可以修复的,就象人病了需要看病一样,如果只是一般的坏损,如硫化,采取适当的方法就可以修复;如果是致命的坏损,如极板铅粉
    发表于 11-09 17:41 4w次阅读

    基于自动程序修复方法研究

    自动程序修复帮助开发者降低人工修复bug的成本.基于测试集的修复方法旨在生成能够通过测试集的代码补丁,以使程序正常运行.回顾了基于测试集的程序修复的现有文献,按照自动
    发表于 01-15 15:51 0次下载

    轴颈磨损原因及修复方法

    目前针对于轴颈磨损修复方法也有很多,比如补焊机加工、电刷镀、热喷涂等等,但是考虑到修复时间、修复成本、修复效果,小编并不建议采用以上
    发表于 05-12 16:27 2471次阅读

    常用的轴头磨损修复方法汇总

    常用的轴头磨损修复方法汇总
    发表于 11-25 16:26 36次下载

    分析对比几种常用轴修复方法

    分析对比几种常用轴修复方法
    发表于 12-02 11:05 1次下载

    高速冲床轴径磨损有哪些常用的修复方法

    高速冲床轴径磨损有哪些常用的修复方法
    发表于 01-19 09:48 3次下载

    大轴磨损了修复方法有哪些?

    大轴磨损了修复方法有哪些?
    发表于 02-25 11:34 18次下载

    脱硫泵泵壳腐蚀原因分析及修复方法

    脱硫泵泵壳腐蚀原因分析及修复方法
    发表于 03-28 15:33 12次下载

    振动筛轴承位修复方法

    振动筛轴承位修复方法
    发表于 06-17 15:02 0次下载

    机轴承位磨损的几种修复方法

    长期以来,针对提升机轴承位磨损的修复方法无外乎几种,如补焊机加工、热喷涂、电刷镀等等。但这些修复方法往往因复杂的工艺条件和现场环境而受到限制,尤其是在面对一些突发紧急、设备庞大、拆卸复杂等的设备
    发表于 07-26 17:48 1次下载

    大轴磨损的原因及修复方法

    大轴磨损是什么原因导致的?修复方法有哪些?
    发表于 10-26 16:23 1次下载