反序列化漏洞详解

本文详细介绍了PHP中的序列化和反序列化概念,以及相关函数如serialize()和unserialize()的使用。讨论了反序列化漏洞的产生原因,通过魔术方法如__destruct()、__wakeup()和__toString()的示例展示了如何被利用,并提供了防御反序列化漏洞的建议。内容涵盖了PHP面向对象编程中的关键知识点和安全实践。

目录

一、什么是序列化和反序列化

二、什么是反序列化漏洞

三、序列化函数(serialize)

四、反序列化(unserialize)

​五、什么是PHP魔术方法

六、一些常见的魔术方法

七、魔术方法的利用

 八、反序列化漏洞的利用

1.__destruct()函数

2.__wakeup()

3.toString()

​九、反序列化漏洞的防御


一、什么是序列化和反序列化

序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串转换为对象供程序使用。在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize()。

二、什么是反序列化漏洞

当程序在进行反序列化时,会自动调用一些函数,例如__wakeup(),__destruct()等函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。

三、序列化函数(serialize)

当我们在php中创建了一个对象后,可以通过serialize()把这个对象转变成一个字符串,用于保存对象的值方便之后的传递与使用。

测试代码

<?php 
 class Stu{
    public $name = 'aa';
    public $age = 18;
    public function demo(){
        echo "你好啊";
    }
$stu = new Stu();
echo "<pre>";
print_r($stu);
//进行序列化
$stus = serialize($stu);
print_r($stus);
}

?>

查看结果:

四、反序列化(unserialize)

        unserialize()可以从序列化后的结果中恢复对象(object)为了使用这个对象,在下列代码中用unserialize重建对象.

测试代码:

<?php 
	//定义一个Stu类
	class Stu
	{	
		//定义成员属性
		public $name = 'aa';
		public $age = 19;
		//定义成员方法
		public function demo()
		{
			echo '你吃了吗';
		}
	}
	//实例化对象
	$stu = new Stu();
	//进行序列化
	$stus = serialize($stu);
	print_r($stus);
	echo "<br><pre>";
	//进行反序列化
	print_r(unserialize($stus));
 ?>

查看结果:

五、什么是PHP魔术方法

魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,利用魔术方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)。 问题就出现在重载过程中,执行了相关代码。

六、一些常见的魔术方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一句话木马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值