一次简单的代码审计
开始
本次审计源码地址:
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
- 本文作者: JOHNSON
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/987
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!