1、原理
序列化:对象状态-可存储或传输形式的过程,将状态信息保存为字符串;
反序列化:序列化的字符串-对象;
恶意代码注入到应用程序中,程序从不安全来源反序列化数据时,数据从一种格式(json、xml)转化为(对象或列表),如果不检查安全性,则攻击者构造恶意代码在数据,程序反序列化时,恶意代码执行(RCE远程代码执行);
2、魔法函数
魔法函数 | 调用的时机 |
---|---|
__construct() | 初始化类的时候,一般对于变量进行赋值 |
__destruct() | 和构造函数相反,在对象不再被使用时(将所有该对象的引用设为null)或者程序退出时自动调用 |
__toString() | 当一个对象被当作一个字符串被调用,把类当作字符串使用时触发,返回值需要为字符串 |
__wakeup() | 使用unserialize时触发,反序列化恢复对象之前调用该方法 |
__sleep() | 使用serialize时触发.该函数需要返回以类成员变量名作为元素的数组(该数组里的元素会影响类成员变量是否被序列化。只有出现在该数组元素里的类成员变量才会被序列化 |
__destruct() | 对象被销毁时触发 |
__invoke() | 当脚本尝试将对象调用为函数时触发 |
3、防御
- 避免使用不知源外部数据序列化
- 输入序列化字符串验证
- 白名单
4、php反序列化
serialize() 对象转化字符串
unserialize() 字符串转化对象
![](/i/l/?n=24&i=blog/3436932/202406/3436932-20240601194046443-2131759018.png)
思路:字符串转对象,复制对象中的数据,在编译;
### 5、JAVA反序列化
![](/i/l/?n=24&i=blog/3436932/202406/3436932-20240601194059508-261672854.png)
![](/i/l/?n=24&i=blog/3436932/202406/3436932-20240601194108166-929234882.png)
xiaodi-->txt乱码 **序列化** wirteobject
txt乱码数据-->xiaodi **反序列化** readobject
==序列化标志参考:数据以rO0AB开头,基本为java序列化之后base64编码后数据;aced开头,即为java序列化16进制数据;==
### 6、payload
反弹shell解决无回显问题;
ipconfig= >序列化->base64=rO0AB格式字符串 最终payload
ysoserial工具生成payload;
登录用户返回数据包:"data":"rO0ABddsadahudqwhoodwhwdnssabndabnbnsabmdnakjqowhoi"
,解密先用base64解码之后用==SerializationDumper解析数据==
**查看当前用户信息:**
**请求数据包:rO0ABddsadahudqwhoodwhwdnssabndabnbnsabmdnakjqowhoi**
**返回是ctfhub**
**发现思路**:登录回显数据包时,数据为序列化结果数据,而查看用户信息时,将序列化数据输出回显了正常数据,构成了序列化和**反序列化**(关键);
标签:__,3436932,对象,5.17,字符串,序列化,数据
From: https://www.cnblogs.com/lusang/p/18226308