
文章目录
- SSRF
- 环境搭建
- 漏洞分析
- 其他利用方式
- 任意文件读取/下载
- 参考
SSRF
Java 网络请求支持的协议,包括:http、https、file、mailto、jar、netdoc,但是相对 PHP 可以利用很多伪协议来说 Java SSRF 还是略显单调
补充:
mailto:是一个用于发送邮件的 URL 协议
jar:Jar URL协议解析,协议可以用来读取 zip 格式文件(包括 jar 包)中的内容
netdoc 协议:在大部分情况下可代替 file
虽然支持多种协议,但是 Java 的 SSRF 利用方式比较局限,一般只用以下两种方式
- 利用 file 协议任意文件读取
- 利用 http 协议端口探测
环境搭建
代码来自 Java 代码审计入门篇一书作者 panda https:///cn-panda/JavaCodeAudit
因为 panda 师傅使用的是 eclipse,用 idea 的话需要稍微操作一下
- 使用 idea 导入项目
File–>New–>Project from Existing sources
选择 Eclispe 项目,然后点击 OK,进入下一步
选择第二项,导入 Eclipse 项目

然后一路 next 即可
在 WEB-INF 目录下新建 lib 目录和 classes 目录
- 配置项目
打开 Project Structure 窗口
设置 Modules,Eclipse 导入的项目此处主要是将 Dependencies 中关于 Eclipse 的依赖移除即可,然后点击加号添加 lib 目录

点击加号,选择 tomcat 所在的目录,在 lib 目录下找到 servlet-api.jar 这个 jar 包导入完成即可,不导入会提示 java: 程序包 javax.servlet 不存在

然后设置 Libraries,选择之前新建的 lib 目录

配置打包方式 Artifacts,点击 Artifacts 选项卡

- 配置 tomcat
- 启动访问 http://localhost:8080/ssrf_Web_exploded/
漏洞分析
程序一个简单利用代码 Demo
- URL 对象用 openConnection 打开连接,获取 URLConnection 类对象
- 用 InputStream 获取字节流
- 然后用 InputStreamReader 将字节流转换成字符流
- BufferedReader 将字符流以缓存形式输出的方式来获取网络数据流,
- 最后一行行输出到浏览器

这样就通过发送 http 请求来发起内网 ssrf 攻击

如果端口没有开启 http/https 服务,则会返回ERROR字符,通过返回结果判断是否开放端口,特别注意的是不像 PHP 可以通过 dict 伪协议一样可以判断所有端口服务,这里只能判断 http 服务是否开启
其他利用方式
任意文件读取/下载
在刚才的代码基础上删除画框的行

HttpURLconnection() 是基于 http 协议的,删除后可以使用 file 协议去读取文件,文件下载也一样不过是将数据流写入了文件中
敏感函数
Java 代码审计中要注意的可能会触发 ssrf 的敏感函数如下
参考
Java 代码审计入门篇

















