首页 > 编程语言 >学习笔记-java代码审计-ssrf

学习笔记-java代码审计-ssrf

时间:2022-11-13 08:46:09浏览次数:70  
标签:java String ssrf url http 笔记 漏洞 new httpURLConnection

java代码审计-ssrf

0x01 漏洞挖掘

java发送http请求的方式还是比较多的,下面是原生的:

String url = request.getParameter("url");
URL u = new URL(url);

//1.URL,直接打开,可以跨协议
InputStream inputStream = u.openStream();

//2. URLConnection,使用这种方法发送请求可以跨协议
URLConnection urlConnection = u.openConnection();
//3. HttpURLConnection,进行类型转换之后,只允许http/https
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;
InputStream inputStream = urlConnection.getInputStream();

//处理请求结果
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
StringBuilder html = new StringBuilder();
while ((inputLine = bufferedReader.readLine()) != null) {
  html.append(inputLine);
}
response.getWriter().println("html:" + html.toString());
bufferedReader.close();

//4. ImageIO,如果获取到的不是图片,会返回null
BufferedImage img = ImageIO.read(u);

还有一部分第三方类库的:

// Request漏洞示例
String url = request.getParameter("url");
return Request.Get(url).execute().returnContent().toString();//发起请求

// OkHttpClient漏洞示例
String url = request.getParameter("url");
OkHttpClient client = new OkHttpClient();
com.squareup.okhttp.Request ok_http = new com.squareup.okhttp.Request.Builder().url(url).build();
client.newCall(ok_http).execute();  //发起请求

// HttpClients漏洞示例
String url = request.getParameter("url");
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = client.execute(httpGet); //发起请求

0x02 漏洞防御

关于ssrf的防御,p牛已经给出了比较完善的解决方案谈一谈如何在Python开发中拒绝SSRF漏洞

总结下来无非是这么几点:

  1. 正确处理302跳转(在业务角度看,不能直接禁止302,而是对跳转的地址重新进行检查)
  2. 限制协议只能为http/https,防止跨协议
  3. 设置内网ip黑名单(正确判定内网ip、正确获取host)
  4. 设置常见web端口白名单(防止端口扫描,可能业务受限比较大)
private static int connectTime = 5 * 1000;

public static boolean checkSsrf(String url) {
  HttpURLConnection httpURLConnection;
  String finalUrl = url;
  try {
    do {
      if(!Pattern.matches("^https?://.*/.*$", finalUrl)) { //只允许http/https协议
        return false;
      }
      if(isInnerIp(url)) { //判断是否为内网ip
        return false;
      }

      httpURLConnection = (HttpURLConnection) new URL(finalUrl).openConnection();
      httpURLConnection.setInstanceFollowRedirects(false); //不跟随跳转
      httpURLConnection.setUseCaches(false); //不使用缓存
      httpURLConnection.setConnectTimeout(connectTime); //设置超时时间
      httpURLConnection.connect(); //send dns request

      int statusCode = httpURLConnection.getResponseCode();
      if (statusCode >= 300 && statusCode <=307 && statusCode != 304 && statusCode != 306) {
        String redirectedUrl = httpURLConnection.getHeaderField("Location");
        if (null == redirectedUrl)
          break;
        finalUrl = redirectedUrl; //获取到跳转之后的url,再次进行判断
      } else {
        break;
      }
    } while (httpURLConnection.getResponseCode() != HttpURLConnection.HTTP_OK);//如果没有返回200,继续对跳转后的链接进行检查
    httpURLConnection.disconnect();
  } catch (Exception e) {
    return true;
  }
  return true;
}

private static boolean isInnerIp(String url) throws URISyntaxException, UnknownHostException {
    URI uri = new URI(url);
    String host = uri.getHost(); //url转host
  	//这一步会发送dns请求,host转ip,各种进制也会转化为常见的x.x.x.x的格式
    InetAddress inetAddress = InetAddress.getByName(host); 
    String ip = inetAddress.getHostAddress();

    String blackSubnetlist[] = {"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "127.0.0.0/8"}; //内网ip段
    for(String subnet : blackSubnetlist) {
      SubnetUtils subnetUtils = new SubnetUtils(subnet); //commons-net 3.6
      if(subnetUtils.getInfo().isInRange(ip)) {
        return true; //如果ip在内网段中,直接返回
      }
    }
    return false;
}

0x03 参考资料

JAVA代码审计之XXE与SSRF

谈一谈如何在Python开发中拒绝SSRF漏洞

点击关注,共同学习!
安全狗的自我修养

github haidragon

https://github.com/haidragon

标签:java,String,ssrf,url,http,笔记,漏洞,new,httpURLConnection
From: https://www.cnblogs.com/haidragon/p/16885378.html

相关文章

  • 学习笔记-java代码审计-ssti
    java代码审计-ssti0x01漏洞挖掘Velocity@RequestMapping("/ssti/velocity")publicStringvelocity(@RequestParam(name="content")Stringcontent){Velocity......
  • 学习笔记-java代码审计-命令执行
    java代码审计-命令执行0x01漏洞挖掘Stringcmd=request.getParameter("cmd");Runtimeruntime=Runtime.getRuntime();//Runtime.getRuntime.execProcessBuilder......
  • 学习笔记-java代码审计-文件操作
    java代码审计-文件操作0x01文件上传这段代码来自菜鸟教程:privatestaticfinalStringUPLOAD_PATH="/tmp/upload";privatebooleanuploadWithFileUpload(HttpServ......
  • 学习笔记-java代码审计-反序列化
    Java代码审计-反序列化0x00漏洞挖掘业务代码简单来说,找readObject/readUnshared就好了protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresp......
  • 学习笔记-java代码审计-环境搭建+前置知识
    Java代码审计-环境搭建+前置知识0x00中间件tomcat因为个人比较矫情,不想在mac搭java的开发环境,就想着有没有本地写代码然后部署到虚拟机上运行。毕竟java是静态语言,在编......
  • 学习笔记-java代码审计-表达式注入
    java代码审计-表达式注入0x01漏洞挖掘spelspel表达式有三种用法:注解@value("#{表达式}")publicStringarg;这种一般是写死在代码中的,不是关注的重点。xml<b......
  • 【Javaweb】做一个房产信息管理系统三(src目录的部署工作【三层框架】各个层含义)
    接下来,我打算进行Java文件的部署工作,但实际上为了得到更多的分数,我们还是应该先做页面首先我们需要了解对于Javaweb,src下的目录应该如何部署:(三层架构单独开一篇讲) 那......
  • java.util.List如何用
    起因是这样,我在学习Javaweb,然后就突然有很多类似的语句  这是什么意思呢?让我们一起来解决看看吧!List有序集合(也成为序列),用户可以精确控制列表中每个元素的插入位置。......
  • 工业机器人基础笔记(一)
    第一章续论读者可自行学习,笔记从第二章开始。此笔记仅仅为抄录,便于复习。按照拓扑结构分类,我们把工业机器人分为三类。串联机器人并联机器人混联机器人那什么是拓扑......
  • JAVA注解(Annotation)
    注解(Annotation)什么是注解Annotation的作用:不是程序本身,可以对程序做出解释,这一点和注释(comment)没什么区别。可以被其他程序(比如编译器)读取Annotation的格式:注......