反序列化漏洞

php 反序列化

反序列化原理

未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

PHP 序列化转换使用的函数

serialize():讲对象转换成一个字符串

unserialize():将字符串还原成一个对象

序列化后的数据形式

PHP 反序列化漏洞分为有类和无类

无类

没有class对象的一般都是无类

序列化

反序列化

有类

带有class对象的。在无类的反序列化漏洞中,主要是利用魔术方法来达到攻击的目的

魔术方法

PHP中的魔术方法通常以 __( 两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发。

例如:

__construct()  //(构造函数/方法) 创建对象是触发
__destruct()  // (析构函数/方法)对象被销毁时触发

pikachu 靶场

pikachu的php反序列化漏洞

使用双等号,可能会出现弱类型判断的问题

代码执行顺序,从上向下执行

等于号数量问题,弱类型判断

双引号和单引号

postman工具

代码执行顺序问题

魔术方法:

例如new的时候构造函数会自动调用

java 反序列化

参考: https://cloud.tencent.com/developer/article/1590955

一般会进行base64加密,为了观看方便

参考作为序列化的标志

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

或者如果以ac ed 00 05开头,那么它就是这一段java序列化的16进制。

Java中的API实现

位置:Java.io.ObjectOutputStream     Java.io.ObjectInputStream

序列化:ObjectOutputStream类 -->writerObject()

注:该方法对参数指定的object对象进行序列化,把字节序列写到一个目标输出流中

按Java的标准约定是给文件一个。ser扩展名

反序列化:ObjectInputStream-->readObject()

注:该方法从一个源输入流中读取字节序列,在把它们反序列化为一个对象,并将其返回。

漏洞成因

暴露或间接暴露反序列化API,导致用户可以操作传入数据,攻击者可以精心构造反序列化对象并执行恶意代码

两个或多个看似安全的模块在同一运行环境下,共同产生的安全问题

参考: https://www.cnblogs.com/mutudou/p/14685301.html

Java反序列化漏洞的挖掘

1、黑盒流量分析:

在Java反序列化传送的包中,一般有两种传送方式,在TCP报文中,一般二进制流方式传输,在HTTP报文中,则大多以base64传输。因而在流量中有一些特征:

(1)TCP:必有aced0005,这个16进制流基本上也意味者java反序列化的开始;

(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果;

以上意味着存在Java反序列化,可尝试构造payload进行攻击。

2、黑盒java的RMI:

rmi是java的一种远程对象(类)调用的服务端,默认于1099端口,基予socket通信,该通信实现远程调用完全基于序列化以及反序列化。

3、白盒代码审计:

(1)观察实现了Serializable接口的类是否存在问题。

(2)观察重写了readObject方法的函数逻辑是否存在问题。

Java反序列化漏洞的防御:

1、类的白名单校验机制:

实际上原理很简单,就是对所有传入的反序列化对象,在反序列化过程开始前,对类型名称做一个检查,不符合白名单的类不进行反序列化操作。很显然,这个白名单肯定是不存在Runtime的。

2、禁止JVM执行外部命令Runtime.exec

ysoserial工具的使用

jave反序列化攻击工具,可以生产payload

下载地址:https://github.com/frohoff/ysoserial