PHP反序列化
原理:
序列化就是将对象转为字符串。反序列化与之相反,数据的格式的转换对象的序列化利于对象的保存和传输,也可以让多个文件共享对象
技术:
有类(触发魔术方法);无类
利用点:
真实应用下;各种ctf比赛中
原理:
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQI注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一-些魔术方法。
serialize()//将一个对象转换成一个字符串(序列化)
unserialize()//将一个字符串转为对象(反序列化)
魔术方法:
__construct () / /创建对象时触发
__destruct() / /对象被销毁时触发
__call() //在对象 上下文中调用不可访问的方法时触发
__callstatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset ()或empty ()触发
__unset() //在不可访问的属性 上使用unset ()时触发
__invoke () //当脚本尝试将对象调用为函数时触发
===强类型比较需要对比类型和数值
==弱类型比较只需对比数值
概念:
我们需要保存某一刻某个对象的信息,来进行一些操作。比如利用反序列化将程序运行的对象状态以二进制形式储存与文件系统中,然后可以在另一个程序中对序列化后的对象状态数据进行反序列化恢复对象。可以有效地实现多平台之间的通信、对象持久化存储。
利用payload生成器--ysoerial
自定义检测工具或脚本
黑盒检测:
数据格式点(HTTP请求中的参数,自定义协议,RMI协议),特定扫描
Java中的API实现
序列化:
objectoutputStream类--> writeobject()
注:该方法对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中
按Java的标准约定是给文件一个. ser扩展名
反序列化:
objectInputStream类 --> readobject()
注:该方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
下方的特征可以作为序列化的标志参考:
一段数据以rO0AB开头, 你基本可以确定这串就是JAVA序列化base64加密的数据。或者如果以aced开头,那么他就是这一段java序列化的16进制。|
原文始发于微信公众号(寒鹭网络安全团队):PHP&JAVA反序列化
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论