5.17反序列化

1、原理

序列化:对象状态-可存储或传输形式的过程,将状态信息保存为字符串;
反序列化:序列化的字符串-对象;

恶意代码注入到应用程序中,程序从不安全来源反序列化数据时,数据从一种格式(json、xml)转化为(对象或列表),如果不检查安全性,则攻击者构造恶意代码在数据,程序反序列化时,恶意代码执行(RCE远程代码执行);

2、魔法函数

魔法函数 调用的时机
__construct() 初始化类的时候,一般对于变量进行赋值
__destruct() 和构造函数相反,在对象不再被使用时(将所有该对象的引用设为null)或者程序退出时自动调用
__toString() 当一个对象被当作一个字符串被调用,把类当作字符串使用时触发,返回值需要为字符串
__wakeup() 使用unserialize时触发,反序列化恢复对象之前调用该方法
__sleep() 使用serialize时触发.该函数需要返回以类成员变量名作为元素的数组(该数组里的元素会影响类成员变量是否被序列化。只有出现在该数组元素里的类成员变量才会被序列化
__destruct() 对象被销毁时触发
__invoke() 当脚本尝试将对象调用为函数时触发

3、防御

  • 避免使用不知源外部数据序列化
  • 输入序列化字符串验证
  • 白名单

4、php反序列化

serialize()  对象转化字符串
unserialize()  字符串转化对象

思路:字符串转对象,复制对象中的数据,在编译;

5、JAVA反序列化

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

发现思路:登录回显数据包时,数据为序列化结果数据,而查看用户信息时,将序列化数据输出回显了正常数据,构成了序列化和反序列化(关键);

posted @ 2024-06-01 19:41  路Sang  阅读(3)  评论(0编辑  收藏  举报