记一次项目中遇到的JAVA系统审计
在一次项目中遇到某java开源系统,遂对其进行漏洞挖掘。
审计流程:
系统架构:springmvc+war包的部署方式。不是springboot的方式。
web.xml 文件内容:
走的springmvc的统一路由。
查看配置文件spring.xml内容:
配置文件中关注的重点如下的全局拦截器:使用/** 对所有url进行拦截:
com.futvan.z.framework.core.AllHandlerInterceptor 实现:
这个拦截器是做权限校验的,分为三类:
第一类:web这个包下的不拦截。
第二类:httpservices 这个包下的状态为1的方法也放过。
第三类:就是不属于上面两类的,单独处理。
这里我们的重点就关注第三类中的白名单。(第一类,第二类看过都已经排除了)
这里根据名字就可以看出来的高危方法:upload,RunSql
1. 先看upload方法:
这里主要看CreateFileSavePath 方法,确实是否上传到web根目录下:
再看下save方法:
所以这里的upload方法存在一个任意文件上传漏洞。
2. 查看RunSQL 方法:
这里有个问题就是需要知道数据库的名字,然后后续就是正常的增删改查操作。
然后查看拦截器中验证Session的操作:
直接查看session中是否存在zuser这个键值对,查看哪里存在zuser session的赋值:
一共只有三处,其中两处都是登录后的,另外一处:
查看SetSessionUser 的引用:
登陆处才会赋值,很简单的密码对比,一般情况下是没办法的操作,但是登陆如果存在sql注入就会有机会了:
很明显的拼接,所以存在sql注入,利用 union查询控制返回进行任意登录:
成功获取到登录后的Cookie。
RCE点:
搜索sink点发现存在spel表达式解析:
查看调用:
继续查看:
直接获取用户参数进行解析,造成spel表达式注入漏洞:
Xstream反序列化漏洞:(漏洞不存在)
在pom.xml中发现存在<1.4.18版本的xstream组建:
查看反序列化的fromXML 方法,发现存在两处:
继续查看调用:
发现在wx这个控制器中调用,并且内容可控,但是需要查看 WeiXinUtil.Decrypt 是否可以控:
从配置信息中获取token,key等内容进行解密:new WXBizMsgCrypt(z.sp.get("weixin_token"), z.sp.get("weixin_EncodingAESKey"), z.sp.get("weixin_appid"));
查看z.sp.get("weixin_token"),z.sp.get("weixin_EncodingAESKey")获取的是什么:
z.sp的是一个map,查看sp 初始化的地方:
发现sp的内容来源于:配置文件z.properties和z_sp 数据表:
数据库z_sp表中也不存在weixin_token,weixin_EncodingAESKey,weixin_appid该三个键值对,所以此处的值为null。
继续回到WX处,当 _EncodingAESKey 的长度不为64时,会自接抛出异常,所以解密失败。
该处的xstream 漏洞也是不存在的。
z.sp的初始化操作的地方: