java代码审计-mcms
环境搭建:
代码审计:
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
- 点赞
- 收藏
- 关注作者
评论(0)