在代码审计中,java比较特殊,相比于php这种纯脚本文件驱动,java还可以使用内置虚拟机驱动(如比较新的spring技术),这就常常涉及到jar包。
之前都是跳过jar包,以为jar包里面就是一些框架性的东西,但是其实,有些jar包就是作者为系统专门编写或修改的,其中被引用的方法也是可能被直接引用,所以对jar包的审计其实等同于对显式源码审计,从前常常忽略了这一点,所以这里使用铭飞cms进行一个审计演示
使用铭飞cms5.2.4,地址https://gitee.com/mingSoft/MCMS
这里主要针对几个涉及到jar包的审计,所以其他常规的就先不做分析
1.jar包中隐藏的文件上传接口
首先在后台发现一处上传模板的功能点
抓包中,发现其路由为
/ms/file/uploadTemplate.do
在源码中搜索uploadTemplate,这个时候却没有发现有对应的源码,无论是路由mapping还是方法名皆无,这个时候就需要考虑到jar包中是否有对应源码
双击shift搜索
注意到 @PostMapping("/uploadTemplate") ,这个路由匹配正是在jar包中的类/repository/net/mingsoft/ms-basic/2.1.8/ms-basic-2.1.8-sources.jar!/net/mingsoft/basic/action/ManageFileAction.java
中找到的
其中存在非法路径检测
检测上传路径中是否存在../或者..\这种目录穿越
后面是统一上传文件方法upload
很明显这其中存在后缀检测,毕竟是统一上传方法,但是这里允许上传压缩包,所以很明显应该也存在解压接口
上传包含危险文件的压缩包,利用解压接口解压实现任意文件上传
这里的解压文件接口也是在jar包中的,可见这里对于jar包的直接利用是比较多的
这里的解压接口也是存在路径检测,否在在部署了tomcat的情况下,可以直接把jsp解压到tomcat目录下,这样就可以解析jsp文件拿到权限了,不然这样一个后台的spring任意文件上传比较尴尬
从黑盒角度来说,我是很想测一测这个fileurl有没有ssrf,可惜源码中解析文件是按文件路径来的
2.在同界面中还有个模板写入
/repository/net/mingsoft/ms-basic/2.1.8/ms-basic-2.1.8-sources.jar!/net/mingsoft/basic/action/TemplateAction.java
没错,源码中大部分细节性的方法都写在jar包里面,甚至于在显式代码中存在定义方法的类只有四个
jar包中文件写入的逻辑大致就是oldfilename,filename,filecontent这几个参数作为文件写入方法的参数,其中没有路径校验,没有内容校验,但是有后缀校验。jsp这种就不要想了,因为可以控制路径,将filename设置为/static/xss.htm传到静态目录下做个存储型xss也行
3.sql注入
直接在xml文件中搜索,在
net/mingsoft/cms/dao/IContentDao.xml中发现一处比较明显的
在相应的同名接口中没有定义对应的方法名query
其父类ibasedao中存在query方法
这时就需要去找对应方法的应用了
比如这里
使用的是 contentBiz 的方法query,而contentBiz是icontentbiz类
icontentbiz类又继承了ibasebiz
而ibasebiz是ibasedao数据接口层对应的业务逻辑层,所以这里也就是相当于调用了ibasedao中的query方法
contentbean应该是封装了数据,所以在postdata中构造payload即可
categoryId=-1'and extractvalue(0x7e,concat(0x7e,(database())))+--+