Java OWASP 中的其他漏洞代码审计
Drunkbaby Lv6

Java OWASP 中的非 RCE 洞

Java OWASP 中的其他漏洞代码审计

0x01 前言

本来是想写一些非 RCE 洞的,然后发现 Java 这些东西确实杂,我也不太想开特别多篇文章讲解,就放一起好了。

0x02 SSRF In Java

1. 漏洞分析利用

网络请求支持的协议

由于Java 没有 php 的 cURL,所以 Java SSRF 支持的协议,不能像 php 使用 curl -V 查看。

Java 网络请求支持的协议可通过下面几种方法检测:

  • 代码中遍历协议
  • 官方文档中查看
  • import sun.net.www.protocol 查看

import sun.net.www.protocol 可以看到,支持以下协议

1
file ftp mailto http https jar netdoc

2. 发起网络请求的类

当然,SSRF是由发起网络请求的方法造成。所以先整理Java能发起网络请求的类。

  • HttpClient
  • Request (对HttpClient封装后的类)
  • HttpURLConnection
  • URLConnection
  • URL
  • okhttp

如果发起网络请求的类是带 HTTP 开头,那只支持 HTTP、HTTPS 协议。

比如:

1
2
3
4
HttpURLConnection
HttpClient
Request
okhttp

所以,如果用以下类的方法发起请求,则支持 sun.net.www.protocol 所有协议

1
2
URLConnection
URL

注意,Request类对 HttpClient 进行了封装。类似 Python 的 requests 库。
用法及其简单,一行代码就可以获取网页内容。

1
Request.Get(url).execute().returnContent().toString();

3. 漏洞代码

完全无防御的 SSRF

payload 是很简单的,我们主要来看一下运行流程

打个断点,开始调试

payload:

1
/ssrf/urlConnection/vuln?url=file:///E:/1.txt

跟进 HttpUtils.URLConnection()

主要是在这里 ————— getInputStream,把我们输入的 url 进行了请求。

我们输入的 url 是 file:///E:/1.txt,对应的在解析的时候 url.openConnection() 能够被解析成 FileURLConnection 这个类。所以后续就进行了文件读取的操作

如果再往里走就是一些建立连接 connect 的操作了,这里就不细看了,最后的结果如图

关于利用其他协议攻击也是可以的,这里不再赘述

文件下载点的 SSRF

  • 其实是一样的,不过方法从简单的 URL.connection() 变成了 URL.openStream()

不再赘述,这里更符合我们实际的开发场景而已。

Java DNS Rebinding

在 SSRF 攻击里面有一种很特殊的攻击手法,就是 DNS Rebinding,这个手段可以用来绕过黑白名单

对应的 HackTheBox 上有一道例题

先了解下Java应用的TTL机制。Java应用的默认TTL为10s,这个默认配置会导致DNS Rebinding绕过失败。也就是说,默认情况下,Java应用不受DNS Rebinding影响。

Java TTL的值可以通过下面三种方式进行修改:

  1. JVM添加启动参数-Dsun.net.inetaddr.ttl=0

  2. 通过代码进行修改

1
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
  1. 修改java.security里的networkaddress.cache.negative.ttl变量为0

0x03

 评论