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 | HttpURLConnection |
所以,如果用以下类的方法发起请求,则支持 sun.net.www.protocol
所有协议
1 | URLConnection |
注意,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的值可以通过下面三种方式进行修改:
JVM添加启动参数
-Dsun.net.inetaddr.ttl=0
通过代码进行修改
1 | java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0"); |
- 修改
java.security
里的networkaddress.cache.negative.ttl
变量为0
0x03
- 本文标题:Java OWASP 中的其他漏洞代码审计
- 创建时间:2022-09-16 21:47:19
- 本文链接:2022/09/16/Java-OWASP-中的其他漏洞代码审计/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!