MCMS-5.2.8代码审计

news/2024/9/22 19:37:04/文章来源:https://www.cnblogs.com/KakeruJ/p/18333353

IDEA设置

下载了导入的依赖库源码后才能对库中代码进行搜索和跳转

SQL注入

在源文件中,多处出现 include 引用 sqlwhere

而sqlwhere的foreach语句中存在着sql注入,如果传入的集合sqlWhereList的el属性为eq,则可以控制field属性来写入恶意sql语句

搜索发现有好几处条件查询引用了sqlWhere

先查看net\mingsoft\mdiy\dao\IDictDao.xml

向上查询query,发现是net\mingsoft\base\dao\IBaseDao定义的接口

这里还是属于Mapper层

其传入的参数为BaseEntity

里面有获取sqlWhereList的方法

如果我们传入sqlWhere参数,且是JSON数组类型,就会转换为sqlWhereList

向上查看哪里调用了query方法

来到Service层

net\mingsoft\base\biz\impl\BaseBizImpl

再往上即controller层

有这么多地方调用了query,逐一尝试

其实不应该漫无目的的逐一尝试,有些query并没有引用sqlWhere,应该去搜索引入sqlWhere的query对应的controller

应重点关注这四个的controller

第一个

net/mingsoft/cms/action/CategoryAction

接口地址为:/ms/cms/category/list

传入的参数类型是CategoryEntity,该类又继承自BaseEntity,因此可以传入sqlWhere参数,并构造恶意的json数组:
[{"field":"updatexml(1,concat(0x7e,(select database())),1)","el":"eq"}]

第二个

net/mingsoft/cms/action/ContentAction.java

接口地址:/ms/cms/content/list

虽然这个做了过滤

但他只是对参数中的CategoryId做了过滤,没有考虑sqlWhere

同样存在sql注入漏洞

第三个

net\mingsoft\mdiy\action\DictAction

接口地址:/ms/mdiy/dict/list

第四个

接口地址:/ms/basic/log/list

第五个

跟前面的不一样

net/mingsoft/base/dao/IBaseDao.xml

在net.mingsoft.base.biz.impl.BaseBizImpl多处调用了queryBySQL

其中一处向上追踪

发现在net.mingsoft.basic.action.BaseAction#validated进行了调用

把fieldName和fieldValue作为键值对传入sql语句

其中fieldName就是里面的${key},如果fieldName可控,就会存在SQL注入漏洞

向上追踪,在net.mingsoft.mdiy.action.PageAction#verify调用了

接口地址:/ms/mdiy/page/verify

fieldName和fieldValue用户可控

payload:

/ms/mdiy/page/verify?fieldName=updatexml(1,concat(0x7e,(select%20database())),1)&fieldValue=1

XSS

地址:http://localhost:8080/mcms/search.do

当在输入框搜索恶意代码时,会报错

在IDEA中可以看到报错信息:

跟踪到XssHttpServletRequestWrapper.java查看

此处虽然对输入做了过滤,但是最后却直接将输入返回给前端

throw new BusinessException("参数异常:"+ content);

导致了XSS漏洞

文件上传

第一个

后台登录地址:http://localhost:8080/ms/login.do

系统设置->模板管理中存在上传接口

其接口地址为:/ms/file/uploadTemplate.do

文件上传的信息都保存在Bean中

此处虽然说只能上传zip文件,但是抓包之后可以修改为其他类型的文件,修改为一个TXT文本进行尝试:

打断点调试

发现bean对象的uploadPath默认都为template\1

将bean对象的相关属性放到Config中然后调用uploadTemplate方法

uploadTemplate方法负责文件上传,并黑名单检测文件后缀是否为exe,jsp,jspx,sh

最终上传的文件都会到web根目录下的/template/1/中

同时返回文件地址

且能够成功访问

但是并不能上传jsp后缀的文件

尝试将jsp文件打包成zip然后上传,看看是否会自动解压

查看代码发现在文件上传成功后会自动调用/template/unZip.do方法进行解压

该方法将ZipFile解压到ZipFile的父目录下,且限制了路径穿越

可以看到成功解压了,绕过了后缀名的限制

但是springboot启动的情况下,虽然能访问到jsp⽂件但是不能解析,⼀般是在tomcat部署的情况下才能解析成功

第二个

在模板管理中可以编辑模板,并保存

此时抓包得到的接口地址为:/ms/template/writeFileContent.do

通过控制fileName可以上传任意文件(除了jsp和exe后缀的)

fileName=1.txt&fileContent=123&oldFileName=1.txt

此时上传到的是web根目录

尝试目录穿越,但是发现报错

原因为BasicUtil.getRealTemplatePath方法获取web根路径会调用getRealPath方法,而getRealPath方法会判断路径中是否存在../,导致报错

freemaker模板注入

在内容管理->静态化中,可以根据模板生成主页

