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文件:
删除成功