搭建一个java反序列化靶场(1)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
}

}



需要修改的只有 DemoApplication.java 这个类:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ObjectInputStream;

@SpringBootApplication
@Controller
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @ResponseBody
    @RequestMapping("/cc5")
    public String cc5Vuln(HttpServletRequest request, HttpServletResponse response) throws Exception {
        java.io.InputStream inputStream =  request.getInputStream();
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        try {
            String a=objectInputStream.readObject().toString();
            System.out.println(a);
        }catch (Exception e){
            System.out.println(e); //cc3 java.lang.annotation.IncompleteAnnotationException: java.lang.Override missing element entrySet
        }
        return "Hello,World";      
    }

    @ResponseBody
    @RequestMapping("/demo")
    public String demo(HttpServletRequest request, HttpServletResponse response) throws Exception{
        return "This is OK Demo!";
    }
}

为什么不用CC3链呢,因为 CC3链在JDK8u71以上版本无法使用。产生报错:

cc3 java.lang.annotation.IncompleteAnnotationException: java.lang.Override missing element entrySet

我的java version “1.8.0_91”,参考 ref: An Error Of "java -cp ysoserial-master.jar ysoserial.exploit.RMIRegistryExploit " · Issue #77 · frohoff/ysoserial · GitHub

0x02 payload 构建

payload生成:

java -jar ysoserial-0.0.5-all.jar CommonsCollections5 calc > a.ser

burp 发包:

如果不添加 commons-collections 依赖,运行会报错:

java.lang.ClassNotFoundException: org.apache.commons.collections.keyvalue.TiedMapEntry

可见在反序列化的时候要调用这个jar。

0x03 修复与防御

1.使用ObjectInputFilter来校验反序列化的类

Java 9包含了支持序列化数据过滤的新特性,开发人员也可以继承java.io.ObjectInputFilter类重写checkInput方法实现自定义的过滤器,并使用ObjectInputStream对象的setObjectInputFilter设置过滤器来实现反序列化类白/黑名单控制。

ref : 《Combating Java Deserialization Vulnerabilities with Look-Ahead Object Input Streams (LAOIS)》

2.使用 SerialKiller.jar

GitHub - ikkisoft/SerialKiller: Look-Ahead Java Deserialization Library

将 ObjectInputStream.readObject()改为 SerialKiller.readObject()。

SerialKiller.conf为配置文件,可以指定白名单,仅仅对白名单中的类反序列化。
SerialKiller.java为ObjectInputStream的子类,覆盖了resolveClass方法(此会被readObject()方法调用),加入了类名检查,确保反序列化的是安全的类。

0x04 代码审计

涉及到以下函数,则可能存在java反序列化:

readExternal 
objectInputStream.readObject()
objectInputStream.readUnshared()
xmlDecoder.readObject()
xStream.fromXML()
objectMapper.readValue()
JSON.parseObject()

0x05 后记

1.如果运行时报错:

java.io.StreamCorruptedException: invalid stream header: xxxx

应该使用序列化方式获取二进制流,不能直接传入文本。

https://www.cnblogs.com/gaoquanquan/p/11276114.html

  1. IDEA 配置 Maven

Settings – Maven – Maven home directory : (填写本地的Maven路径)

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

13718637)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值