PHP反序列化漏洞-从入门到提升

目录

第一章 PHP序列化基础

1.1 PHP序列化

1.1.1 PHP序列化概述

1.1.2 标准序列化

1.1.3 自定义序列化

1.1.4 序列化存储和转发

1.2 PHP反序列化

1.2.1 标准反序列化

1.2.2 未定义类的反序列化

1.2.3 Protected、Private属性反序列化

1.3 PHP序列化相关magic函数

1.3.1 __construct()和__destruct()

1.3.2 __sleep()和__wakeup()

1.3.3 __toString()

第二章 PHP反序列化漏洞

2.1 PHP反序列化漏洞简介

2.2 PHP反序列化漏洞利用

2.2.1 __wakeup()绕过

2.2.2 结合PHP代码审计,寻找漏洞

 2.3 PHP反序列化漏洞总结


申明:本文适合PHP反序列化漏洞初学者,从PHP序列化原理讲起,逐渐深入到反序列化及其漏洞,几乎每个知识点都配有代码演示,十分方便理解,希望对你们有所帮助!另外,本文只作为博主学习路上的记录罢了,起到督促作用,文内引用网上一些前辈的观点,如有雷同实属借鉴,嘻嘻


第一章 PHP序列化基础

1.1 PHP序列化

1.1.1 PHP序列化概述

在学习序列化之前,我们有必要了解其产生背景,PHP文件在执行结束后,相关的对象就会被销毁,此时如果另有其他页面需要调用这些对象是无法实现的,因为我们不可能让PHP文件一直无休止的去执行以保证对象不被销毁,于是在这样的需求推动下,序列化技术就产生了,所以,所谓的序列化实际上是为了方便数据的存储和转发。在PHP中序列化和反序列化一般用作缓存,比如session缓存、cookie缓存等,但是需要注意,PHP对Session的处理有三种引擎:

1、php_serialize             ///序列化字符串形式与serialize()函数处理结果一致

2、php                            ///序列化字符串为"key|value"的形式

3、php_binary

每一种处理引擎得到的序列化字符串格式不一样,默认为php,可通过ini_set('session.serialize_handler','php_serialize')来指定引擎。

1.1.2 标准序列化

PHP序列化是PHP程序设计中的一种格式化数据的方法,通过序列化可以将对象(class)、数组(array)等进行序列化转换为特定格式的字符串,同时不丢失其类型和结构,以便于存储和传递,PHP实现序列化的函数是serialize(),来看个例子:

由上面的例子可见,序列化对不同类型的数据序列化后标识符是不同的,通过序列化字符串的首位进行标识,具体如下:

类型 标识
字符串 s:size:value
整型 i:value
布尔 b:value
NULL N
数组 a:size:{key;value}
对象

O:Obj_name_len:Obj_name:var_num:{var_name_type:var_name_len:var_name;var_value_type:var_value_len:var_value}

/// 注释:Obj-Object对象;var-varible变量

补充说明:

  1. 在序列化对象时,只会保留父类中的变量和自己申明的变量,而不会保留常量和方法(function)
  2. PHP通过关键字class来申明一个对象/类,在对象/类中使用$符申明变量/属性。

1.1.3 自定义序列化

在序列化对象的时候,对于一些敏感的属性并不需要保存,比如密码,此时可自定义序列化。在调用serialize()函数进行序列化对象时,该函数首先会检查对象中是否存在一个magic函数__sleep(),如果存在则先调用__sleep(),然后才执行序列化操作,因此可以通过重载__sleep()函数来实现自定义序列化行为。

  • __sleep()函数返回一个包含对象中所有应该被序列化的变量名称的数组;
  • 所谓重载__sleep(),就是改变其返回数组的内容
  • 如下例子中默认__sleep()返回的数组为['name','age','password'],重载后返回的数组为['name','age']过滤掉了敏感变量password

1.1.4 序列化存储和转发

一般而言可使用函数file_put_contents()来实现序列化字符串的存储,序列化的转发可通过转发存储在本地的文件来实现,如下面例子所示:

1.2 PHP反序列化

1.2.1 标准反序列化

通过上一节的讲解,我们知道数组、对象可以通过序列化为字符串进行存储,那么如何将序列化字符串还原为数组、对象呢?PHP提供了unserialize()反序列化函数来实现这一功能,如果反序列化的是对象,则在成功重构对象后,PHP会自动试图去调用magic函数__wakeup()。反序列化时,会尽量匹配预定义对象的变量名并赋值。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值