知方号 知方号

「Java代码审计」华夏ERP3.0代码审计

「Java代码审计」华夏ERP3.0代码审计

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

少走了弯路,也就错过了风景,无论如何,感谢经历

转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球

感谢大家一直以来对我CSDN博客的关注和支持,但是我决定不再在这里发布新文章了。为了给大家提供更好的服务和更深入的交流,我开设了一个知识星球,内部将会提供更深入、更实用的技术文章,这些文章将更有价值,并且能够帮助你更好地解决实际问题。期待你加入我的知识星球,让我们一起成长和进步

0x01 前言

3.0 跟2.x版本框架方面有所改变,本次审计主要是基于之前网上大佬们的文章来做的,基本上都是之前2.x 就存在的漏洞,因为时间有限,近期又要学习JAVA代码审计与工作上的安排,没有细致的审计,后续可能会找一些开源的JAVA靶场来做审计,节约审计的时间成本,之前无JAVA审计基础,写的浅的地方,往师傅们海涵。

顺路自己也学习一波,以及一些JAVA漏洞分析的文章,后续会输出。

通过之前简单的过了一遍基础功能点,无发现啥特别漏洞,xray也无建工,看来只能手动挖掘看看了

分析之前已获取的数据包,发现当前JAVA 系统存在FastJson ,但无Burp 的插件提示该FastJson可以出网

fastjson能dnslog但是不能rce的原因,可能是Fastjson远古版本自动开启autotype,后来的后面几个版本默认关闭。然后就算项目中可以使用autotype,如果是比较新的版本需要其他的能够构造rce链的第三方jar包支持,如果没有这些也不行。还有就是JDK版本跟目标系统不一致的也无法利用,高版本的jdk8不支持远程调用rmi等协议也是造成无法利用成功的一个原因。略早期的可以尝试使在@type的值第一位添加L或者LL尝试绕过fastjson的黑名单限制,后面会出专门的文章对序列化楼的进行分析,之前也是不太明白,后面准备好好研究研究。

该系统search参数可以出网,我本地的jdk版本比较高,也没有细的测试,后面会有文章专门针对反序列化文章。

首先先到代码pom.xml文件里面看看,该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。

Ctril+F 查找fastjson 关键字,发现是SpringBoot框架,且FastJson为1.2.55版本

网上爆出1.2.55~1.2.68以下存在FastJson 绕过导致反序列化漏洞

SpringBoot的执行流程和SSM大致相同,不过SpringBoot搭建的Web项目里简化了许多配置文件

Spring Boot使用了一个全局的配置文件application.properties,放在src/main/resources目录下或者类路径的/config下。Sping Boot的全局配置文件的作用是对一些默认配置的配置值进行修改,用来配置一些可以手动修改而且不用编译的变量,这样的作用在于,打成war包或者jar包用于生产环境时,我们可以手动修改环境变量而不用再重新编译。

看到一些配置信息、数据库连接串、Redis连接串,此处登陆超时时间有些过长,设置为了30多秒,配置人员把连接超时时间(server.tomcat.connection-timeout)的单位,理解为秒,实际上是毫秒。

例如配置的值为 6,如果建立客户端连接的过程中,恰好碰到调用System.gc()触发Full GC,并且加上GC的暂停时间总共达到6ms以上,Tomcat一看,超时了,就会导致建立连接失败,然后Nginx给客户端返回502错误。 所以,过短,请求还未处理完成,你就急不可待了;过长,请求早已超出正常响应时间而挂了。

使用Mybatis框架,MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

通过下图可发现:

1、配置登陆连接时间等待过长 2、数据库连接也是以弱密码和明文

利用代码里面的弱密码成功登陆,在实际测试过程中,也可以尝试一波,可能会有意想不到的结果,虽然不一定会有意想不到的收获

0x02 Springboot 信息泄露

http://127.0.0.1:3000/jshERP-boot/v2/api-docs

有些程序员会自定义 /manage、/management、项目 App 相关名称为 spring 根路径 Spring Boot Actuator 1.x 版本默认内置路由的起始路径为 /

