Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

admin 2025年2月11日01:04:00评论13 views字数 2054阅读6分50秒阅读模式
Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析
嗨,大家好,这里是闪石星曜CyberSecurity。
我是你们的老朋友润霖。
今天通过 Halo 博客系统给大家讲讲在 JavaWeb 中 SSRF 漏洞分析。
如果大家想系统入门学习 Java代码审计,欢迎报名我的课程,五十多节课,平均一小时,20+企业级实战项目,低至499,详细可点击下方链接查看。
《Java代码审计零基础入门到项目实战》2025年第一期招生即将结束,低至499,五十多节课,多重福利来袭!

一、项目简介

Halo [ˈheɪloʊ],意为光环。当然,你也可以当成拼音读(哈喽)。

轻快,简洁,功能强大,使用 Java 开发的博客系统。

Halo 的诞生离不开下面这些项目:

  • Spring Boot:Spring 的快速开发框架

  • Freemarker:模板引擎,使页面静态化

  • H2 Database:嵌入式数据库,无需安装

  • Spring-data-jpa:不需要写 sql 语句的持久层框架

  • Ehcache:缓存框架

  • Lombok:让代码更简洁

  • 等等......

二、项目搭建

1、环境要求

以下是我的测试环境版本详情,除 JDK 需要以下指定版本外,其他仅供参考。

软件名称 版本
操作系统 Windows10
Java JDK1.8_161(https://www.oracle.com/co/java/technologies/javase/javase8-archive-downloads.html,往下滑)
Maven 3.6.3
IDEA 2024.x

2、项目部署流程

源码下载地址:

https://github.com/halo-dev/halo/releases/tag/v0.4.3

下载完成后解压项目文件,使用 IDEA 以 Maven 方式打开该项目即可,会自动加载相关依赖。

该系统使用了 H2 Database 作为数据库,则不需要像 Mysql 那般操作。

进入src/main/java/cc/ryanc/halo/Application.java代码中启动项目即可,如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

访问上述提供的地址http://localhost:8090,进入安装向导,内容自行填写即可(备注:电子邮箱一定填写自己可以登录的,后面测试会用到),如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

最后成功安装后可按以下地址进行访问:

前台地址:http://localhost:8090/

后台地址:http://localhost:8090/admin/login

备注:

  • 如果遇见报错,也许是因为依赖没有成功下载或加载,可尝试退出 IDEA 后重新进入,如依旧不能解决可将问题详细整理后在群里咨询。

  • 如果你的系统内有多个 JDK 版本,记得在文件 - 项目结构(英文版 IDEA 看图寻找吧)将 JDK 版本设置为 JDK1.8_161,如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

三、SSRF 漏洞代码审计

正向梳理功能时,发现系统内安装主题处,可通过远程拉去的方式下载主题,可能会存在 SSRF 漏洞,如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

通过抓包获取到接口名为/admin/themes/clone,通过关键字逐一尝试,最终使用关键字/clone定位到该接口的 Controller 层代码为 ThemeController,如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

点击进入 ThemeController 层,具体代码位于第 180 行至第 201 行,如下所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

下面进行代码审计分析。

①、第一步,单击 remoteAddr 查看传递调用关系,在第 186 行处进行了 isBlank 判空操作,没什么其他值得注意的。然后就直接到第 190 行,进行了 git clone 拼接传入的 remoteAddr 参数操作,使用的是 RuntimeUtil.execForStr 方法执行命令,如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

②、第二步,分析 RuntimeUtil.execForStr 方法。Ctrl加鼠标左键点击 execForStr,进入该方法,发现该方法是 Hutool 组件下的工具类,其中底层就是使用的 ProcessBuilder 执行的命令,没什么其他额外需要注意的代码,可自行分析。如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

③、第三步,总结来说,底层使用 ProcessBuilder 执行了 git clone 拼接 remoteAddr 的命令,其中 remoteAddr 我们可控,进而通过 git clone 可以进行了网络请求操作,导致触发 SSRF 漏洞。简单说就是 ProcessBuilder 命令执行加上 git clone 触发的 SSRF 漏洞。  

最后,在第 190 行设置一个断点,内容如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

这么看来不仅存在 SSRF 漏洞,还可能存在远程命令执行漏洞。

四、SSRF 漏洞验证

访问外观 - 主题 - 主题安装的远程拉取功能,键入远程地址和主题名称,点击安装,抓取数据包如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

访问 DNSLog 地址,可以看到存在探测行为,如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

下面探测内网端口开放情况。

我开启了 8080,7089 这两个端口,可以通过响应时长判断出端口开放情况,如果端口开放响应时间很短,如果端口未开放则响应时间边长。

端口开放情况探测,如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析
Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

端口关闭情况探测,如下图所示:

Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析
Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

原文始发于微信公众号(sec0nd安全):Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月11日01:04:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java代码审计 || 通过某博客系统实战学习一个有趣的 SSRF 漏洞分析https://cn-sec.com/archives/3724825.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息