shiro反序列化漏洞攻击拓展面--修改key
内容提要
本文介绍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。需要注意重启服务会使修改失效,且操作需谨慎,以免影响业务。