JAVA反序列化漏洞学习

拖了很久,迟早是要学的

环境配置

配置Maven

windows下安装配置Maven

下载地址:

https://archive.apache.org/dist/maven/maven-3/
在这里插入图片描述

参考链接里,作者说不建议下载太高版本,经笔者测试,3.6.3 idea报错,解决方案就是降版本。我用的eclipse没问题。

解压后,在conf目录找到settings.xml,修改local repo以及换镜像
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	<mirror>  
		<id>alimaven</id>  
		<name>aliyun maven</name>  
		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
		<mirrorOf>central</mirrorOf>          
     </mirror>

配置环境变量,查看参考链接里的就行了,很详细

使用eclipse来新建maven项目

eclipse中创建maven项目,创建项目后如果报错

CoreException: Could not get the value for parameter compilerId for plugin e...

按ALT+F5勾选Force Update of Snapshots/Releases,然后关闭eclipse,就会自动下载需要的文件。
在这里插入图片描述

添加漏洞组件

按照参考链接创建好maven项目后,在项目的文件夹里有一个pom.xml,添加我们需要的组件

	<dependency>
	    <groupId>commons-collections</groupId>
	    <artifactId>commons-collections</artifactId>
	    <version>3.1</version>
	</dependency>

然后在包含pom.xml的目录下打开命令行窗口,执行下面的命令,maven就会去下载我们要的组件

call mvn -f pom.xml dependency:copy-dependencies

漏洞原理探究

参考
Java反序列化漏洞的原理分析
对如下利用链进行跟踪分析

BadAttributeValueExpException 中的属性 Object val --> TiedMapEntry
TiedMapEntrytoString() 方法调用了自身map属性的getValue() 方法 --> LazyMap
LazyMap的getValue拿到的必然是一个空对象,因此会触发LazyMap属性中配置的Transformer.transform()
Transformer 是我们构建的包含有恶意代码的对象

Java中的反射
Student 类


public class Student {
   

	public void show(String s){
   
		System.out.println("s=" + s);
	}
}

fanshe类,可以看到并没有import student类,但是可以通过Class.forName("Student");来获取Student类,并通过getMethod方法来获取Student类的方法,最终调用该方法


import java.lang.reflect.Method;
public class  fanshe{
   


	public static void main(String[] args) throws Exception {
   
		Class stuClass = Class.forName("Student");
		Method m = stuClass.getMethod("show", String.class);
		System.out.println(m);

		Object obj = stuClass.getConstructor().newInstance();
		m.invoke(obj, "2333");

	}
	

}

在这里插入图片描述

TransformedMap
TransformedMap是Commons-collections 3.1提供的一个工具类,用来包装一个Map对象,并且在该对象的Entry的Key或者Value进行改变的时候,利用Transformer提供的转换操作对该Key和Value进行转换。

当TransformedMap对象执行setValue方法时会调用valueTransformer的transform方法,如果传入的valueTransformer是ChainedTransformer的对象,可以造成恶意代码执行。

...
public class TransformedMap
        extends AbstractInputCheckedMapDecorator
        implements Serializable {
   

    /** Serialization version */
    private static final long serialVersionUID = 7023152376788900464L;

    /** The transformer to use for the key */
    protected final Transformer keyTransformer;
    /** The transformer to use for the value */
    protected final Transformer valueTransformer;
...
    public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {
   
        return new TransformedMap(map, keyTransformer, valueTransformer);
    }

    protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer) {
   
        super(map);
        this.keyTransformer = 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值