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
发现思路:登录回显数据包时,数据为序列化结果数据,而查看用户信息时,将序列化数据输出回显了正常数据,构成了序列化和反序列化(关键);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现