本文已参与「新人创作礼」活动,一起开启掘金创作之路。
shiro框架漏洞
apache shiro框架提供了记住我的功能(remeber me),用户登录成功后会生成经过加密并编码的cookie
cookie的key为remerber me,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后再base64编码处理形成的
在服务端接收cookie值,解析过程
1、检索remerber me cookie的值
2、base64解密
3、使用aes解密(加密秘钥硬编码)
4、进行反序列化操作(未做过滤处理)\
在调用反序列化的时候未进行任意过滤。导致可以触发远程代码执行漏洞\
用户登陆成功后会生成经过加密并编码的cookie,在服务端接收cookie值后,Base64解码–>AES解密–>反序列化。攻击者只要找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化–>AES加密–>Base64编码,然后将其作为cookie的rememberMe字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞
二、Shiro序列化利用条件
由于使用了AES加密,要想成功利用漏洞则需要获取AES的加密密钥,而在shiro1.2.4之前版本中使用的是硬编码,AES加密的密钥默认在代码里。其默认密钥的base64编码后的值 kPH+bIxk5D2deZiIxcaaaA== ,这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。
目前已经更新了很多版本,官方通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用固定的编码,也有很多开源项目内部集成了shiro并二次开发,可能会重现低版本shiro的默认固定密钥的风险。用户如果不对密钥进行修改,即使升级shiro版本,也依旧存在固定密钥的风险。这里可以通过搜索引擎和github来收集密钥,提高漏洞检测和利用的成功率。
Shiro-550,只需输入url,即可完成自动化检测和漏洞利用。Shiro-721,需输入url,提供一个有效的rememberMe Cookie,并指定目标操作系统类型。
Shiro-550,Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
构造该值为一个cc链序列化后的值进行该密钥aes加密后进行base64加密,反序列化payload内容后就可以命令执行
Shiro-721,由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
objectinputstream readobject() 进行反序列化