接口地址为:/ms/cms/generate/generateIndex.do

调用了CmsParserUtil.generate方法

调用了ParserUtil.rendering方法

该方法中又调用了另一个rendering

触发了process

一般freemaker漏洞常位于后台可以编辑模版的地方,通过插入恶意的ftl指令到ftl文件中,当后端再次return或者process时即可触发代码执行

因此在模板内容中插入恶意的指令,并生成主页,即会触发模板注入

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

任意文件删除

这里用到了AOP切面技术

代码位于net/mingsoft/cms/aop/CategoryAop.java

@Pointcut("execution(* net.mingsoft.cms.action.CategoryAction.delete(..)) ")

拦截CategoryAction.delete方法

并在执行完delete之后执行AOP中的delete方法

实现删除栏目后并删除文章对应的静态化文件

deleteCategoryHtml方法没有对传入的categoryPath做任何过滤,因此可以实现任意文件删除

在内容管理->栏目管理处删除栏目并打断点调试

该方法会提取传入参数中的categoryPath

并调用deleteCategoryHtml方法

其中htmlPath为webapp目录下的html目录

appDir为web

最后拼接的路径为:

src/main/webapp/html/web/gywm/gongsijieshao

因此我们可以控制categoryPath,使其删除webapp目录下的1.txt文件:

删除成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/774263.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05HTML+CSS

今日学习了CSS样式中的其他东西。 复合选择器 定义:由两个或多个基础选择器,通过不同的方式组合而成。 作用:更准确、更高效的选择目标元素(标签)。 后代选择器 后代选择器:选中某元素的后代元素。 选择器写法:父选择器 子选择器 { CSS 属性},父子选择器之间用空格隔开…

Java基础知识分享(二)

前面的编程里学会了吗?学会了快来看看新的知识吧!写在前面 昨天给了十题编程题,如果你能有思路很快速地完成它,说明你的Java数据类型、运算符、选择语句、循环语句部分的基础知识很好,接下来就来看看后面的方法、数组以及他们在JVM中的内存划分知识吧! 方法 语句定义格式…

C 语言指针学习

C 语言指针学习 目标:复习软考 + 阅读代码 + 理解数据结构; 1. 指针定义 内存区域中的每个字节都对应一个编号,这个编号就是地址。如果在程序中定义了一个变量,那么在对程序中进行编译时,系统就会给这个变量分配内存单元。按变量地址存取值的方式称为直接访问,如printf(&q…

环形表示进度 css+js+svg

先看看我做出来的效果人狠话不多 直接上代码 html部分 <div id="box"></div>css部分#box{width: 400px;height: 400px;background-color: #00E8D7;display: flex;}.circleBox{width: 33.333%;display: flex;flex-direction: column;align-items: center;…

卡特兰数(Catalan)

1.简介: 卡特兰数是组合数学中一个常出现于各种计数问题中的数列。 十以内的卡特兰数,方便打表找规律,稍微记记。 1 2 5 14 42 132 429 1430 4862 16796 2.catalan递推式子 (1)点击查看代码 #include<bits/stdc++.h> using namespace std;#define int long long con…

数据可视化在智慧园区中能够发挥什么作用?

在智慧园区的建设和管理中,数据可视化技术正发挥着越来越重要的作用。通过数据可视化,园区管理者可以将大量复杂的数据转化为直观、易懂的图形和图表,从而更高效地监控和分析园区内的各种动态。数据可视化不仅能够实时展示园区内的人员流动、能耗情况、安全状况等关键指标,…

【学习笔记】并查集应用

【学习笔记】并查集应用 以 NOI 2001 食物链 为例の两种并查集用法。 题目大意: 规定每只动物有且仅有三种可能的种类 \(A、B、C\),\(A\) 会吃 \(B\),\(B\) 会吃 \(C\),\(C\) 会吃 \(A\)。 给定 \(N\) 只动物,\(K\) 个语句。每个语句有如下两种可能的表达:1 X Y 表示动物…

《NET CLR via C#》---第三章(运行时解析类型引用)

"运行时"解析类型引用首先在"C:\Users\LH89\source\repos"目录下,新建Console1工程(C#控制台)实现简单的代码,并编译为程序集(假定名为Program.exe)using System;public class Program {static void Main(string[] args){Console.WriteLine("Hell…

2024“钉耙编程”中国大学生算法设计超级联赛(3) 1005 数论

题意:分析: 远看数论题,实则是道数据结构。 记 \(f_{i}\) 表示 \(r_{k}=i\) 的方案数,\(g_{i}\) 表示 \(l_{1}=i\) 的方案数,那么运用简单容斥,可得: \[ans_{x} = (\sum_{i=1}^{n} f_{i}) - ((\sum_{i=1}^{x-1}f_{i})+1) \times ((\sum_{i=x+1}^{n}g_{i})+1)+1 \]先考虑…