当前位置: 首页 > news >正文

反序列化漏洞2-魔术方法介绍与演示

一.魔术方法的介绍       

       函数是由开发人员编写,定义。PHP中内置了一系列的函数,如常规函数eval(),phpinfo

()等等。而面对对象中PHP官方设定也有特殊的方法----魔术方法,为了面对对象流程的便捷性

而设计。

       它和我们HTML代码中的事件有些相像,这个事件就是一个触发器,达到触发条件就会执行代

码。魔术方法和其相像,也是通过触发的方式去执行代码,它也指定了很多触发条件,只要达到了

触发条件就会执行代码。

       但是如果想要触发就要先执行定义,以下是一些PHP内置的魔术方法:

PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法,这些都是 PHP 内置的方法 
__construct 当一个对象创建时被调用,
__destruct 当一个对象销毁时被调用,
__wakeup() 使用 unserialize 时触发
__sleep() 使用 serialize 时触发
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用 isset()或 empty()触发
__unset() 在不可访问的属性上使用 unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象作为函数调用时触发
这些都是内置魔术方法,后面是触发条件更多魔术方法详见:https://www.php.net/manual/zh/language.oop5.magic.php
这些函数都需要被定义,定义其在触发后需要执行的代码。

二.魔术方法的演示

以下为演示代码:

<?php
//创建 test 类
class test{
//属性$varr1=free
public $varr1="free";
//自定义方法 echovarr1
public function echovarr1(){
echo $this->varr1." in echovarr1()<br>";
}
//以下是常用的魔术方法
public function __construct(){
echo "__construct 当一个对象创建时被调用<br>";
}
public function __destruct(){
echo "__destruct 当一个对象销毁时被调用<br>";
}
public function __toString(){
return "__toString 把类当作字符串使用时触发,返回值需要为字符串<br>";
}
public function __sleep(){
echo "__sleep 使用 serialize 时触发<br>";
return array('varr1');
}
public function __wakeup(){
echo "__wakeup 使用 unserialize 时触发<br>";
}
}
//实例化对象,调用__construct()方法,输出__construct
$xuegod = new test();
//调用 echovarr1()方法,输出 varr1 "free"
$xuegod->echovarr1();
//$xuegod 对象被当做字符串输出,调用__toString()方法,输出__toString
echo $xuegod;
//$xuegod 对象被序列化,调用__sleep()方法,输出__sleep
$s =serialize($xuegod);
//$s 首先会被反序列化,会调用__wake()方法,被反序列化出来的对象又被当做字符串,就会调用
_toString()方法。
echo unserialize($s);
//脚本结束会调用__destruct()方法,输出__destruct
//由于反序列化相当于又创建了一个对象,所以脚本结束后会输出两次__destruct
?>

我们创建一个magic.php:

我们浏览器访问:

URL:http://192.168.112.12/magic.php

可以看到和我们预想的一样,以上就是魔术方法的介绍。

http://www.dtcms.com/a/286746.html

相关文章:

  • 怎么自己搭建云手机
  • http与https的主要区别是什么?
  • java数据类型
  • 锂电池无线充电电路设计
  • 零碳园区势在必行!安科瑞EMS3.0助力园区低碳智慧升级
  • Excel导出实战:从入门到精通 - 构建专业级数据报表的完整指南
  • 如何使用 Jackson 处理 YAML
  • AE电源MDX 5K 10K 15K 20K 25K 30K手侧操作使用说明
  • 拉普拉斯方程傅里叶积分解法
  • @Primary 是做什么的?
  • CAD 约束求解:核心技术原理、流程及主流框架快速解析
  • A33-vstar笔记及资料分享:搭建交叉编译环境
  • 动态规划 + DFS + 记忆化!Swift 解 LeetCode 329 的实战笔记
  • 实战指南|智慧无人机安防系统搭建全流程解析
  • 记录DataGrip 2025.1.3破解失败后,无法重启问题修复
  • centos7安装MySQL8.4手册
  • Hive数据仓库工具
  • 甲状腺结节TI-RADS分类的多目标分类头任务深度学习模型评估报告
  • go语言学习之包
  • 新书推介 | 吉林大学出版教材《汽车智能辅助驾驶系统技术》,国产仿真工具链GCKontrol-GCAir教学应用
  • Python_2
  • math.h函数
  • 弱网测试
  • 跨域问题及解决方案
  • ChatGPT Agent:统一端到端Agentic模型的技术革新与行业影响
  • React + Mermaid 图表渲染消失问题剖析及 4 种代码级修复方案
  • 前端-CSS盒模型、浮动、定位、布局
  • 前端迟迟收不到响应,登录拦截器踩坑!
  • 比较含距离和顺序的结构相似性
  • 【EPLAN 2.9】许可证xx成功却显示红色叉,无法启动