赞
踩
下面看过来,这里我们右键pom.xml -> maven然后按下面的来
然后我们就可以看到这里多了一个target目录,然后下面下载了依赖
首先入门点在这里,org.apache.commons.collections.Transformer类中,就是在这里面
这里他是一个class文件,但是我们知道反编译class文件出来的代码是不好分析,右上角那里可以帮我们把源代码下载过来。
至于为什么使用Transformer接口,这里我们可以看到下面,这里我们可以理解成一个转换对象的地点,我们传进去的对象都会被转换后在返回,而且它可以接受任何对象。
这里我们选中Transformer,使用快捷键ctrl+alt+b,我们就可以快速查看使用了Transformer接口的类,因为我们知道InvokerTransformer是下一个节点,这里我们直接来到那里
这里我们来到InvokerTransformer类中的transform方法,这里我们可以知道,他是利用了反射,下面我们分析一下
input是我们传入的对象
Class cls = input.getClass(); 通过input对象获取字节码文件
//获取input对象中的iMethodName(iParamTypes)方法
//注意:java中方法是可以重名的,只要参数数量不一样就可以
Method method = cls.getMethod(iMethodName, iParamTypes);
//调用了iMethodName方法,参数的值是iArgs
method.invoke(input, iArgs);
然后找到参数的值的位置,这里参数的值,我们可以new的对象的时候附带进去,发现参数值,没有任何过滤,证明我们可以进行恶意代码了。
这里我们可以看看基础恶意代码执行
//但是我们不能以这种方法来进行恶意代码执行,我们这里将他转成反射的形式
Runtime.getRuntime().exec(“notepad”); //使用exec方法打开记事本
这里是反射形式的,这里可以看到上面和上面InvokerTransformer类中的transform方法的形式是一样的呢,所以我们按这样将数据传入到里面
// 获取当前运行时对象
Runtime r = Runtime.getRuntime();
// 通过对象获得字节码文件
Class c = r.getClass();
// 获取Class对象中名为"exec",参数为String类型的public方法
Method execm = c.getMethod(“exec”, String.class);
// 在r对象上调用execm方法,执行"notepad"命令,打开记事本
execm.invoke(r, “notepad”);
这里根据我们需要的东西,将值传进去,那么这时候transform方法中就会上面一样执行,然后弹出记事本。
new InvokerTransformer(“exec”,new Class[]{String.class},new Object[]{“notepad”}).transform®;
既然有了可以恶意代码执行的地方,我们就还需要可以走上去的地方,这里还是需要具有transfrom方法的类,但是这时候目标就变了,我们需要的是能够触发InvokerTransformer的transfrom的类。
这里我们随便找一个transform方法,右键选择查找用法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。