Spring Boot Actuator 2.x 版本则统一以 /actuator为起始路径 Spring Boot Actuator 默认的内置路由名字,如 /env有时候也会被程序员修改,比如修改成 /appenv

路由地址及接口调用详情泄漏开发人员没有意识到地址泄漏会导致安全隐患或者开发环境切换为线上生产环境时,相关人员没有更改配置文件,忘记切换环境配置等。

一般来讲,直到 spring boot 应用的相关接口和传参信息并不能算是漏洞,但是可以检查暴露的接口是否存在未授权访问、越权或者其他业务型漏洞。

2.1 防御措施

上线时需要修改/切换生产环境的配置

/actuator /auditevents /autoconfig /beans /caches /conditions /configprops /docs /dump /env /flyway /health /heapdump /httptrace /info /intergrationgraph /jolokia /logfile /loggers /liquibase /metrics /mappings /prometheus /refresh /scheduledtasks /sessions /shutdown /trace /threaddump /actuator/auditevents /actuator/beans /actuator/health /actuator/conditions /actuator/configprops /actuator/env /actuator/info /actuator/loggers /actuator/heapdump /actuator/threaddump /actuator/metrics /actuator/scheduledtasks /actuator/httptrace /actuator/mappings /actuator/jolokia /actuator/hystrix.stream

其中对寻找漏洞比较重要接口的有:

/env、/actuator/env:GET 请求 /env 会泄露环境变量信息,或者配置中的一些用户名,当程序员的属性名命名不规范 (例如 password 写成 psasword、pwd) 时,会泄露密码明文;同时有一定概率可以通过 POST 请求 /env 接口设置一些属性,触发相关 RCE 漏洞。/jolokia:通过 /jolokia/list 接口寻找可以利用的 MBean,触发相关 RCE 漏洞;/trace:一些 http 请求包访问跟踪信息,有可能发现有效的 cookie 信息 2.2 利用思路 利用env加refresh进行getshell利用mappings,寻找未授权接口利用trace,获取认证信息(Cookie、tooken、Session),利用认证信息访问接口env有可能泄露的数据库账号密码(mangodb),当然得开放外网,可能性较小 2.3 Web漏洞发现方式

通常识别当前 web 应用使用的框架为 springboot 框架。主要有两个方法判断:

通过 web 应用程序网页标签的图标(favicon.ico);如果 web 应用开发者没有修改 springboot web 应用的默认图标,那么进入应用首页后可以看到如下默认的绿色小图标:

通过 springboot 框架默认报错页面;如果 web 应用开发者没有修改 springboot web 应用的默认 4xx、5xx 报错页面,那么当 web 应用程序出现 4xx、5xx 错误时,会报错如下(此处仅以 404 报错页面为例):访问一个随便构造的路径,比如:http:/172.26.2.24:8090/index,出现如下报错页面说明web网站使用了springboot框架(在实际中遇到的大多数都是此类情况)

综合以上两个途径来判断当前 web 应用是否是 springboot 框架,就是通过访问不同的目录,看是否有小绿叶图标,然后就是想办法在不同目录下触发应用程序的 4xx 或 5xx 错误,看是否有 Whitelabel Error Page 报错。

2.4 修复方式

在项目的pom.xml文件下引入spring-boot-starter-security依赖

org.springframework.boot spring-boot-starter-security

然后在application.properties中开启security功能,配置访问账号密码,重启应用即可弹出。

management.security.enabled=truesecurity.user.name=adminsecurity.user.password=admin

禁用接口,则可设置如下(如禁用env接口):

endpoints.env.enabled= false 2.5 以往漏洞案例复现手法

https://github.com/jas502n/SpringBoot_Actuator_RCE

https://misakikata.github.io/2023/04/Spring-%E6%A1%86%E6%9E%B6%E6%BC%8F%E6%B4%9E%E9%9B%86%E5%90%88/

0x03 未授权访问访问敏感信息(绕过权限)

该项目利用filter做登录判断:

com.jsh.erp.filter.LogCostFilter

查看一下Spring Boot 的过滤器器,看看过滤了哪些Spring Boot 下的@WebFilter 用于将一个类

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了