环境搭建

MCMS 5.2.4:https://gitee.com/mingSoft/MCMS/tree/5.2.4/

利用 idea 打开项目

创建数据库 mcms,导入 doc/mcms-5.2.8.sql

修改 src/main/resources/application-dev.yml 中关于数据库设置参数

启动项目登录后台 http://localhost:8080/ms/login.do,账户名:密码 msopen:msopen

漏洞分析

SQL注入

该cms的mybatis映射文件直接写在了dao层,由于${}会有SQL注入问题,所以直接搜索${},发现query方法中,categoryId参数可能存在SQL注入

根据namespace可知该语句的映射接口类是net.mingsoft.cms.dao.IContentDao

<mapper namespace="net.mingsoft.cms.dao.IContentDao">

在IContentDao中并没有发现query方法,但他继承了IBaseDao,而query就在其中

下面就要看哪里实现了query方法,根据分层逻辑,业务层对应接口类为:net.mingsoft.cms.biz.IContentBiz ,而他的实现类是net.mingsoft.cms.biz.impl.ContentBizImpl而其中没有调用该方法,所以向上找他的父类BaseBizImpl

接着找哪里调用了该方法,同样根据分层逻辑,找到了控制层的net.mingsoft.cms.action.web.ContentAction,该层的接口为/cms/content

该类的list方法中,会调用contentBiz属性的query方法参数为content

  1. contentBiz是IContentBiz类型的,IContentBiz的实现类是ContentBizImpl,接着他的父类BaseBizImpl实现了query方法
  2. content属性是ContentBean类型的,而ContentBean的父类是CategoryEntity它定义了categoryId属性,并实现了对应的getter、setter方法

这里未对前端用户输入的参数进行过滤,另外该CMS全局也没有针对SQL注入的过滤,所以只需要传入categoryId参数,将查询语句闭合即可导致SQL注入

由于定义的是PostMapping,因此需要post传参

payload:

POST:categoryId=1' and updatexml(1,concat(0x7e,user(),0x7e),1) and '1

其它用${}的点,由于参数不可控故无法进行注入

文件上传

net.mingsoft.basic.action.web.FileAction提供了文件上传入口,并且路径文件名等都可控

跟进下边的upload()方法,主要是对文件的一些初始化操作,第一行设置了黑名单

而黑名单只限制了exe、jsp,可以用jspx绕过

编写一个上传入口

<form method="POST" action="http://127.0.0.1:8088/file/upload" enctype="multipart/form-data"><input type="file" name="file"><input type="rename" name="rename" value="false"><input type="submit" name="submit">
</form>

成功上传jspx木马文件

解压压缩包getshell

net.mingsoft.basic.action.TemplateAction通过fileUrl传入任意文件路径,对文件进行解压,在unzip方法中未对压缩包中的文件过滤

若我们通过上边的文件上传,传上去一个带有jsp木马的zip压缩包,即可通过该利用点解压出jsp的shell文件

先上传个shell.zip

在访问指定路径进行解压,成功获取到jsp shell

任意文件删除

net.mingsoft.basic.action.TemplateAction通过fileName可以指定目录删除,并且不像文件上传等对…/进行限制,这就导致我们可以通过…/进行任意目录删除

默认路径为/template/appid,因此若要删除upload目录,则需传参fileName=../../upload

任意文件写入

net.mingsoft.basic.action.TemplateAction的writeFileContent()方法,没有进行过滤,可以往模板文件写入任何内容

  • fileName:新文件名
  • oldFileName:旧文件名
  • fileContent:文件内容

若设置文件名为shell.jspx,内容为一句话木马,在随便找一个原有文件进行替换,即可getshell,但需要注意,checkFileType会进行文件类型就检测,仍然是不能为exe和jsp,这也是为什么文件名设为shell.jspx的原因

模板注入

该cms模版引擎是freemarker,该模版引擎是存在模版注入的,结合上边的任意写,可以将下边内容写入html页面中

<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

之后生成主页时,会渲染该文件执行命令

简单分析下源码

访问指定路由后,会调用generate()生成主页

其中主要是对map进行一些初始化操作,并通过rendering()进行渲染

最后调用process()进行渲染,造成代码执行

