文章目录
- 1、java支持的网络请求协议:
- 2、Java 中能发起⽹络请求的类
- 2.1、仅⽀持 HTTP/HTTPS 协议的类
- 2.2、⽀持 sun.net.www.protocol 所有协议的类
- 2.3、审计关键词
- 3、靶场
- 3.1、漏洞代码1
- 3.2、ftp协议读取技巧
- 3.3、无回显之探测内网
- 3.4、无回显之探测文件
之前的文章,
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 {@Overrideprotected 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());}@Overrideprotected 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.inissrf1?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、无回显之探测文件
探测存在的文件时,一切正常,
探测不存在的文件时,报错
小结,
访问存在的文件,一切正常访问不存在的文件,可能会返回报错,但是以上两种请求,时间几乎一致