原理+实践学习(PHP反序列化和Session反序列化)

本文探讨了PHP的序列化与反序列化过程,重点讲解了PHP反序列化漏洞和对象注入的概念,包括如何绕过魔法函数。此外,文章详细阐述了Session反序列化攻击的原理,分析了不同引擎处理Session文件时可能导致的安全问题,并通过实例展示了攻击思路和利用方法。
摘要由CSDN通过智能技术生成

文章首发于先知社区

https://xz.aliyun.com/t/7366

前言:

最近又接触了几道php反序列化的题目,觉得对反序列化的理解又加深了一点,这次就在之前的学习的基础上进行补充。

0x00:PHP序列化

函数 : serialize()

所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

一开始看这个概念可能有些懵,看了很多大师傅们的博客后,慢慢明白这个概念的道理。

在程序执行结束时,内存数据便会立即销毁,变量所储存的数据便是内存数据,而文件、数据库是“持久数据”,因此PHP序列化就是将内存的变量数据“保存”到文件中的持久数据的过程。

$s = serialize($变量); //该函数将变量数据进行序列化转换为字符串
file_put_contents(./目标文本文件’, $s); //将$s保存到指定文件

下面通过一个具体的例子来了解一下序列化:
在这里插入图片描述
输出序列化后的结果:

User lemon is 20 years old. 
O:4:"User":2:{
   s:3:"age";i:20;s:4:"name";s:5:"lemon";}

可以看到序列化一个对象后将会保存对象的所有变量,并且发现序列化后的结果都有一个字符,这些字符都是以下字母的缩写。

a - array                  b - boolean  
d - double                 i - integer
o - common object          r - reference
s - string                 C - custom object
O - class                  N - null
R - pointer reference      U - unicode string

了解了缩写的类型字母,便可以得到PHP序列化格式

O:4:"User":2:{
   s:3:"age";i:20;s:4:"name";s:5:"lemon";}
对象类型:长度:"类名":类中变量的个数:{
   类型:长度:"值";类型:长度:"值";......}

通过以上例子,便可以理解了概念中的通过serialize()函数返回一个包含字节流的字符串这一段话。

0x01:PHP反序列化

函数:unserialize()

unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。 在解序列化一个对象前,这个对象的类必须在解序列化之前定义。

简单来理解起来就算将序列化过存储到文件中的数据,恢复到程序代码的变量表示形式的过程,恢复到变量序列化之前的结果。

$s = file_get_contents(./目标文本文件’); //取得文本文件的内容(之前序列化过的字符串)
$变量 = unserialize($s); //将该文本内容,反序列化到指定的变量中

通过一个例子来了解反序列化:
在这里插入图片描述
输出结果:

User lemon is 20 years old. 

注意:在解序列化一个对象前,这个对象的类必须在解序列化之前定义。否则会报错

在先知上看大师傅举得例子对序列化和反序列化的介绍,也很好理解。

<?php
class A{
   
    var $test = "demo";
}

$a = new A();  // 生成a对象
$b = serialize($a);  // 序列化a对象为b
$c = unserialize($b); // 反序列化b对象为c

print_r($b);   // 输出序列化之后的值:O:1:"A":1:{s:4:"test";s:4:"demo";}
echo "\n";
print_r($c->test);  // 输出对象c中test的值:demo

?>

0x03:

0x04:PHP反序列化漏洞

在学习漏洞前,先来了解一下PHP魔法函数,对接下来的学习会很有帮助

PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法

__construct   当一个对象创建时被调用,
__destruct   当一个对象销毁时被调用,
__toString   当一个对象被当作一个字符串被调用。
__wakeup()   使用unserialize时触发
__sleep
  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值