问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
一次简单的Java代码审计
漏洞分析
一次简单的代码审计
开始 == 本次审计源码地址: ```php https://gitee.com/jeecg/jeecg ``` 该版本已经停止更新,官方已推出新版本。 ```php 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 文件上传的潜在威胁](https://forum.butian.net/share/815) 这里手动设置使用 `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 这里存在绕过,后面再说。可以参考我之前发布的文章:[这个鉴权到底能不能绕](https://forum.butian.net/share/829) *org.jeecgframework.jwt.aop.RestAuthTokenInterceptor#preHandle*  ### AuthInterceptor 这里的 Mapping 也是 `/**` 但他不过滤URL 存在 `rest/` 的请求 *src/main/resources/spring-mvc.xml*  而逻辑内也存在绕过, 可以参考我之前发布的文章:[这个鉴权到底能不能绕](https://forum.butian.net/share/829) *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 官网](https://jwt.io/) 解密 ,可以看到对应的值。这里的 `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 文件上传的潜在威胁](https://forum.butian.net/share/815) *org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename*  Reference ========= [这个鉴权到底能不能绕](https://forum.butian.net/share/829) [Spring MultipartFile 文件上传的潜在威胁](https://forum.butian.net/share/815)
发表于 2021-12-17 09:37:57
阅读 ( 12738 )
分类:
代码审计
0 推荐
收藏
1 条评论
不动流星
2021-12-18 15:28
大佬666
请先
登录
后评论
请先
登录
后评论
JOHNSON
12 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!