PHP&JAVA反序列化

PHP反序列化:

原理:序列化就是将对象转为字符串。反序列化与之相反,数据的格式的转换对象的序列化利于对象的保存和传输,也可以让多个文件共享对象

技术:有类(触发魔术方法);无类

利用点:真实应用下;各种ctf比赛中

原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQI注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一-些魔术方法。

serialize()//将一个对象转换成一个字符串(序列化)
unserialize()//将一个字符串转为对象(反序列化)

魔术方法:

__construct () / /创建对象时触发
__destruct() / /对象被销毁时触发
__call() //在对象 上下文中调用不可访问的方法时触发
__callstatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset ()或empty ()触发
__unset() //在不可访问的属性 上使用unset ()时触发
__invoke () //当脚本尝试将对象调用为函数时触发


===强类型比较需要对比类型和数值
==弱类型比较只需对比数值

Java反序列化:

概念:我们需要保存某一刻某个对象的信息,来进行一些操作。比如利用反序列化将程序运行的对象状态以二进制形式储存与文件系统中,然后可以在另一个程序中对序列化后的对象状态数据进行反序列化恢复对象。可以有效地实现多平台之间的通信、对象持久化存储。

利用payload生成器--ysoerial
自定义检测工具或脚本

黑盒检测:数据格式点(HTTP请求中的参数,自定义协议,RMI协议),特定扫描
Java中的API实现
序列化:
objectoutputStream类--> writeobject()
注:该方法对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中
按Java的标准约定是给文件一个. ser扩展名
反序列化: objectInputStream类 --> readobject()
注:该方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。


下方的特征可以作为序列化的标志参考:
一段数据以rO0AB开头, 你基本可以确定这串就是JAVA序列化base64加密的数据。
或者如果以aced开头,那么他就是这一段java序列化的16进制。|

 

本文作者:掘掘子

本文链接:https://www.cnblogs.com/juejuezi/p/17230253.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   掘掘子  阅读(148)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起