PHP反序列化漏洞

Web安全--反序列化漏洞详解(php篇) 反序列化 阅读详情

PHP反序列化漏洞是指在PHP应用程序中由于不正确地处理用户提供的序列化数据而导致的安全漏洞。这种漏洞通常出现在接受用户输入并将其反序列化为对象或数据结构的地方,比如通过unserialize()函数。

  攻击者可以利用这种漏洞在服务器上执行恶意代码,进行远程代码执行(RCE)攻击,获取系统权限,甚至完全控制受影响的服务器。

1.面向对象与面向过程的优缺点

面向对象:

         优点:不仅关注眼前的事件实现,也关注未来可能发生的事件。具有高度的拓展性和复用性,特点是继承、封装、多态。
         缺点:如果只是单一的功能实现,面向对象的设计思路会较为繁琐

面向过程:

         优点:根据事情的目的分解出过程,再一步步实施。对于不复杂的事件执行效率快。
         缺点:只关注眼前事件的实现,开发复杂功能的时候繁琐。

2.类和对象的关系

类和对象之间有密切的关系,可以简单地概括为“类是对象的蓝图,对象是类的实例”。

  • 类(Class) 是一种抽象的数据类型,它定义了一组属性(成员变量)和方法(成员函数)。类是一种模板或蓝图,描述了对象应该具有的属性和行为。

  • 对象(Object) 是类的实例化。当一个类被实例化时,就创建了一个对象。对象是类的具体实体,具有类定义的属性和方法。

  类定义了对象的属性和方法,而对象则是这些属性和方法的实际实例。类是一种抽象的概念,它描述了对象应该有什么样的属性和行为,而对象则是具体的实例,它实际上拥有这些属性和行为。

举个例子:

class Car {
    // 属性
    public $color;
    public $brand;

    // 方法
    public function start() {
        echo "Car started!";
    }

    public function stop() {
        echo "Car stopped!";
    }
}

// 创建Car类的实例(对象)
$myCar = new Car();
$myCar->color = "red";
$myCar->brand = "Toyota";

// 调用对象的方法
$myCar->start();

在这个例子中,Car 是一个类,它定义了汽车的属性(color 和 brand)以及行为(start() 和 stop() 方法)。当我们创建 $myCar 对象时,它就是 Car 类的一个实例,拥有类定义的属性和方法。

3.php访问修饰符

在php类中不写访问修饰符默认的访问权限为public

在 PHP 中,访问修饰符用于定义类的属性和方法的访问级别。这些修饰符包括:

  1. public(公共):公共成员可以在任何地方被访问,没有访问限制

  2. protected(受保护):受保护的成员只能被定义它们的类或继承该类的子类访问。外部类不能直接访问受保护成员

  3. private(私有):私有成员只能被定义它们的类访问。外部类和子类都不能直接访问私有成员

这些访问修饰符可以用来控制类的封装性,确保类的内部数据不被外部类或代码直接访问和修改,从而提高代码的安全性和可维护性。在 PHP 中,访问修饰符使用关键字 public、protected 和 private 来定义。例如:

class MyClass {
    public $publicVar;
    protected $protectedVar;
    private $privateVar;

    public function __construct() {
        $this->publicVar = "Public variable";
        $this->protectedVar = "Protected variable";
        $this->privateVar = "Private variable";
    }

    public function getPrivateVar() {
        return $this->privateVar;
    }
}

$obj = new MyClass();

echo $obj->publicVar; // 可以正常访问
// echo $obj->protectedVar; // 无法直接访问,会导致错误
// echo $obj->privateVar; // 无法直接访问,会导致错误
echo $obj->getPrivateVar(); // 可以通过公共方法访问私有属性的值

publicVar 是公共属性,可以在任何地方访问。protectedVar 是受保护属性,只能在该类或其子类中访问。privateVar 是私有属性,只能在该类内部访问

4.php序列化和反序列化

