Shiro550复现
https://www.cnblogs.com/h0cksr/p/16189761.html
Shiro550-反序列化
Apache Shiro框架提供了RemeberMe
功能,用户登录成功后会生成经过加密并编码的cookie。cookie的key为RemeberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
CVE编号:CVE-2016-4437
漏洞原理:该漏洞允许攻击者利用Shiro框架在处理记住密码功能(RememberMe)时使用的默认或可预测的AES加密密钥,通过构造恶意的序列化数据并将其加密和编码后发送至服务端,导致服务端在解密并反序列化过程中执行攻击者预设的代码,从而可能获取服务器的控制权。
1 | 检索RemeberMe cookie的值 |
打开靶机是一个登录页面
wappalyzer 看一下 也没看出来啥
输入账号 密码 勾选记住我 然后登录抓包
拦截返回包
可以看见 有个Set-Cookie rememberMe=deleteMe
这就是Apache Shiro组件的 特征
Apache Shiro™是一个强大且易用的Java安全框架,能够用于身份验证、授权、加密和会话管理,用于执行身份验证、授权、密码和会话管理。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞。
这里我直接利用工具就连上了
利用工具过程是很简单的,下面我们来看看这个漏洞的触发流程
首先是set-cookie的过程
用户登录–>信息进行序列化–>AES加密–>base64编码–>添加到remember字段
勾选记住密码后,下次登录服务端取出你的cookie进行验证
验证过程
取出remember字段的值–>base64解码–>然后AES解密(漏洞利用的关键是这个密钥key是不变的,shiro版本<=1.2.24的版本中使用了固定的密钥kPH+bIxk5D2deZiIxcaaaA==)–>反序列化–>代码执行
这样攻击者用这个密钥实现加密操作然后在cookie的remember字段构造自己设计的代码就会被执行了
这里偷个大佬的流程图
1 | https://blog.csdn.net/Bossfrank/article/details/130173880 |
登录成功且勾选rememberme才能看到set-cookie:rememberme=xxxxx
唉,java代码实在是看不懂,附上从代码分析流程,大佬讲的很好
1 | https://www.bilibili.com/video/BV1iF411b7bD/?vd_source=93147f59d99436a0d4bc043cd0cbb64e |
下面来看看shiro721
和shiro550相比,key是系统随即生成的了,不再是固定的,采用的是AES-128-CBC 模式加密
用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
EXP爆破时间很长,建议采用较短的命令来复现
涉及到一些密码学的知识,这篇文章写的很详细,想深入了解的可以看看
1 | https://www.freebuf.com/articles/network/221838.html |
简单来说就是我们知道了shiro的加密方式,然后利用padding oracle攻击来实现构造,根据服务器会对填充错误进行报错这个关键点,我们构造出一个虚假的IV值来反推中间值,根据异或运算的关系可以进行爆破。