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