目录

一、序列化和反序列化

序列化

用途

二、Java反序列化漏洞

数据出现

函数接口

漏洞发现

漏洞利用

三、Java序列化反序列化演示

四、靶场演示


一、序列化和反序列化

序列化

        把 Java 对象转换为字节序列(字节流)的过程。

反序列化

        把字节序列(字节流)恢复为 Java 对象的过程。

用途

  • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中(持久化对象)。
  • 在网络上传送对象的字节序列(网络传输对象)

二、Java反序列化漏洞

数据出现


1、功能特性:


        反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数


据落磁盘、或 DB 存储等业务场景。因此审计过程中重点关注这些功能板块。


2、数据特性:


        一段数据以 rO0AB 开头,你基本可以确定这串就是 JAVA 序列化 base64 加密的数据;


        或者如果以 ACED 开头,那么他就是这一段 java 序列化的 16 进制。


3、出现具体:



http 参数, 
  cookie 
  , 
  sesion 
  ,存储方式可能是  
  base64(rO0 
  ),压缩后的base64(H4s),MII 等  
  Servlets http,Sockets,Session 管理器,包含的协议就包括: JMX、RMI、JMS、JND1等。(/xac/Xed) xm IXstream/XmldEcoder等(http Body:Content-type: application/xml)json(jackson,fastjson)http请求中包含。



函数接口



1、Java:



Serializable Externalizable  
  接口、 
  fastjson 
  、 
  jackson 
  、 
  gson 
  、ObjectInputStream.read、 
  ObjectObjectInputStream.readUnshared 
  、 XMLDecoder.read、 
  ObjectYaml.loadXStream.fromXML 
  、ObjectMapper.readValue、 
  JSON.parseObject  
  等。



2、PHP



serialize() 
  、  
  unserialize()。



3、Python:



pickle。



漏洞发现

1、黑盒分析:

        数据库出现地---观察数据特性。

2、白盒分析:

        组件安全&函数搜索&功能模块。

漏洞利用

        Ysoserial集成的jar包配合生成,特性的专业漏洞利用工具等。

三、Java序列化反序列化演示

<第一部分>



1.演示需要用到的代码。




java 开源 漏洞 静态分析 java常见漏洞_java


java 开源 漏洞 静态分析 java常见漏洞_java_02

2.执行序列化部分的代码,可以看到在指定路径下生成了指定的文件,文件内包含序列化的内容。

java 开源 漏洞 静态分析 java常见漏洞_网络安全_03

java 开源 漏洞 静态分析 java常见漏洞_web安全_04

3.使用工具对序列化内容进行查看,可以看到其头部内容为ACED。

4.执行反序列化部分的代码,可以看到其反序列化成功,并且将原始的内容进行了返回。

java 开源 漏洞 静态分析 java常见漏洞_java_05

5.至此,我们可以想到,如果将反序列化的目标文件的内容进行修改,修改成具有攻击性的代码,那么就可以实现一定的攻击性行为。

<第二部分>

1.这里用到一款工具,其支持一些pyload的生成。

java 开源 漏洞 静态分析 java常见漏洞_web安全_06

2.打开工具。

java 开源 漏洞 静态分析 java常见漏洞_开发语言_07

3.后面为空的就是不需要其它的包,只需要java的原生类。

java 开源 漏洞 静态分析 java常见漏洞_开发语言_08

4. 先来到下面的网站获取一个地址。

java 开源 漏洞 静态分析 java常见漏洞_java_09

5.在工具内执行下面的命令。

java 开源 漏洞 静态分析 java常见漏洞_开发语言_10

6.来到目标路径下可以看到生成的文件,以及文件内的序列化内容。

java 开源 漏洞 静态分析 java常见漏洞_开发语言_11

7. 使用工具产看,其头部内容为ACED。

java 开源 漏洞 静态分析 java常见漏洞_web安全_12

8.将a.txt放到刚刚反序列化的目录下。 

java 开源 漏洞 静态分析 java常见漏洞_开发语言_13

9.将正常要进行反序列化的文件改成我们刚刚使用工具生成的文件。

java 开源 漏洞 静态分析 java常见漏洞_java_14

10.执行序列化程序。

java 开源 漏洞 静态分析 java常见漏洞_java_15

11.可以看到网站内成功获取到了数据。

java 开源 漏洞 静态分析 java常见漏洞_网络安全_16

12.这里发生了啥?

        在这里我们将其原有的代码数据更改成了一个访问http的代码数据,当对方在进行反序列化的时候,就会将我们更改后的代码数据进行执行,就会对http进行访问。

四、靶场演示

1.启动靶场。

2.进入靶场,选择对应关卡。

java 开源 漏洞 静态分析 java常见漏洞_web安全_17

3. 可以看到给出的序列化代码是以rO0AB开头的,是 JAVA 序列化 base64 加密的数据。

4.使用工具生成pyload。

java 开源 漏洞 静态分析 java常见漏洞_web安全_18

5.再来目录下可以看到生成的文件。

java 开源 漏洞 静态分析 java常见漏洞_java_19

6.生成的内容如下。

java 开源 漏洞 静态分析 java常见漏洞_java_20

7.因为源代码会将序列化内容进行base64解密,因此我们还需要对其进行一次加密,使用下面的代码记性加密。 

java 开源 漏洞 静态分析 java常见漏洞_开发语言_21

8.加密后的内容如下。

java 开源 漏洞 静态分析 java常见漏洞_web安全_22

9.将代码粘贴到靶场。

java 开源 漏洞 静态分析 java常见漏洞_开发语言_23

10.点击提交后可以看到成功指定了调取计算器的命令。

java 开源 漏洞 静态分析 java常见漏洞_web安全_24