一次简单的Java代码审计

一次简单的代码审计

开始

本次审计源码地址:

https://gitee.com/jeecg/jeecg

该版本已经停止更新,官方已推出新版本。

https://gitee.com/jeecg/jeecg-boot

环境准备

下载源码后直接在,IDEA 中打开(我用的是 IDEA)。

IDEA 运行配置

点击右上角添加运行环境配置

添加新的配置,选择 Tomcat Server -> Local

如果没有配置 Tomcat Server 选择路径添加一个即可

点击 FIx 修复

选择 war exploded (war exploded 模式是将WEB工程以当前文件夹的位置关系上传到服务器,即直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。)

初始化数据库

我这里是用的 mysql 所以选择 jeecg_4.0_mysql.sql, 添加创建数据库逻辑, 直接导入即可。

就可以跑起来了

基本信息

Springframework MultipartFile

用了 Springframework 4.0.9 之前有写过文章测试过,在 Springframework < 4.1.8 之前哪怕手动设置了 MultipartFile 的处理对象 Windows 下也存在目录穿越(绕过)参考: Spring MultipartFile 文件上传的潜在威胁

这里手动设置使用 CommonsMultipartResolver,但版本 < 4.1.8 Windows 下存在绕过

src/main/resources/spring-mvc.xml

Springframework Route

这里配置了两种路由模式,一种是 .do 结尾,一种是 /rest/ 开头

src/main/webapp/WEB-INF/web.xml

Filter

收集 Filter 信息,这里并没有关于权限认证的 Filter

Springframework Interceptors

查看拦截器, 这里设计到三个拦截器,且 mapping 都是 /**

src/main/resources/spring-mvc.xml

EncodingInterceptor

只是简单的编码

org.jeecgframework.core.interceptors.EncodingInterceptor#preHandle

RestAuthTokenInterceptor

这里存在绕过,后面再说。可以参考我之前发布的文章:这个鉴权到底能不能绕

org.jeecgframework.jwt.aop.RestAuthTokenInterceptor#preHandle

AuthInterceptor

这里的 Mapping 也是 /** 但他不过滤URL 存在 rest/ 的请求

src/main/resources/spring-mvc.xml

而逻辑内也存在绕过, 可以参考我之前发布的文章:这个鉴权到底能不能绕

org.jeecgframework.core.interceptors.AuthInterceptor#preHandle

权限认证绕过漏洞 1

综合上面的信息,我们可以使用 /api/../,绕过 AuthInterceptor 的认证

正常访问,302 跳转到超时页面

超时页面只是通过 JS 跳转而已

通过 /api/../ 绕过

权限认证绕过漏洞 2

RestAuthTokenInterceptor 拦截器中,使用了 JWT Token 进行认证。

org.jeecgframework.jwt.aop.RestAuthTokenInterceptor#preHandle

使用的 JWT 密钥是写死的, 也存在绕过。虽然存了 Redis,但基本信息是固定的,除了时间。也就是说只要他登录了,redis 中又记录可以爆破 Token。

org.jeecgframework.jwt.service.RedisTokenManager#createToken

org.jeecgframework.jwt.def.JwtConstants#JWT_SECRET

修改 Redis 配置,重启重新启动。

src/main/resources/redis.properties

打上断点后,正常登录一次,获得 Token 样本。

JWT 官网 解密 ,可以看到对应的值。这里的 iat 是登录时的时间戳, 所以是不确定。

通过正常登录获取到的 Id 是可以正常访问站点的

修改一下时间戳(因为我们无法确定管理员是什么时候登录的)

状态变成了 401,未通过鉴权

因为这里又一个步骤是通过 请求头中的解析出来的Id 字段(也就是用户名) 去查找响应的 Token 和请求头中的 Token 进行对比。响应的我可以通过当前时间往回递减去爆破JWT Toekn

org.jeecgframework.jwt.aop.RestAuthTokenInterceptor#preHandle

org.jeecgframework.jwt.service.RedisTokenManager#checkToken

任意文件上传 (GetShell)

有很多任意文件上传漏洞,没有任何的过滤/限制。这里随机挑一个来说

iconController?saveOrUpdateIcon 存在任意文件上传漏洞,设置了不重命名与上传。

org.jeecgframework.web.system.controller.core.IconController#saveOrUpdateIcon

上传成功

组件试用/修复不当造成的漏洞

有几个因为组件试用或修复不当或没修复造成的漏洞

Xstream

这里其实是俩个漏洞,文件上传和 xxe 漏洞, 该功能点是文件上传后试用 Xstream 文件,会造成反序列化漏洞

org.jeecgframework.web.cgform.controller.build.CgformSqlController#doMigrateIn

SAXReader

这里其实是俩个漏洞,文件上传和 xxe 漏洞, 该功能上传好文件后对文件进行解析

Springframework MultipartFile

前面说了在 Springframework < 4.1.8 之前哪怕手动设置了 MultipartFile 的处理对象 Windows 下也存在目录穿越(绕过)参考: Spring MultipartFile 文件上传的潜在威胁

org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename

Reference

这个鉴权到底能不能绕

Spring MultipartFile 文件上传的潜在威胁

  • 发表于 2021-12-17 09:37:57
  • 阅读 ( 13367 )
  • 分类:代码审计

1 条评论

不动流星
大佬666
请先 登录 后评论
请先 登录 后评论
JOHNSON
JOHNSON

12 篇文章