原理:在反序列化的过程中,将字节流转化为对象。在此过程,由于输入不可控,并且后端对用户输入过滤不严格,攻击者通过构造恶意输入,在反序列化后,调用魔术方法执行任意恶意代码,产生非预期对象。

  1. 用户输入不可控
  2. 输入的恶意代码被执行

由于序列化后的字节流别中间件接收,在服务器端进行反序列化。

PHP

serialize()、unserialize()

PHP 反序列化漏洞的条件为:触发点输入的参数可控,魔术方法中可以执行任意变量,不会对危险操作进行校验。

魔术方法:

魔术方法是内置的,经常被执行的。

​ __construct():在对象创建时自动被调用;

​ __ sleep():在对象序列化的时候自动被调用;

​ __destruct():在脚本运行结束时自动被调用;

​ __wakeup():在反序列化为对象时自动被调用;

​ __toString(): 直接输出对象引用时自动被调用;

JAVA

反射

反射的意思就是通过调用 obj.getClass() 等函数,能够获取一个对象所属的类,进而能够执行该类中的方法(包括私有方法)

JAVA 反序列化概念

Java 反序列化漏洞分为 触发点利用链(Gadget)

  • 触发点:要满足输入可控
  • 利用链:要满足能执行任意变量(包含危险命令等操作)

总结一句话就是:在与客户交互的页面中,某些方法输入的参数不可控(触发点),能够给攻击者构造任意参数的机会。将攻击者构造的参数传递给后台去执行(利用链),一般会读取输入的参数、计算输入的参数,从而执行了攻击者构造的恶意参数。

java.io.ObjectOutputStream 类中的 writeObject( ) 方法可以实现 Java序列化。
java.io.ObjectInputStream 类中的 readObject( ) 方法可以实现 Java反序列化。

Java中间件通常通过网络接收客户端发送的序列化数据,而在服务端对序列化数据进行反序列化时,会调用 readObject( ) 等方法。如果某个对象重写了readObject( ) 等方法(在Java中如果重写了某个类的方法,就会优先调用经过修改后的方法),且在方法中能够执行任意代码,那服务端在进行反序列时,也会执行相应代码。

如果能够找到满足上述条件的对象进行序列化并发送给Java中间件,Java中间件也会去执行指定的代码,即存在反序列化漏洞。

Java序列化的要求

1、实现Serializable接口或Externalizable接口
2、当前类提供一个全局常量 serialVersionUID
3、必须保证其内部所有属性也必须是可序列化的(默认情况下,基本数据类型可序列化)
4、ObjectInputStream和ObjectOutputStream不能序列化static和transient修饰的成员变量

代码

import java.io.*;
public class Serialize {
    public static void main(String[] args) throws Exception {
        //序列化
        ObjectOutputStream oos = new ObjectOutputStream(new 	    	FileOutputStream("hello.txt"));
        oos.writeObject(new String("序列化"));
        oos.close();

        //反序列化
        ObjectInputStream ois = new ObjectInputStream(new 		FileInputStream("hello.txt"));
        Object o = ois.readObject();
        String s = (String) o;
        ois.close();
        System.out.println(s);

    }

Apache Shiro 反序列化

用了AES加密的密钥,此密钥被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥

Apache Shiro 1.2.4 以及以前版本中,加密的用户信息序列化后存储在remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户的Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。

产生原因:shiro默认使用看CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值–>Base64解码—>AES解码—>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞

在构造恶意命令的时候:恶意命令—AES加密—base64编码—发送cookie

影响版本 Apache Shiro <=1.2.4

img

weblogic反序列化漏洞

  • CVE-2017-10271 XMLDecoder反序列化漏洞
  • CVE-2019-2725 远程命令执行漏洞
  • CVE-2019-2618 任意文件上传
  • CVE-2019-2615 Weblogic 任意文件读取漏洞
  • CVE-2018-2826 Weblogic WLS Core Components 反序列化命令执行漏洞
  • CVE-2020-14882 未授权让RCE
  • CVE-2020-14644 Weblogic coherence组件iioo反序列化漏洞
  • CVE-2020-14756 T3/IIOP反序列化RCE
  • CVE-2021-2109 weblogic server 远程代码执行漏洞

WeblogicScan Weblogic一键漏洞检测工具

XMLDecoder 反序列化漏洞原理

Weblogic 的 WLS Security 组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。

CVE-2018-2826

Weblogic Server中的RMI 通信使用 T3协议在Weblogic Server和其它Java程序(客户端或者其它Weblogic Server实例)之间传输数据, 服务器实例会跟踪连接到应用程序的每个Java虚拟机(JVM)中, 并创建T3协议通信连接, 将流量传输到 Java虚拟机。T3协议在开放WebLogic控制台端口的应用上默认开启. 攻击者可以通过T3协议发送恶意的的反序列化数据, 进行反序列化, 实现对存在漏洞的weblogic组件的远程代码执行攻击。

Weblogic已经将互联网暴露的PoC都已经加入了黑名单,如果要绕过他的黑名单的限制就只能自己动手构造。来看看InboundMsgAbbrev中resolveProxyClass的实现,resolveProxyClass是处理rmi接口类型的,只判断了java.rmi.registry.Registry,其实随便找一个rmi接口即可绕过。

影响版本

​ Oracle Weblogic Server10.3.6.0.0

​ Oracle Weblogic Server12.1.3.0.0

​ Oracle Weblogic Server12.2.1.2.0

​ Oracle Weblogic Server12.2.1.3.0

扫描工具 https://github.com/0xn0ne/weblogicScanner

fastjson

fastjson介绍

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

序列化 JavaBeanSerializer类 JSON.toJSONString()

反序列化用到的是JavaBeanDeserializer类 JSON.parse() 和 JSON.parseObject()

在Fastjson反序列化框架中JSON是门面类,提供一些静态方法,如parse,parseObject,其主要功能都是在DefaultJSONParser类中实现的。DefaultJSONParser引用了ParserConfig类,该类主要保存一些相关配置信息。也引用了JSONLexerBase类用来处理字符分析。

Tomcat反序列化

CVE-2020-9484

成功利用此漏洞需要同时满足以下4个条件:

  1. 攻击者能够控制服务器上文件的内容和文件名称

  2. 服务器PersistenceManager配置中使用了FileStore

  3. PersistenceManager中的sessionAttributeValueClassNameFilter被配置为“null”,或者过滤器不够严格,导致允许攻击者提供反序列化数据的对象

  4. 攻击者知道使用的 FileStore 存储位置 到攻击者可控文件的相对路径

Apache

Apache Solr RCE—— CVE-2019-0192 安全版本:7.0

CVE-2018-1335:Apache Tika 命令注入

在Tika1.18 之前,用户可以发送精心构造的标头至tika-server,这些标头能够用来注入一些命令到运行tika-server的服务器的命令行中。此漏洞只影响向不受信用户开放并且运行tika-server的服务器。

Apache Axis1(<=1.4版本) RCE

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。

ysoserial 工具利用此类漏洞

JBoss反序列化漏洞

  • CVE-2017-12149 反序列化漏洞
  • CVE-2017-7504 JBoss JMXInvokerServlet 反序列化漏洞
  • JBoss远程代码执行漏洞
  • Jboss JMX Console 未授权访问Getshell

JbossScan 一个简单探测 jboss漏洞的工具

ysoserial.jar 这个工具生成各种反序列化的poc或者exp,里面包含了各种各样的反射链所使用到的库

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