若依CMS代码审计

1 自行搭建靶场

http://127.0.0.1:80
若依版本V4.2
若依CMS代码审计 - 图1

二、代码审计漏洞挖掘

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漏洞
审计过程:

  1. 本项目使用了 Fastjson 1.2.60 , Fastjson <= 1.2.68 都是存在漏洞的。

    已确定了Fastjson版本存在问题,进一步寻找触发Fastjson的漏洞点。我们关注两个函 数 parse 和 parseObject
    这里我们关注parseObject,全局搜索parseObject,定位到GenTableServiceImp.java的286行
    image.png

  2. 我们可以看到第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字段中可以传任何类型的值在里面。
    image.png

  3. 回到GenTableServiceImpl.java,查看谁调用了validateEdit,发现跳转到IGenTableService.java的第99行

    image.png
    继续跟进,跳转到GenController.java的第142行
    image.png
    至此,我们将这条链追踪完了。确定了功能点为代码生成处的 修改保存生成业务 ,我 们主要关注 params 这个字段。
    发现base64硬编码
    image.png

    Shiro漏洞验证

    若依CMS代码审计 - 图7

    Druid漏洞代码审计

    根据Druid版本得知,存在漏洞

    Druid漏洞验证

    http://192.168.0.104/druid/index.html
    若依CMS代码审计 - 图8

    SQL注入代码审计(1)

    全局搜索$
    若依CMS代码审计 - 图9
    挑选一个SysRoleMapper.xml进行跟进
    若依CMS代码审计 - 图10
    点击跳转到DAO层发现跟进到SysRoleMapper.java
    若依CMS代码审计 - 图11
    发现方法selectRoleList方法,继续跟踪。定位到SysRoleServicelmp.java
    若依CMS代码审计 - 图12
    继续跟踪,定位到SysRoleController.java
    若依CMS代码审计 - 图13
    可以发现在
    POST http://localhost:80/system/role/list位置
    若依CMS代码审计 - 图14
    跟踪SysRole定位到SysRole.java
    若依CMS代码审计 - 图15
    回顾下整理流程,如下所示:
    sysRoleMapper.xml -> SysRoleMapper.java -> SysRoleServiceImpl.java - > SysRoleService.java -> SysRoleController.java

通过Controller层,可以知道,漏洞URL路径为 /system/role/list
通过Service层和Controller层的注释,我们大致知道该功能位于角色信息处。
触发点为dataScope

SQL注入漏洞验证

通过抓包,加单引号发现报错
若依CMS代码审计 - 图16
使用报错注入
若依CMS代码审计 - 图17
直接sqlmap
若依CMS代码审计 - 图18

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)))若依CMS代码审计 - 图19

任意文件下载

全局搜索download
若依CMS代码审计 - 图20
进入CommonController.java
发现存在通用下载请求
若依CMS代码审计 - 图21
分析代码:
41行:定义一个fileDownload的方法
45行:进入方法,发现该方法使用了FileUtils的isValidFilename方法对fileName变量进行处理。跟进
进入FileUtils.java类
若依CMS代码审计 - 图22
isValidFilename方法获取filename变量,再使用FILENAME_PATTERN进行处理。
可以看到对filename变量进行了正则处理,但是未对路径穿越做限制。漏洞存在