java代码审计-mcms

举报
亿人安全 发表于 2023/05/11 22:14:13 2023/05/11
【摘要】 环境搭建:代码审计:1.xss漏洞我们找到 net.mingsoft.basic.filter.XssHttpServletRequestWrapper并添加断点,再次触发漏洞,看到一个完整的调用栈,net/mingsoft/basic/filter/XssHttpServletRequestWrapper.javathrow new BusinessException("参数异常:"+ c...

环境搭建:

代码审计:

1.xss漏洞

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

net/mingsoft/basic/filter/XssHttpServletRequestWrapper.java

throw new BusinessException("参数异常:"+ content);此处直接将content原样拼接到报错中

漏洞复现:

2.SQL注入

思路:MCMS是使用mybaits作为持久层框架的,当在与接口对应的xml文件中使用 ${String} 时,会将String拼接进SQL语句。还有 <include></include>标签,会将一段复用的SQL代码拼接入当前语句中。

从这个思路出发,有两类注入,第一种造成的注入多,第二种需要官方的编辑器(因需要注册,不做记录,给出链接https://gitee.com/mingSoft/MCMS/issues/I61P5X

知识点:mybatis的xml有对应java代码interface,xml中的id对应interface中的方法

先给出明确的脉络,方便之后跟进不少的代码

从xml->interface->impl(实现)->Controller->抓包构造

全局搜索 ${

进入ICategoryDao.xml

跟进include中的net.mingsoft.base.dao.IBaseDao.sqlWhere,文件为net/mingsoft/base/dao/IBaseDao.xml

在jar包中

这里需要注意:

  • ${item.field}被直接拼接在SQL语句中
  • ${item.field},item是collection="sqlWhereList"的别名,也就是${sqlWhereList.field}
  • 传递的参数sqlWhereList,需要构造的是其中的field

2. 找接口及其实现

思路回到ICategoryDao.xml,找select id="query"对应的接口

找实现query的类,有三个,但只有一个接收传参

net/mingsoft/base/biz/impl/BaseBizImpl.java

public abstract class BaseBizImpl<M extends BaseMapper<T>,T> extends ServiceImpl<M,T> implements IBaseBiz<T> {
    ...
    	@Override
	public List<T> query(BaseEntity entity) {
		// TODO Auto-generated method stub
		return getDao().query(entity);
	}
	...
}

这是个抽象类,继续找,红线上为库中的,红线下为项目中的,先看项目中的

以`net/mingsoft/cms/action/CategoryAction.java`为例,获得地址:url为`@RequestMapping("/${ms.manager.path}/cms/category")`,`${ms.manager.path}`在配置中为ms

找到了query,categoryBiz.query;还没找到它的参数sqlWhereList,看看CategoryEntity,没有

看父类BaseEntity,找到sqlWhereList和SQLwhere,SQLwhere是`[{}]`形式,这里还看到一个眼熟的东西,JSONObject.parseArray,那么会不会有JSONObject.parse呢?

public abstract class  BaseEntity implements Serializable{
    ...
        
	/**
	 * 自定义SQL where条件,需要配合对应dao.xml使用
	 */
	@JsonIgnore
	@XmlTransient
	@TableField(exist = false)
	protected String sqlWhere;
    
    @JsonIgnore
	@XmlTransient
	public String getSqlWhere() {
		return sqlWhere;
	}
    public void setSqlWhere(String sqlWhere) {
		this.sqlWhere = sqlWhere;
	}
    
    @JsonIgnore
	@XmlTransient
	public List getSqlWhereList() {
		if(StringUtils.isNotBlank(sqlWhere)){
			try {
				return JSONObject.parseArray(sqlWhere,Map.class);
			}catch (Exception e){
				e.printStackTrace();
			}
		}
		return Collections.EMPTY_LIST;
	}
    ...
}

漏洞复现:

3.文件上传

/ms/file/uploadTemplate.do

打包jsp文件为zip,上传模板即可,前端时间监听,会发送解压请求


如果使用Tomcat运行的项目,访问可getshell,http://localhost:8888/template/1/xxx.jsp
代码没什么好看得,正常上传正常解压,没有检验删除,有删除可以试试条件竞争

成功上传文件。

图片位置上传

还有一处系统设置里的上传网站logo,也是上传zip,这里需要自己调用unZip

/ms/file/upload.do上传后会回显路径

/ms/template/unZip.do?fileUrl=zip路径

4、SSTI:Freemarker模板注入

自定义页面,绑定它,然后访问即可,没有进行安全配置

源码位置net\mingsoft\base\util\FtlUtil.java

如果加上cfg.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);漏洞就可以修复,也可以试试Freemarker的include包含模板,可惜在win下没成功

简单分析下源码

访问指定路由后,会调用generate()生成主页

其中主要是对map进行一些初始化操作,并通过rendering()进行渲染

最后调用process()进行渲染,造成代码执行

漏洞复现:


5.FastJson <=1.2.80 反序列化 存在但难以利用

漏洞复现:

6.SQL注入2

该cms的mybatis映射文件直接写在了dao层,由于${}会有SQL注入问题,所以直接搜索${},发现query方法中,categoryId参数可能存在SQL注入

根据namespace可知该语句的映射接口类是net.mingsoft.cms.dao.IContentDao

在IContentDao中并没有发现query方法,但他继承了IBaseDao,而query就在其中

下面就要看哪里实现了query方法,根据分层逻辑,业务层对应接口类为:net.mingsoft.cms.biz.IContentBiz ,而他的实现类是net.mingsoft.cms.biz.impl.ContentBizImpl而其中没有调用该方法,所以向上找他的父类BaseBizImpl

接着找哪里调用了该方法,同样根据分层逻辑,找到了控制层的net.mingsoft.cms.action.web.ContentAction,该层的接口为/cms/content

该类的list方法中,会调用contentBiz属性的query方法参数为content

contentBiz是IContentBiz类型的,IContentBiz的实现类是ContentBizImpl,接着他的父类BaseBizImpl实现了query方法

content属性是ContentBean类型的,而ContentBean的父类是CategoryEntity它定义了categoryId属性,并实现了对应的getter、setter方法

这里未对前端用户输入的参数进行过滤,另外该CMS全局也没有针对SQL注入的过滤,所以只需要传入categoryId参数,将查询语句闭合即可导致SQL注入

漏洞复现:

由于定义的是PostMapping,因此需要post传参

7.任意文件删除

net.mingsoft.basic.action.TemplateAction通过fileName可以指定目录删除,并且不像文件上传等对…/进行限制,这就导致我们可以通过…/进行任意目录删除

漏洞复现:

8.shiro反序列化


9、文件上传2

net.mingsoft.basic.action.TemplateAction#writeFileContent

10、文件上传3

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

net.mingsoft.basic.action.ManageFileAction#upload

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

对文件的上传是利用了

net.mingsoft.basic.action.BaseFileAction#upload

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。