MCMS代码审计笔记
This_is_Y Lv6

环境搭建

官网:https://www.mingsoft.net/

gitub:https://github.com/ming-soft/mcms

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

环境

  • IDEA 2023.2

  • java 1.8.151 openjdk

  • ubuntu 22.04

  • mysql 5.7.31

  • 系统版本:5.3.5

搭建

官方很贴心,直接照着readme.md文档的快速体验配置,加载完pom.xml文件后选择MSApplicaion.java,点击右上角运行即可。

系统结构

从github上把项目下载解压后就发现有点不对劲,这样一个系统,也不算小,src中代码只有这么一点,怎么想都不对劲。

image-20231204173119372

但是把pom.xml文件都下载好后运行又一切正常。花了一点时间研究了一下。才发现这个系统把几乎所有的功能都打包成jar文件,写在pom文件中,由maven导入系统中了。

image-20231204173423414image-20231204173600046

image-20231204173500872

所以下断点需要在这些文件中,另外一方面,由于系统使用的mybatis,由于这种特殊的结构,我没找到系统的resources/mapper/xxxxMapper.xml文件,又是经过一段时间,我发现这些xml文件,居然tmd直接就在dao目录下

image-20231204174502834

提取这些源代码可以在idea中点进jar文件中的代码文件,然后点击编辑框上面的下载源代码下载xxxx-source.jar文件。用xxxx-source.jar文件反编译的代码是有注释的,xxxx.jar没有。对比如图:

image-20231205092338029

image-20231205092419613

把所有6个jar文件都解压到项目目录中,现在ideal查询就能查到xml文件中的内容了。

image-20231205092710851

防御

在 /net/mingsoft/ms-base/2.1.25/ms-base-2.1.25-sources.jar!/net/mingsoft/base/util/SqlInjectionUtil.java 中存在sql注入的过滤函数

image-20231205101156500

在/net/mingsoft/ms-basic/2.1.25/ms-basic-2.1.25.jar!/net/mingsoft/basic/filter中有一系列防御函数

image-20231205153828189

image-20231205153920727

SQL注入

IContentDao.xml

在IContentDao.xml中有6处${ ,如图:

image-20231205101411978

一个一个来看。

queryIdsByCategoryIdForParser

在最后的order,往回找IContentDao.java,有queryIdsByCategoryIdForParser函数,继续往回找,跳到ContentBizImpl.java中,也有queryIdsByCategoryIdForParser。有两个使用。在GeneraterAction.java文件中。一个是生成栏目接口,”/{categoryId}/generateColumn”,一个是生成文章接口,”/{columnId}/generateArticle”。

image-20231205102645222

由于注入需要order参数,两个函数的调用,传入的contentean都没有set order参数。无法利用

queryIdsByCategoryIdForParserAndNotCover

在最后的order,往回找IContentDao.java,有queryIdsByCategoryIdForParserAndNotCover函数。继续往回找,跳到ContentBizImpl.java中,也有queryIdsByCategoryIdForParserAndNotCover,但是就到此为止了。这个函数没有在别的地方用过。

image-20231205102125074

getSearchCount

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

<if test="tableName!=null and tableName!='' and diyList!=null">left join ${tableName} d on d.link_id=a.id


<foreach item="item" index="index" collection="categoryIds.split(',')" open="(" separator="or"
close=")">
a.category_id=${item}
or a.category_id in (select id FROM cms_category where cms_category.del=0
and FIND_IN_SET(${item},CATEGORY_PARENT_IDS) > 0)
</foreach>



<foreach item="item" index="index" collection="diyList" open=""
separator="" close="">
and d.${item.key} like CONCAT(CONCAT('%',#{item.value}),'%')
</foreach>

同样的方法,找到ContentBizImpl.java文件中的getSearchCount函数。

image-20231205105815307

然后是MCmsAction.java文件,

image-20231205111107145

传入四个参数,三个都有${一个一个来,

  • contentModel
1
contentModel = (ModelEntity) modelBiz.getById(column.getMdiyModelId());
  • fieldValueList
  • categoryIds

这个参数比较简单,直接在post的body加上categoryIds=123就过来了。但是由于系统有全局过滤,所以需要考虑绕过过滤的问题。

 Comments