• Java 审计之SSRF篇(续)


    Java 审计之SSRF篇(续)

    0x00 前言

    先来说说为啥会有该篇章,在刚刚码完上篇文章后,后来又去找了找在Java中的一些远程请求的类。果然翻到了一些有意思的东西,在这里就拿出来给大家分享一下。

    0x01 imageIO中的SSRF

    imageIO类是jdk中自带的一个类,主要用于操作一些图片文件。比如读写、压缩图片。

    ssrf 类:

    public class ssrf {
        public static BufferedImage read(URL url) throws IOException {
            if (url == null) {
                System.out.println("输入内容为空");
            }
    
    
            InputStream  istream = url.openStream();
            ImageInputStream stream =  ImageIO.createImageInputStream(istream);  //获取文件流
    
    
            BufferedImage bi = ImageIO.read(stream);  //返回 BufferedImage作为供给的解码结果
    
            return bi;
        }
    }
    

    servlet:

    @WebServlet("/httpclientServlet")
    public class httpclientServlet extends HttpServlet {
    
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String geturl = request.getParameter("url");
            ServletOutputStream outputStream = response.getOutputStream();
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            URL url = new URL(geturl);
            BufferedImage image = ssrf.read(url);
    
            ImageIO.write(image, "png", os);
            InputStream input = new ByteArrayInputStream(os.toByteArray());
            int len;
            byte[] bytes = new byte[1024];
            while ((len = input.read(bytes)) > 0) {
                outputStream.write(bytes, 0, len);
            }
    
    
        }
    
    }
    
    

    写完后来测试一下,先来测试一下传入一个图片的url试试。

    成功输出出来了。证明远程请求图片的功能是没问题的。

    再来读取一下本地文件试试

    发现报错了 貌似读取不了除了图片以外的文件。

    再来尝试一下读取本地的图片试试

    读取成功,看来只能读取图片。

    但这里发现一个东西,就是文件虽然不能读取,但是可以看到该文件存不存在。

    如果文件不存在的话会显示找不到指定文件,而存在但文件不为图片文件的话则显示image==null。

    HttpClient下的SSRF

    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpClient client = new HttpClient();
    HttpGet getRequest = new HttpGet(url);
    HttpResponse response = httpClient.execute(getRequest);
    

    OkHttp 下的SSRF

     Request request = new Request.Builder()
          .url("http://publicobject.com/helloworld.txt")
          .build();
    
      Response response = client.newCall(request).execute();
    

    HttpRequest

    HttpRequest request = HttpRequest.get("http://www.baidu.com",true,'q',"baseball gloves","size",100);
    
    WX:TG9yaTI1NDgyNjYxNDU= 欢迎各位师傅来一起做技术交流
  • 相关阅读:
    SQL中部分语法整理
    iOS获取设备唯一标识的8种方法
    动力节点Java培训告诉你Java线程的多功能用法
    Java编程中的美好
    Node.js process 模块常用属性和方法
    Android系统学习小记
    动力节点Java培训告诉你Java线程的多功能用法
    mybatis-java1234一
    一:luecne初体验
    Linux系统安装-系统分区
  • 原文地址:https://www.cnblogs.com/nice0e3/p/13683023.html
Copyright © 2020-2023  润新知