在 PHP 中,序列化是将数据结构或对象转换为字符串的过程,而反序列化则是将这个字符串重新转换为原始的数据结构或对象的过程。这种转换通常用于在不同的应用程序之间或在不同的请求之间传递数据,或者用于将数据持久化存储

PHP 中有两个主要的函数来执行序列化和反序列化操作:

1.序列化(Serialization): 使用 serialize() 函数将数据结构或对象转换为字符串。

$data = array('name' => 'John', 'age' => 30, 'city' => 'New York');

$serializedData = serialize($data);

echo $serializedData; 

在上面的例子中,$data 数组被序列化为一个字符串,并存储在 $serializedData 变量中。

2.反序列化(Unserialization): 使用 unserialize() 函数将序列化后的字符串重新转换为原始的数据结构或对象。

$serializedData = 'a:3:{s:4:"name";s:4:"John";s:3:"age";i:30;s:4:"city";s:8:"New York";}';

$unserializedData = unserialize($serializedData);

print_r($unserializedData);

在上面的例子中,$serializedData 字符串被反序列化为原始的数组,并存储在$unserializedData 变量中。

5.php魔术方法

PHP的魔术方法(Magic Methods)是一组特殊的方法,以双下划线(__)开头和结束命名的。

它们在对象的生命周期中被自动调用,用于执行特定的操作。这些魔术方法可以让开发者更好地控制和定制对象的行为

__construct(), 类的构造函数,创建对象时进行初始化操作
__destruct(),   类的析构函数,在对象被销毁(即失去对对象的所有引用)之前执行一些清理操作
__call(),            在对象中调用一个不可访问或不存在方法时调用
__callStatic(),  调用一个不可访问或不存在的静态方法时调用
__get(),            访问一个对象的不可访问或不存在属性时调用
__set(),            对不可访问属性进行赋值时调用
__isset(),         当对不可访问或不存在属性调用isset()或empty()时调用
__unset(),       当对不可访问或不存在属性调用unset()时被调用。
__sleep(),        执行serialize()之前,先会调用这个函数
__wakeup(),   执行unserialize()之后调用这个函数
__toString(),   类被当成字符串时的回应方法
__invoke(),     用于将一个对象作为函数直接调用时的行为定义。
__set_state(),设置对var_export() 函数所产生的字符串的进行反序列化操作时行为。
__clone(),       当clone 关键字复制一个对象时调用
__autoload(), 尝试加载未定义的类
__debugInfo(),   打印所需调试信息

php允许在变量后面加括号来调用方法

5.靶场

靶场环境搭建

网站:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场

这里用docker搭建

docker pull mcc0624/ser:1.8     #拉取镜像

docker images         #显示当前存储在系统本地的镜像

docker run -d -p 8002:80 c81     #运行镜像

docker ps     #列出所有正在运行的docker容器

访问IP地址:8002

192.168.168.128:8002

搭建完成

1.反序列化漏洞例题

该代码接收一个名为benben的参数然后将参数的值反序列化为对象再调用生成对象的displayVar方法

<?php
highlight_file(__FILE__);
error_reporting(0);
class test{
    public $a = 'echo "this is test!!";';
    public function displayVar() {
        eval($this->a);
    }
}

$get = $_GET["benben"];
$b = unserialize($get);
$b->displayVar() ;

?> 

test对象的displayVar方法会将自身的a变量传入eval方法中,造成代码执行
只要控制a的值,即可达到任意代码执行
而题目没有对序列化过程做任何干预,直接构造a的值进行序列化后传入即可

执行1.php

PHP在反序列化的时候,它只会反序列化属性,不会反序列化行为,因为我们可以发现在类实例化到对象的过程中,只有我们的属性产生了赋值,我们的方法是不变的

2.析构函数例题

执行1.php

3.__wakeup()例题

执行1.php

详解PHP反序列化漏洞 PHP反序列化学习序列化与反序列化定义常见使用情况常见的序列化格式反序列化中常见的魔术方法反序列化绕过protected和private绕过__wakeup绕过(CVE-2016-7124)引用利用16进制绕过字符过滤同名方法的利用绕过部分正则字符逃逸字符增多字符减少 序列化与反序列化 定义 序列化(串行化):是将变量转换为可保存或传输的字符串的过程; 反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用; 这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性; 常见的php 阅读详情

