博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反序列化漏洞学习之Apache Commons Collections
阅读量:3907 次
发布时间:2019-05-23

本文共 2015 字,大约阅读时间需要 6 分钟。

demo 一波。 最近群里都在学Java 参考:

1 环境

在这里插入图片描述

import org.apache.commons.collections.functors.InvokerTransformer;public class test {    public static void main(String[] args){        InvokerTransformer invokerTransformer = new InvokerTransformer("exec", new Class[]{ String.class}, new Object[] {"calc.exe"});        invokerTransformer.transform(Runtime.getRuntime());    }}

运行上面代码 先弹出个计算器的小demo,搭建成功。

或者郁师傅这样也可以:
在这里插入图片描述
transform 方法介绍:

在这里插入图片描述

传入的参数是input是一个实例化对象,调用的方法iMethodName和参数iArgs都是InvokerTransformer实例化时设定的。所以利用这个方法便可以调用任意对象的任意方法。

那么关键

**在apache.commons.collections.functors中,有一个

InvokerTransformer

类,

public Object transform(Object input) {    if (input == null) {        return null;    } else {        try {            Class cls = input.getClass();//获得类            Method method = cls.getMethod(this.iMethodName, this.iParamTypes);            return method.invoke(input, this.iArgs);        } catch (NoSuchMethodException var5) {            throw new FunctorException("InvokerTransformer: The method '" + this.iMethodName + "' on '" + input.getClass() + "' does not exist");        } catch (IllegalAccessException var6) {            throw new FunctorException("InvokerTransformer: The method '" + this.iMethodName + "' on '" + input.getClass() + "' cannot be accessed");        } catch (InvocationTargetException var7) {            throw new FunctorException("InvokerTransformer: The method '" + this.iMethodName + "' on '" + input.getClass() + "' threw an exception", var7);        }    }}

它继承了TransformerSerializable接口,在类中有一个成员函数

transform
获得类名字, 通过 。getmethod方法获得
它通过反射技术可以调用任意类的任意方法。**

因此实现反序列化执行命令的目标中,它是一个重要的函数,我们要想办法去调用它。比如我们利用Runtime.getRuntime().exec(cmd)去执行命令就可以这样调用

在Java中调用外部命令不像PHP中直接使用system()或者exec(),Java是完全面向对象的编程,调用外部命令也需要对象->方法或者类->静态方法这样调用,常用的就是 Runtime.getRuntime().exec(cmd),所以单纯的利用上面一个transform是不能达到执行命令的目的的。要多次调用此transform并且上一次的返回结果作为下一次的输入,相当于一个递归(非严格意义)。这是开发中的一个正常的功能,所以commons-collections早就封装好了相关的方法:ChainedTransformer,该类实例化是传入的是一个Transform相关对象的列表,调用ChainedTransformer的transform方法是挨个调用这个列表里对象的transform方法。

转载地址:http://szqen.baihongyu.com/

你可能感兴趣的文章
J2ME下的Zlib/Gzip/Zip压缩相关
查看>>
Cygwin 的安装配置
查看>>
Cygwin基本命令的使用方法
查看>>
Java本地接口(JNI)编程指南和规范(第二章)
查看>>
有关使用xsl输出csv格式文档的实践小结
查看>>
在Ubuntu 12.04 为 Eclipse 添加快速启动项
查看>>
GCC强大背后
查看>>
Android x86模拟器Intel Atom x86 System Image配置与使用方法
查看>>
shell脚本兼容linux/unix与windows/cygwin的基础(注意处理好CR, LF, CR/LF 回车 换行的问题)
查看>>
【分享】手把手教你使用U盘安装Ubuntu系统
查看>>
Ubuntu下adb无法识别android设备的解决方法
查看>>
使用U盘安装Ubuntu系统的实践小结
查看>>
编译cscope-15.8a遇到的问题与解决方案
查看>>
ubuntu下海信Hisense E920 usb连接不上的处理与adb的连接
查看>>
findbugs的ant脚本实践
查看>>
Ubuntu 12.04 安装 Subversion 1.7
查看>>
scp port 22: Connection refused
查看>>
ubuntu12.04命令行下安装RabbitVCS
查看>>
自定义cscope-index
查看>>
(ubuntu)在andorid andk工程中使用ccache加速编译速度
查看>>