首页 > 编程语言 >java代码审计-SSRF

java代码审计-SSRF

时间:2023-03-08 15:36:57浏览次数:53  
标签:审计 openStream java String SSRF url URLConnection new return

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协议读文件
image.png
使用http协议访问百度
image.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漏洞利用相关可以看这篇文章,总结的很详细!
https://tttang.com/archive/1648/

标签:审计,openStream,java,String,SSRF,url,URLConnection,new,return
From: https://www.cnblogs.com/Ne2o1/p/17192112.html

相关文章

  • java8 Optional判空使用
    1Optional.ofNullable(值1).orElse(值2)ViewCode作用:用来判断对象是否为空,空执行值2,不空执行值1坑---如果值2是一个方法,即使值1不为空,值2也会被执行。解决办法:可......
  • JAVA (Spring Boot)数据AES加密解密
    packagecom.example.controller;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;importjavax......
  • 升级ArcGIS API for JavaScript 4.26踩坑指南
    背景    之前有个老项目用了4.23的版本,就想着升级到最新,万万没想到折腾了一天,踩了不少坑终于搞好了。版本升级问题    首先升级版本不是改下版本好就行,还要配......
  • 【JavaScript UI库和框架】上海道宁与Webix为您提供用于跨平台Web应用程序开发的JS框
     Webix是Javascript库一种软件产品用于加速Web开发的JavaScriptUI库和框架Webix用于跨平台Web应用程序开发的JS框架102个UI小部件和功能丰富的CSS/HT......
  • [java-基础]-Java构造方法的执行顺序
    (一)Java构造方法的执行顺序1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法。ClassThisClass{}默认隐式添加无参的构造方法,相当于ClassThi......
  • Java相关转化
    Scanner相关操作:参考文章字符串数组转化为int数组Strings=in.nextLine();//获取字符串中的每一个数字.字符串转数组String[]strArr=s.split(",");//创建一个in......
  • [java]-自定义注解
    aop+自定义注解注解基础1.Java注解的描述java注解又叫做java标注,是java的一种注释机制,在jdk5.0引入。其可以作用在类、方法、变量、参数和包上。另外,其可以通过反射来获......
  • [Java]基础篇-对象存储OSS
    商城品牌管理新建品牌管理菜单逆向生成的vue代码复制到vscode工作空间brand.vue页面代码brand-add-or-update.vue添加修改组件代码启动项目:对显示状态进行优化......
  • [java]-超时自动处理
    实现方式1.数据库轮询(30)订单表(订单ID、状态、创建时间)物理、逻辑2.JDK队列DelayedQueue无界阻塞队列​poll()得到超时的元素,如果没有任何元素超时,......
  • [java基础]-反射
    (一)反射:框架设计的灵魂1.反射介绍*框架:半成品软件。可以在框架的基础上进行软件开发,简化编码*反射:将类的各个组成部分封装为其他对象,这就是反射机制 *好处: 1.可以......