CodeQL初见Shiro550

💡 原文中文,约3100字,阅读约需8分钟。
📝

内容提要

本文探讨Shiro550反序列化漏洞的无依赖利用方式,基于P牛思路分析CommonsBeanutils Gadget链,通过PriorityQueue和BeanComparator触发TemplatesImpl恶意对象。为解决替代类查找效率低的问题,引入CodeQL查询引擎快速筛选符合条件的Comparator实现类,提升漏洞挖掘效率,并预告后续深入实践。

🔎

延伸解读

无依赖利用的核心思路

文章指出,Shiro550的利用通常依赖第三方库如Commons-Collections,但P牛提出利用Shiro自带的Commons-Beanutils实现无依赖利用。关键在于找到替代ComparableComparator的类,需满足实现Comparator和Serializable接口、且由Java或Shiro自带。这一思路扩展了漏洞利用的适用场景,但替代类的查找效率是实践中的难点。

CodeQL在漏洞挖掘中的优势

作者对比了使用IDEA查找替代类与使用CodeQL查询的效率差异。IDEA手动筛选容易遗漏且耗时,而CodeQL通过类似SQL的查询语言,能快速从代码数据库中精确筛选出符合条件的类。CodeQL将代码视为数据,适合安全研究人员进行变体分析,且规则可复用,提升了漏洞挖掘的自动化水平。

实践中的注意事项

文章提到,在查找替代类时,环境中的依赖数量可能超过200个,但并非全部来自Shiro自带。作者强调,使用CodeQL时需确保查询条件准确,否则可能误报或漏报。此外,文章预告后续将深入CodeQL在gadget挖掘中的实践,暗示当前内容仅为初步探索,读者需关注后续更新以获取完整方法论。

Q&A

Shiro550反序列化漏洞的无依赖利用方式是什么?

无依赖利用是指仅使用Shiro本身自带的组件或JDK,不依赖第三方库(如commons-collections)来触发反序列化漏洞。P牛提出的思路是利用Shiro自带的CommonsBeanutils组件,通过构造恶意TemplatesImpl对象,配合PriorityQueue和BeanComparator触发漏洞。

CommonsBeanutils Gadget链的触发流程是怎样的?

触发流程为:PriorityQueue.readObject() -> heapify() -> siftDown() -> siftDownUsingComparator() -> BeanComparator.compare() -> PropertyUtilsBean.getProperty() -> getNestedProperty() -> getSimpleProperty() -> getPropertyDescriptor(),最终通过反射获取恶意TemplatesImpl对象的属性,触发漏洞。

P牛提出的替代ComparableComparator类需要满足哪些条件?

需要满足三个条件:1. 实现java.util.Comparator接口;2. 实现java.io.Serializable接口;3. 由Java、Shiro或commons-beanutils自带,且兼容性强。

为什么使用IDEA查找替代类效率低下?

因为IDEA只能查找实现Comparator和Serializable接口的类,但无法直接筛选出同时满足两个接口的类,需要手动导出结果再合并对比,过程繁琐且容易遗漏。

CodeQL在Shiro550漏洞挖掘中有什么作用?

CodeQL可以将代码当作数据处理,通过类似SQL的查询语句快速筛选出符合条件的类,例如同时实现Comparator和Serializable接口的类,大大提高了查找效率,避免了手动查找的繁琐和遗漏。

CodeQL是什么?

CodeQL是一个分析引擎,由GitHub开发,用于自动进行安全检查和变体分析。它将代码当作数据处理,通过编写查询来发现安全漏洞、缺陷等,支持自定义查询,且开源并持续维护。

🏷️

标签

➡️

继续阅读