Shiro550漏洞(CVE-2016-4437),成功入职腾讯月薪45K

在这里插入图片描述

从代码审计和漏洞发现者的角度分析问题,我们搭建该项目,抓包,发现包里携带 cookie,很明显是经过某种加密的结果,所以我们需要去代码里面寻找与 cookie 处理相关的代码。

我们在知晓 Shiro 的加密过程之后,可以人为构造恶意的 Cookie 参数,从而实现命令执行的目的。

我们直接双击 shift 寻找 Cookie 相关的类和方法

在这里插入图片描述

最后我们找到的是 CookieRememberMeManager 类,明显是与 cookie 相关的。

接着我们看到这个类的内部有一个 getCookie() 方法,我们在这里下断点进行调试。

在这里插入图片描述

我们发送数据包进行分析

在这里插入图片描述

我们走到了 getRememberedSerializedIdentity() 方法里面

在这里插入图片描述

这里可以看出,传进去的 cookie 值,传到了 base64 变量里。

在这里插入图片描述

这里先判断 base64 变量的值是不是 deleteMe ,这里很明显不是。然后会通过函数 ensurePadding 进行 base64 填充,然后会通过 base64 解码,赋值给 byte[] decoded,最后返回 decoded

在这里插入图片描述

返回的内容会赋值给 byte[] bytes,也就是说现在的变量 bytes 就是存放的 base64 解码后的 cookie

在这里插入图片描述

接着走,发现会调用 convertBytesToPrincipals() 函数,将 bytes 作为一个参数传进去

在这里插入图片描述

如果加密服务存在,就通过 this.decrypt() 函数对 bytes 进行解密;

在这里插入图片描述

加密服务存在,看下加密服务信息,发现使用的就是 AES 的 CBC 模式加密,填充模式为 PKCS5Padding

在这里插入图片描述

接着跟进去看看解密函数 decrypt()

在这里插入图片描述

可以看到,第 167 行的 decrypt() 函数,有两个参数,第一个是 base64 解码后的内容,第二个是 getDecryptionCipherKey() 函数,该函数有什么作用呢?

发现该函数返回一个 decryptionCipherKey

在这里插入图片描述

那么这个 decryptionCipherKey 是个什么东西呢?

我们看看谁调用了。

首先发现他是一个变量

在这里插入图片描述

接着看看都有谁调用了这个变量

在这里插入图片描述

首先是 setDecryptionCipherKey() 调用了,有点莫名其妙,再看看谁调用了 setDecryptionCipherKey()

在这里插入图片描述

发现是 setCipherKey() 方法,该方法接受一个 byte 类型的变量

再看看是谁调用了 setCipherKey() 方法,可知是 AbstractRememberMeManager() 方法

在这里插入图片描述

该方法里面,我们跟进去发现它的一个常量,是一个固定的值(kPH+bIxk5D2deZiIxcaaaA== )。

在这里插入图片描述

现在很清晰了,一整条寻找的思路如下图所示,也就是说:this.decryptionCipherKey 就是默认 key kPH+bIxk5D2deZiIxcaaaA== 的 base64 解码的值,也就是密钥。

在这里插入图片描述

返回密钥后进入解密函数 cipherService.decrypt()

在这里插入图片描述

大家都知道 AES 解密除了密钥还需要一个偏移量 IV,之前一直没给出来,所以应该也是在解密函数里面,跟进,跟几步就能看到 IV,字节是 16 个 0,翻译过来就是 ' '*16

在这里插入图片描述

现在解密完成后,开始第二步了:

反序列化

在这里插入图片描述

把解密好的字节进行反序列化

在这里插入图片描述

反序列化调用 readObject() 位置

在这里插入图片描述

至此,我们分析完,我们传进去的 cookie 是怎么解密的了。

小结

shiro 在获取到 cookie 后会进行 base64 解码–>AES 解密(CBC 模式,PKCS5Padding,默认密钥为 kPH+bIxk5D2deZiIxcaaaA==)–> 反序列化。

总体来说分析起来还是很简单,简化一下就是

  • 首先在 CookieRememberMeManager.getRememberedSerializedIdentity 中进行 base64解码
  • 然后调用 AbstractRememberMeManager.convertBytesToPrincipals,其中包含了 AES 解密和反序列化

Shiro550 的根本原因:固定 key 加密,Shiro1.2.4 及之前的版本中,AES 加密的密钥默认硬编码在代码里(Shiro-550),Shiro 1.2.4 以上版本官方移除了代码中的默认密钥,要求开发者自己设置,如果开发者没有设置,则默认动态生成,降低了固定密钥泄漏的风险。

漏洞利用

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值