1 自行搭建靶场
http://127.0.0.1:80
若依版本V4.2
二、代码审计漏洞挖掘
1、第三方组件审计
查看pom.xml
本项目引入的组件以及组件版本整理如下。
组件名称 | 组件版本 |
---|---|
Shiro | 1.4.2 |
Bitwalker | 1.2.58 |
Mysql | 5.1.47 |
Druid | 1.3.2 |
Kaptcha | 2.3.2 |
Mybatis | 3.5.1 |
Swagger | 2.9.2 |
Fastjson | 1.2.6 |
Fastjson漏洞代码审计
Shiro漏洞代码审计
根据Shiro1.4.2版本得知此版本存在RCE漏洞
审计过程:
本项目使用了 Fastjson 1.2.60 , Fastjson <= 1.2.68 都是存在漏洞的。
已确定了Fastjson版本存在问题,进一步寻找触发Fastjson的漏洞点。我们关注两个函 数 parse 和 parseObject
这里我们关注parseObject,全局搜索parseObject,定位到GenTableServiceImp.java的286行我们可以看到第286行 JSONObject.parseObject(options); 处理options参数
options参数来自于 String options = JSON.toJSONString(genTable.getParams());
跟进genTable.getParams();
可以看到,跳转到BaseEntity.java的101行-108行
因为 Gentable 继承 BASEEntity
根据判断条件,如果 params不等于null 的话,直接 返回 params 。跟进 params ,注释表明该字段为 请求参数 ,并且 params 被定义 成 Map ,可以理解为params字段中可以传任何类型的值在里面。
回到GenTableServiceImpl.java,查看谁调用了validateEdit,发现跳转到IGenTableService.java的第99行
继续跟进,跳转到GenController.java的第142行
至此,我们将这条链追踪完了。确定了功能点为代码生成处的 修改保存生成业务 ,我 们主要关注 params 这个字段。
发现base64硬编码
Shiro漏洞验证
Druid漏洞代码审计
Druid漏洞验证
http://192.168.0.104/druid/index.html
SQL注入代码审计(1)
全局搜索$
挑选一个SysRoleMapper.xml进行跟进
点击跳转到DAO层发现跟进到SysRoleMapper.java
发现方法selectRoleList方法,继续跟踪。定位到SysRoleServicelmp.java
继续跟踪,定位到SysRoleController.java
可以发现在
POST http://localhost:80/system/role/list位置
跟踪SysRole定位到SysRole.java
回顾下整理流程,如下所示:
sysRoleMapper.xml -> SysRoleMapper.java -> SysRoleServiceImpl.java - > SysRoleService.java -> SysRoleController.java
通过Controller层,可以知道,漏洞URL路径为 /system/role/list
通过Service层和Controller层的注释,我们大致知道该功能位于角色信息处。
触发点为dataScope
SQL注入漏洞验证
SQL注入代码审计(2)
同理,用户管理处同样存在
流程如下
sysUserMapper.xml -> SysUserMapper.java -> SysUserServiceImpl.java - > SysUserService.java -> SysUserController.java
通过Controller层,可以知道,漏洞URL路径为 /system/Userlist
通过Service层和Controller层的注释,我们大致知道该功能位于角色信息处。
触发点为dataScope
SQL注入漏洞验证
输入单引号,出现报错。
使用注入处数据库
and(select+extractvalue(1,concat(0x7e,database(),0x7e)))
任意文件下载
全局搜索download
进入CommonController.java
发现存在通用下载请求
分析代码:
41行:定义一个fileDownload的方法
45行:进入方法,发现该方法使用了FileUtils的isValidFilename方法对fileName变量进行处理。跟进
进入FileUtils.java类
isValidFilename方法获取filename变量,再使用FILENAME_PATTERN进行处理。
可以看到对filename变量进行了正则处理,但是未对路径穿越做限制。漏洞存在