相关推荐

php 反序列化漏洞

什么是序列化 序列化即 将对象的状态信息转换为可以存储或传输的形式的过程 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象 简单来说,序列化就是把一个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台、安全的进行通信 。 反序列分为PHP反序列和java反序列化,下面就以PHP反序列化漏洞为切入点,讲述反序列化漏洞核心的原理,其他Java、Python等语言的反序列化漏洞,其原理基本相通。 PHP中的序列化和反序列化

渗透之路,攻防之间皆学问 6252

反序列化漏洞(PHP)

反序列化漏洞 0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更具维护性 0x02. 为什么会有序列化 序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构 0x03. 序列化和反序列化代码示例 <?php class User { public $username = 'admin'; public $password = '123456';

qq_42383069的博客 6800

PHP反序列化漏洞原理(附带pikachu靶场演示)

可以理解为程序在执行unserialize()函数是,自动执行了某些魔术方法(magic method),而魔术方法的参数被用户所控制(通过控制属性来控制参数),这就会产生安全问题。:也叫对象注入,就是当程序在进行反序列化时,会自动调用一些函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。要利用反序列化漏洞,必须向unserialize()函数传入构造的序列化数据(定义合适的属性值)。

m0_69043895的博客 1828

php反序列化漏洞(万字详解)

php反序列化万字文章详解,非常全面,并结合实际案例易于理解,包括pop链、字符串逃逸、session反序列化、phar反序列化、原生类的利用以及各种绕过方式。

永不落的梦想 8719

HALCON深度学习模型部署新选择:一份详细的OpenVINO 2021.4 LTS集成与配置避坑指南

本文详细介绍了如何将HALCON深度学习模型与OpenVINO 2021.4 LTS集成,提供环境配置、硬件加速优化及故障排除的实用指南。特别针对Intel独立显卡的AI加速器接口进行优化,帮助机器视觉工程师提升AI推理效率,适用于工业检测等高要求场景。

weixin_42531779的博客 234

UDS 诊断 - CommunicationControl(通信控制)(0x28)服务 诊断

字节参数名称字节值#1CommunicationControl(通信控制)请求SID0x28#2#3communicationType(通信类型)#4nodeIdentificationNumer(节点标识符)(高位字节)controlType 为 0x04 或 0x05 时,使用该参数#5nodeIdentificationNumer(节点标识符)(低位字节)controlType 为 0x04 或 0x05 时,使用该参数。

耳朵东金子千的博客 1810

PHP反序列化漏洞——漏洞原理及防御措施

序列化 将对象转换成字符串 反序列化 将特定格式的字符串转换成对象 什么是反序列化漏洞 PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可...

cldimd的博客 7237

企业数字化转型的 4A 架构指南:从概念解读到 TOGAF 阶段对应

4A企业架构是中国数字化转型实践中总结的简化框架,包含业务、应用、数据和技术四个架构层。它自上而下形成业务驱动应用的指导关系,自下而上构建技术支撑数据的实现路径,与国际标准TOGAF核心内容高度对应。该模型通过统一语言、战略对齐和系统梳理,有效连接业务需求与IT实施,已成为企业架构规划的实用工具。其分层结构清晰展示了从业务目标到技术落地的完整推导链,特别适合中国企业的数字化转型场景。

友莘居士的博客 2163

PHP反序列化漏洞原理

本篇文章主要讲解PHP反序列化漏洞原理

没有网络安全就没有国家安全 1349

YOLO26科研优化:多损失函数(EIoU、SIoU等)融合,让边界框回归精度再上台阶

将原有损失函数替换为我们编写的MultiLoss。例如,在bbox_loss。

LXY_LOVE36的博客 165

RK3399快速上手 | 01- 开发环境搭建(固件烧写、编译工具链安装、kernel编译)

一、编译工具链 编译工具链使用gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu。 下载地址: https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/ wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabi

Mculover666的博客(嵌入式) 8828

PHP反序列化漏洞原理及示例

本站转自行云博客https://www.xy586.top/ 文章目录PHP反序列化序列化与反序列化PHP魔法函数反序列化漏洞简介原理触发条件示例 PHP反序列化 序列化与反序列化 序列化说通俗点就是把一个对象变成可以传输的字符串。 序列化过程中还会对不同属性的变量进行不同方式的变化 public的属性在序列化时,直接显示属性名 protected的属性在序列化时,会在属性名前增加0x00*0x00,其长度会增加3 private的属性在序列化时,会在属性名前增加0x00classname0x00.

qq_41679358的博客 8077

ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

动态生成障碍物在机器人导航、碰撞避障算法测试、多机协同等领域应用广泛,可以帮助开发人员快速测试,本文介绍该技术并提供基于ROS Gazebo的实现

FRIGIDWINTER的博客 4883

PHP反序列化漏洞总结

程序未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,通过在参数中注入一些代码,从而达到代码执行,SQL 注入,目录遍历等不可控后果,危害较大。

未完成的歌~的博客 4689

一、C++反作弊对抗实战 (基础篇 —— 2.注册表注入DLL)

在Windows NT/XP操作系统中,当需要加载user32.dll的程序启动时,user32.dll会加载注册表键HLM\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_dlls下面列出的所有模块。

Koma的主页 1090

04 HCM CPI SF集成-员工集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 140

PHP反序列化漏洞学习总结

一直以来总是觉得对PHP反序列化漏洞的理解比较模糊,今天抽时间深入学习下PHP反序列化漏洞的成因以及利用方式,在此做一个总结。    参考链接:              http://bobao.360.cn/learning/detail/3193.html       http://blog.csdn.net/qq_32400847/article/details/538

Brucetg的博客 3622

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

PHP中的反序列化漏洞

PHP 反序列化漏洞也叫 PHP 对象注入,是一个常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell 等一系列不可控的后果。反序列化漏洞并不是 PHP 特有,也存在于 Java、Python 等语言之中,但其原理基本相通。PHP 中的序列化与反序列化,基本都是围绕和两个函数展开的。

哦 卷! 1312

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

php反序列化漏洞

Pop链(POP chain)是一种利用程序中已有的函数调用序列来构造恶意代码执行的技术。POP是指"Return-oriented Programming",即返回导向编程在计算机程序中,函数调用通常会将返回地址(Return Address)保存在栈上,以便在函数执行完毕后能够返回到调用者的正确位置。恶意攻击者可以通过修改栈上的返回地址,使程序执行到攻击者预先构造的恶意代码上。寻找程序中已有的可用函数调用序列,这些序列通常由一系列指令组成,每个指令执行完后会跳转到下一个指令。

Au_Wind的博客 2263

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

漏洞复现篇——PHP反序列化漏洞

简介 PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存在于Java、Python等语言之中,但其原理基本相通。 什么是序列化和...

爱国小白帽 4791

【反序列化漏洞-02】PHP反序列化漏洞实验详解

序列化:程序将对象状态转换为可存储或传输的字节序列的过程(即对象状态转换为可存储或者可传输的过程){序列化是对象转换为字符串的过程}反序列化:程序把存储或传输的字节序列恢复为对象的过程。{反序列化则是字符串转化为对象的过程}如果字符串客户端可控,就会造成web应用反序列化任意对象,严重的是在反序列化的过程中会触发一些可以执行的php代码,例如phpinfoPHP中的序列化与反序列化,基本都是围绕和两个函数展开的。在介绍这两个函数之前,我们可以先看一个简单的例子。

cc 3314
上一篇: csrf漏洞与ssrf漏洞
下一篇: 网络安全基础-1
lin___ying
博客等级 码龄4年 2333粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

lin___ying

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

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

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

打赏作者

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

抵扣说明:

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

余额充值