审计流程:

系统架构: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的初始化操作的地方: