RuoYi v4.2 Shiro反序列化漏洞
反序列化漏洞
漏洞原理
反序列化漏洞是基于序列化和反序列化的操作,在反序列化——unserialize()时存在用户可控参数,而反序列化会自动调用一些魔术方法,如果魔术方法内存在一些敏感操作例如eval()函数,而且参数是通过反序列化产生的,那么用户就可以通过改变参数来执行敏感操作,这就是反序列化漏洞。
漏洞危害
攻击者可伪造恶意的字节序列并提交到应用系统时,应用系统将对字节序列进行反序列处理时将执行攻击者所提交的恶意字节序列,从而导致任意代码或命令执行,最终可完成获得应用系统控制权限或操作系统权限。
RuoYi v4.2 Shiro反序列化漏洞
Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过 加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行 序列化,然后使用aes加密,最后在使用base64编码处理形成的。在调用反序列化时未 进行任何过滤,导致可以触发远程代码执行漏洞。
尽管官方更新了很多版本,但还是没有将反序列化的本身问题解决。后续版本使用了每 次生成一个密钥的方法来解决该漏洞。但是由于开源系统,或者教学代码范例常将弱密 钥硬编码等原因,因此导致很多开发人员疏忽,经验不足而导致该问题的产生。 通过查看pom.xml文件我们确定了Shiro版本为 1.4.2 。 Shiro 1.4.2 版本对于Shiro 反序列化来说是个分水岭。由于CVE-2019-12422漏洞的出现,也就是Shiro Padding Oracle Attack漏洞。Shiro在1.4.2版本开始,由 AES-CBC 加密模式改为了 AES-GCM 。所 以我们在做漏洞验证时,要将payload改成 AES-GCM 加密模式。
漏洞利用:
在黑盒测试中,我们可以在Cookie中添加 rememberMe=123 ,如果响应 Set-Cookie 头返回 rememberMe=deleteMe ,那么就可可以确定该系统使用了Shiro框架。如下图 所示:
暴破密钥:
暴破利用链后执行命令,如下图所示:
修复建议
- 黑名单校验修复
在反序列化时设置类的黑名单来防御反序列化漏洞利用及攻击,当工程中导入jar包提供反序列化操作的公共接口,就需要使用黑名单的方式来禁止一些已知危险的类被反序列化,部分的黑名单类如下:
org.apache.commons.collections.functors.InvokerTransformer
org.apache.commons.collections.functors.InstantiateTransformer
org.apache.commons.collections4.functors.InvokerTransformer
org.apache.commons.collections4.functors.InstantiateTransformer
org.codehaus.groovy.runtime.ConvertedClosure
org.codehaus.groovy.runtime.MethodClosure
org.springframework.beans.factory.ObjectFactory
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
org.apache.commons.fileupload
org.apache.commons.beanutils
- 安全编码
更新commons-collections、commons-io等第三方库版本;
业务需要使用反序列化时,尽量避免反序列化数据可被用户控制,如无法避免建议尽量使用白名单校验的修复方式;
- 过滤用户输入
接收用户传参时过滤不合理,不符合程序逻辑的输入。