| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Shiro反序列化漏洞利用详解(Shiro-550+Shiro-721) -> 正文阅读 |
|
[Java知识库]Shiro反序列化漏洞利用详解(Shiro-550+Shiro-721) |
Shiro反序列化漏洞利用详解(Shiro-550+Shiro-721)Shiro简介Apache Shiro 是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能,Shiro框架直观、易用、同时也能提供健壮的安全性。 Apache Shiro反序列化漏洞分为两种:Shiro-550、Shiro-721 Shiro-550反序列漏洞漏洞原理Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。 影响版本Apache Shiro < 1.2.4 Shiro反序列化的特证:返回包中会包含rememberMe=deleteMe字段 这种情况大多会发生在登录处,返回包里包含remeberMe=deleteMe字段,这个是在返回包中(Response) 如果返回的数据包中没有remeberMe=deleteMe字段的话,可以在数据包中的Cookie中添加remeberMe=deleteMe字段这样也会在返回包中有这个字段 基础环境编辑器:IDEA 2020 java版本:jdk1.7.0_80 Server版本 : Tomcat 8.5.56 shiro版本:shiro-root-1.2.4 组件:commons-collections4 漏洞简单介绍利用
漏洞分析加密Shiro≤1.2.4版本默认使用CookieRememberMeManager,而且CookieRememberMeManager类继承了AbstractRememberMeManager AbstractRememberMeManager这个类调用了rememberSerializedIdentity方法 这个方法使用base64对指定的序列化字节数进行编码,并将Base64编码的字符串设置成cookie值 而这个方法被rememberIdentity方法给调用了。 rememberIdentity方法被onSuccessfulLogin方法给调用,这里找到了onSuccessfulLogin成功登录的方法 当登录成功后会调用AbstractRememberMeManager.onSuccessfulLogin方法,该方法主要实现了生成加密的RememberMe Cookie,然后将RememberMe Cookie设置为用户的Cookie值。在前面我们分析的rememberSerializedIdentity方法里面去实现了 然后调用了isRememberMe 这个是用来判断用户是否选择了Remember Me选项 如果是TRUE的话就会调用remeberIdentity方法并且传入三个参数。 这个方法进行了一个反序列化,然后返回序列化后的byte数组 看下面的代码,如果getCipherService方法不为空的话,就会去执行下一段代码。getCipherService方法是获取加密模式。 查看调用,会发现在构造方法里面对该值进行定义。 到了这里后又会调用encrypt方法,对序列化后的数据进行处理。 这里调用了cipherService.encrypt方法并且传入序列化数据,和getEncryptionCipherKey方法。 这里的getEncryptionCipherKey方法是获取秘钥的方法
再次查看调用的时候发现setCipherKey方法在构造方法里面被调用了 查看DEFAULT_CIPHER_KEY_BYTES值后发现里面定义了一串秘钥而且秘钥是定义死的 返回刚刚加密的地方 然后跟近下面圈起来的地方 查看到这里发现会传入前面序列化的数组和key值,最后再去调用他的重载方法并且传入序列化数组、key、ivBytes值、generate。 iv的值由generateInitializationVector方法生成,进行跟进。 然后再查看getDefaultSecureRandom方法 再次返回generateInitializationVector继续查看,这里会发现new了一个byte数组长度为16 最后得到了ivBytes值进行返回 然后再返回到加密方法的地方查看具体加密的实现 这里调用crypt方法进行获取到加密后的数据,而这个output是一个byte数组,大小是加密后数据的长度加上iv这个值的长度。 在执行完成后序列化的数据已经被进行了AES加密,返回一个byte数组。 然后后面就是进行base64加密后设置为用户的Cookie的rememberMe字段中。 解密我们前面分析加密的时候,调用了 调用 漏洞攻击现在已经知道了是因为获取rememberMe值,然后进行解密后再进行反序列化操作。 那么在这里如果拿到了密钥就可以伪造加密流程。 这里找了一个加密脚本
获取到值后加密后的payload后可以在burp上面进行手工发送测试一下。 Shiro-721利用条件知道已经登陆用户的合法cookie且目标服务器含有可利用的攻击链就可以进行漏洞利用。 原理Apache Shiro RememberMe Cookie默认通过
用通俗易懂的话来说就是 shiro721用到的加密方式是AES-CBC,而且其中的ase加密的key基本猜不到了,是系统随机生成的。而cookie解析过程跟cookie的解析过程一样,也就意味着如果能伪造恶意的rememberMe字段的值且目标含有可利用的攻击链的话,还是能够进行RCE的。 影响版本1.2.5, 漏洞复现先使用合法账号进行登录勾选remember Me然后使用bp抓包 然后获取到cookie 此处注意删除JSESSIONID,否则后续无法利用
最后会生成恶意的rememberMe cookie,我们使用这个cookie替换原数据包中的cookie。然后登陆进服务器看,会发现/tmp目录下被创建了一个123文件。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:16:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |