CC3链分析

文章详细描述了如何利用CC3链在特定环境(JDK1.8.0_101,ApacheCommonsCollections3.2.1)中通过类加载和反射技术进行漏洞利用,涉及TemplatesImpl、TransletClassLoader和defineClass等关键方法。

前言

CC3链是采用类加载的方式进行漏洞利用

环境

JDK:1.8.0_101

Apache Commons Collections:3.2.1

正文

这里主要是通过defineClass方法来加载字节码

defineClass方法是将class二进制内容转换成Class对象

 

反射调用了defineClass,现在需要找newInstance初始化的代码

TemplatesImpl类是触发CC3链的关键类

这个TemplatesImpl类存在一个内部类TransletClassLoader继承了 ClassLoader并且重写了defineClass 方法,重写的defineClass方法可以被外部类调用

本类中的defineTransletClasses方法调用了defineClass,_bytecodes值不能为空值,才能进入TransletClassLoader类中,_tfactory值也必须复制后才能调用getExternalExtensionsMap方法

继续回溯defineTransletClasses方法

这里有个很关键的newInstance,这个就是我们需要实例化的关键方法,但是这个方法是私有方法,这里想要调用defineTransletClasses方法,需要_name不为空值,_class为空值(这个可以不用管),再往上看newTransformer方法

 这个newTransformer方法是一个公有方法,这里直接可以调用getTransletInstance方法

总结一下触发链子的关键点

_name需要赋值,_name是String类型的变量,赋值的可以随意赋一个字符串

_bytecodes是一个二维字节类型的数组,但是传入defineClass中的_bytecodes是一个一维字节数组,赋值的时候需要赋一个一维字节类型数组,这里可以通过读取class文件,当作一个一维数组赋值给_bytecodes

_tfactory 是一个transient类型的变量,它是不能被序列化的,但是只需要它的值不为空值就可以,这里可以把赋值为new TransformerFactoryImpl()

执行后发现报空值异常,调试一下

这里发现需要让该函数不进入else里,if条件里

所以需要加载类的父类为“com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet”

到这里就可以完美执行了

再往上找触发newTransformer方法的地方

这里采用了一个新的类InstantiateTransformer去触发漏洞

判断传入的对象是否为class类型的,如果是,获取这个指定参数类型的构造器 然后调它的构造函数,这样刚好满足TrAXFilter类触发newTransformer

这样找到了transform可空点,就可以像之前CC1和CC6一样去触发漏洞了

### CC1链分析及相关方法 #### 什么是CC1链? CC1通常指的是Cyclomatic Complexity 1(圈复杂度),它是衡量软件代码复杂性的经典指标之一。圈复杂度通过计算控制流图中的基本路径数来评估代码的逻辑复杂程度。较高的圈复杂度可能意味着更高的维护成本和潜在错误风险。 对于CC1链分析,其核心目标是对代码中具有高圈复杂度的部分进行定位、优化以及改进设计结构。这种分析可以通过多种方式完成,包括但不限于手动审查或自动化工具辅助。 #### 使用SourceMonitor进行CC1链分析 为了执行CC1链分析,可以利用像 **SourceMonitor** 这样的静态代码分析工具[^1]。这类工具有助于量化代码质量特性,例如函数长度、参数数量以及最重要的——圈复杂度。以下是具体操作流程: - 安装并配置SourceMonitor。 - 加载待测项目源码到该工具中。 - 查看报告部分有关“Cyclomatic Complexity”的统计信息。 如果发现某些模块存在过高的圈复杂度,则需进一步深入研究这些区域是否存在过多分支语句或者循环嵌套等问题,并考虑重构策略降低复杂性。 #### 编写自定义脚本检测CC1链 除了依赖现成的商业/开源解决方案外,还可以自行开发简单的Python脚本来初步估算单个文件内的最大圈复杂度值。下面给出了一段示范性质的小型解析器实现思路: ```python import ast class CyclomaticComplexityVisitor(ast.NodeVisitor): def __init__(self): self.complexity = 1 def visit_If(self, node): self.complexity += 1 super().generic_visit(node) def visit_For(self, node): self.complexity += 1 super().generic_visit(node) def calculate_cyclomatic_complexity(code_string): tree = ast.parse(code_string) visitor = CyclomaticComplexityVisitor() visitor.visit(tree) return visitor.complexity with open('example.py', 'r') as file: code_content = file.read() complexity_value = calculate_cyclomatic_complexity(code_content) print(f"Cyclomatic complexity of the provided script is {complexity_value}.") ``` 上述代码片段展示了如何基于抽象语法树(AST)构建一个简易版的圈复杂度计算器[^3]。此方法虽然不够全面,但对于快速筛查小型应用程序仍然有效。 #### 关联交叉编译环境下的应用考量 当涉及到不同平台间的移植工作时(比如ARM Cortex-M系列微控制器),选择合适的交叉编译工具链至关重要[^2]。无论是裸机还是Linux环境下运行的应用程序都应当遵循良好的编程习惯以减少不必要的复杂因素干扰最终产品质量。因此,在实际工程项目里实施严格的代码评审制度配合自动化的度量手段显得尤为重要。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值