[Java代码审计]—MCMS相关推荐

  1. 【网络安全】JAVA代码审计—— XXE外部实体注入

    一.WEB安全部分 想要了解XXE,在那之前需要了解XML的相关基础 二.XML基础 2.1 XML语法 所有的XML元素都必须有一个关闭标签 XML标签对大小写敏感 XML必须正确嵌套 XML 文档 ...

  2. java代码审计文章集合

    0x00 前言 java代码审计相关文章整理,持续更新. 0x01 java环境基础 搭建Java Web开发环境 配置IDEA编辑器开发java web,从0创建项目 IDEA动态调试 IDEA配置 ...

  3. java代码审计_Java代码审计入门篇

    本期斗哥带来Java代码审计的一些环境和工具准备. Java这个语言相对于PHP来说还是比较复杂的,所以一开始接触到Java源码审计的时候会遇到一些关于环境和配置上一些困难,本文记录斗哥在开始去审计J ...

  4. java代码审计_Java代码审计| Spring框架思路篇

    Java的WEB框架是Java进阶课程,当要进行Spring的漏洞分析,要有一定的Java代码知识储备. Java后端标准的学习路线:JavaSE->JavaEE->Java Web框架 ...

  5. java代码审计----win10安装docker

    开始看<java代码审计> 第一先安装jdk 多版本jdk共存 安装docker win10安装docker docker官网下载desktop 安装后,docker启动不起来,小鲸鱼图标 ...

  6. 浅析Java代码审计中的SQL注入漏洞

    浅析Java代码审计中的SQL注入漏洞 1.注入漏洞简介 2.SQL注入漏洞简介 3.JDBC拼接不当造成SQL注入 第一关:使用Statement 第二关:使用PrepareStatement 4. ...

  7. JAVA代码审计之WebGoat靶场SQL注入

    文章目录 前言 WebGoat IDEA部署靶场 No.1 回显注入 No.2 布尔盲注 No.3 Order by 代审技巧 SQL注入挖掘 SQL注入防御 Fortify体验 总结 前言 为了从自 ...

  8. java代码审计中的一些常见漏洞及其特征函数

    文章来源:https://xz.aliyun.com/t/1633 最近在先知上看到之前有篇关于java代码审计的文章总结的蛮好,记录以下特征函数,方便查阅,同时自己也会将在平时代码审计过程中积累的函 ...

  9. 文末送靶场邀请码 | 怎样快速入门Java代码审计?(一问一答汇总)

    代码审计(Code Audit)是一种以发现安全漏洞.程序错误和违反程序规范为目标的源代码分析. 根据2020年10月份的CNVD安全月报显示,Web应用程序漏洞占比34%,显而易见Web应用程序仍然 ...

最新文章

  1. jvm性能调优 - 13JVM的年轻代垃圾回收器ParNew原理
  2. 交换机putty怎么调试_使用在300和500系列托管型交换机的一个控制台连接通过PuTTY访问CLI...
  3. ffmpeg-win32-v3.2.4 下载_iTOP-4412开发板android4.4代码下载和编译
  4. oFono学习笔记——GATChat(2):发送AT命令
  5. 野火开发版屏幕_鸿蒙2.0手机开发者版发布,华为多数自研设备明年升级鸿蒙
  6. opensource项目_Opensource.com生日快乐:开源7年
  7. 快速排序算法_经常用到的的排序(快速排序和归并排序)简单的计算机算法学习...
  8. 杂读 May 12,2008
  9. SnackbarUtils:一行代码搞定Snackbar
  10. 使用kermit通过串口升级uboot
  11. 《零秒工作》的一些总结
  12. python定义整型数组_Python数组定义方法
  13. 百度地图 LBS API 使用
  14. 【学习笔记】黑马程序员Java课程学习笔记(更新至第12章---集合)
  15. Airpods Pro连接Macbook Pro偶尔会没有声音
  16. 读书笔记,《刻意练习》,第四章,黄金标准
  17. Windows Update启动不了如何解决?教你快速修复
  18. Java身份证处理工具
  19. element-ui el-dialog拉伸
  20. 为什么我们要使用Notes Domino?

热门文章

  1. php隐藏指定id的div,CSS_纯css3显示隐藏一个div特效的具体实现,复制代码代码如下: !DOCTYPE H - phpStudy...
  2. TDD 测试驱动开发与精益
  3. 喜报:安科瑞电能质量在线监测装置取得国家电网检测报告
  4. 脚本_上传 ,azkaban系统,sqoop迁移数据指令(!缺失hiveToOds)
  5. php正则邮箱验证,php正则表达式验证邮箱
  6. 助力全球抗疫:3D突发公共卫生事件管理平台
  7. linux未被识别crond服务,crond服务不能启动
  8. 树莓派想使用 aptitude 解决依赖包问题,但是使用 apt-get 安装 aptitude 时出现依赖包错误怎么办?
  9. PostgreSQL 数据库备份与恢复介绍
  10. 知乎用户画像与实时数据架构实践