某运营管理平台登录绕过及文件上传漏洞分析
某运营管理平台漏洞分析 Filter分析 查看web.xml文件,可以发现多个路由都由controllerFilter来处理 看看这个filter的实现逻辑,doFilter方法中首先检测访问的url中是否包含/dwr/,或以.js结尾,只要不包含/dwr/或者不以.js结尾就为true verificationURL方法验证用户是否登录,未登录直接重定向到/login/abnormal_ex
某运营管理平台漏洞分析
Filter分析
查看web.xml文件,可以发现多个路由都由controllerFilter来处理

看看这个filter的实现逻辑,doFilter方法中首先检测访问的url中是否包含/dwr/,或以.js结尾,只要不包含/dwr/或者不以.js结尾就为true

verificationURL方法验证用户是否登录,未登录直接重定向到/login/abnormal_exit.jsp,返回false,所以在未登录状态下,在前面条件未满足情况下,就会重定向到/login/abnormal_exit.jsp,不会进入if语句逻辑

看第二个if判断,判断访问的url中是否包含/ProxyServletUtil和/servlet/pageProcessServlet,只要不包含/ProxyServletUtil和/servlet/pageProcessServlet就为true

看第三个if判断,访问的url不以.xf和.xml结尾,并且满足(!uri.endsWith(".jsp") || !this.isNotValidatePage(uri))就为true

isNotValidatePage方法相当于是定义了能够访问的jsp文件的白名单

当url不以.xf和.xm和.jsp结尾时,为true,如果访问的url以jsp结尾,jsp文件的名称需要在白名单中,才为true,否则为false
当这三个if判断都满足了后,如果访问的url是白名单中的jsp文件,则判断传入的参数是否存在违规字符

validate方法用来检测传入的参数是否存在违规字符

如果访问的url以.do结尾,先检测是否包含违规字符,在检测是否登录

如果访问的url是图片文件

未做什么判断

如果访问的url以.ln结尾,获取传入的SYS_LINK参数,调用LinkUtil.getLinkMeta方法获取LinkMeta对象,然后判断LinkMeta对象中获取到的时间是否在当前时间之前,根据LinkMeta对象中获取到的用户名进行登录操作,然后重定向到LinkMeta对象中获取到的url

loginByCas方法中调用loginByUserName方法

loginByUserName方法

很明显,这里存在一个登录绕过漏洞
登录绕过
看下LinkUtil.getLinkMeta方法是怎么获取到LinkMeta对象的

调用BaseFunc.hexStringToBytes对传入的SYS_LINK进行hex解码,然后调用EncrypUtil.decrypt对其进行解密,将解密后的内容按||进行分割,第一块为url、第二块为时间,第三块为用户,所以解密后的内容应该就是这种形式:
url||时间||用户
时间转换的格式:

所以我们可以构造如下payload:
/main/main.jsp||2025-01-01||admin
然后先调用EncrypUtil.encrypt对其进行加密,再调用BaseFunc.bytesToHexString将其转为hex
利用获取到的hex数据,访问如下url即可直接进入后台:

/xxx.ln?SYS_LINK=hex
文件上传
看到依赖中有DBstep.jar文件,用到了金格组件

搜索下DBstep,发现/iweboffice/OfficeServer.jsp中调用了

存在文件上传漏洞,保存路径目录穿越下就行了

但是还有个问题就是,/iweboffice/OfficeServer.jsp直接是访问不到的,会重定向到/login/abnormal_exit.jsp

看响应包可以看到Server: Apache-Coyote/1.1,说明是tomcat中间件,可以利用其特性来绕过

根据前面Filter的分析,我们知道以jsp结尾的文件只能是白名单中的才能访问,但是我们可以通过.jsp;或者.js%70的形式进行绕过
这样子uri.endsWith识别不到.jsp,但是之后tomcat自己会去除;号、进行url解码等


而我们上传的jsp文件,我们只需要在一个存在的目录下,上传一个在白名单中的jsp名称,即可直接访问了

登录绕过2
查看servlet,可以发现.fe与.xf结尾的由workflow定义

这个servlet初始化了配置文件/WEB-INF/classes/spring/workflow-bean.xml

/WEB-INF/classes/spring/workflow-bean.xml文件中定义了一些.fe结尾的路由

/loginService.fe对应的fe.ext.erp.FeErpLoginServlet中只要传入的参数op等于D,就会设置userName=admin,然后调用loginByCas(userName, request)

就和上文那个一样了
参考链接
https://blog.csdn.net/qq_41904294/article/details/135258831
https://stack.chaitin.com/vuldb/detail/9fbafeda-3c94-49ee-93f0-f9131e8f9e15