PHP反序列化
原理
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行 反序列化的时候就有可能会触发对象中的一些魔术方法。
- serialize() //将一个对象转换成一个字符串
- unserialize() //将字符串还原成一个对象
触发
参考:
https://www.cnblogs.com/20175211lyz/p/11403397.html
unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:
__construct() //创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
测试
<?php
$key='xiaodi';
echo serialize($key);
?>
注意:
==仅验证数值,===验证值和类型
JAVA反序列化
原理
我们需要保存某一刻某个对象的信息,来进行一些操作。比如利用序列化将程序运行的对象状态以二进制形式存储于文件系统中,然后可以在另一个程序中对序列化后的对象状态数据进行反序列化恢复对象。可以有效地实现多平台之间的通信,对象持久化的存储。
序列化: 将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。 反序列化:从存储区中读取该数据,并将其还原为对象的过程,成为反序列化。
API的实现
位置:Java.io.ObjectOutputStream java.io.ObjectInputStream
序列化:ObjectOutputStream类 --> writeObject() 注:该方法对参数指定的obj对象进行序列化,把字节序列化写到一个目标输出中 按Java的标准约定是给一个.ser扩展名。 反序列化:ObjectInputStream类 --> readObject() 注:该方法从一个源输入流中读取字节序列,再把他们反序列化为一个对象,并将其 返回。
实战中关键代码可以在项目的org中查找是否有关于Serialization的文件
特征
下方的特征可以作为序列化的标志参考: 一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据 或者如果以aced开头,那么他就是这一段JAVA序列化的16进制

Comments NOTHING