shiro反序列化漏洞攻击拓展面--修改key

💡 原文中文,约6900字,阅读约需17分钟。
📝

内容提要

本文介绍Shiro反序列化漏洞的进阶利用方法:通过修改加解密Key来独占控制权。作者指出默认Key可被反射修改,但需同时更新`encryptionCipherKey`和`decryptionCipherKey`。提供两种方案:改配置重启(不可取)或利用Filter内存马动态修改Key,并给出代码示例。修改后原Key失效,攻击工具无法再利用,但重启会失效,且需谨慎操作以免影响业务。

🔎

延伸解读

修改Key的两种思路对比

文章提出两种修改Shiro加解密Key的方案:一是直接修改配置文件并重启服务,但作者认为重启不可取;二是利用Filter内存马思路,动态修改ShiroFilterFactoryBean中的encryptionCipherKey和decryptionCipherKey。后者无需重启,但重启后修改会失效,与内存马特性一致。

反射修改Key的细节与限制

Shiro默认Key存储在AbstractRememberMeManager的DEFAULT_CIPHER_KEY_BYTES字段中,该字段为private static final,需通过反射去除final修饰符才能修改。但文章强调,仅修改该字段无效,必须同时更新encryptionCipherKey和decryptionCipherKey,因为实际加解密使用的是这两个值。

修改Key的实战影响与风险

修改Key后,原Key失效,其他攻击者无法再利用已知Key进行反序列化攻击,从而独占控制权。但作者提醒,修改Key可能影响业务,若业务依赖原Key则需谨慎操作。此外,修改Key与打内存马逻辑类似,重启服务后修改失效,需重新操作。

Q&A

Shiro反序列化漏洞中,如何通过修改key来独占控制权?

通过反射修改Shiro的加解密key,使默认key失效,从而只有自己知道新key,独占控制权。具体需要修改RememberMeManager中的encryptionCipherKey和decryptionCipherKey,而不是仅修改DEFAULT_CIPHER_KEY_BYTES。

Shiro中默认的加密key存放在哪里?为什么直接反射修改DEFAULT_CIPHER_KEY_BYTES无效?

默认key存放在AbstractRememberMeManager类的DEFAULT_CIPHER_KEY_BYTES字段中。直接反射修改该字段无效,因为实际加解密使用的是RememberMeManager实例中的encryptionCipherKey和decryptionCipherKey,它们默认与DEFAULT_CIPHER_KEY_BYTES相同,但修改DEFAULT_CIPHER_KEY_BYTES不会改变实例中的值。

修改Shiro的key有哪两种方案?为什么推荐使用filter内存马方式?

两种方案:1)修改配置文件并重启服务;2)利用filter内存马动态修改key。推荐第二种,因为重启服务会影响业务且不可取,而filter内存马方式可以动态修改,不影响业务。

如何通过filter内存马动态修改Shiro的加解密key?

通过反射获取shiroFilterFactoryBean中的securityManager,再获取rememberMeManager,然后调用其setEncryptionCipherKey和setDecryptionCipherKey方法设置新的key。具体代码示例见文章。

修改Shiro的key后,原来的攻击工具还能利用吗?

不能。修改后原key失效,攻击工具无法再利用,只有知道新key的人才能利用。

修改Shiro的key对业务有什么影响?需要注意什么?

一般情况下对业务没有影响,除非业务本身使用了key。需要注意重启服务会使修改失效,且操作需谨慎,以免影响业务。

🏷️

标签

➡️

继续阅读