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

CTF-WEB-PHP魔法函数

serialize() 和 __sleep()

serialize() 函数会首先检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用, 然后才执行串行化(序列化)操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组

unserialize() 和 __wakeup()

unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup()方法,预先准备对象数据。但是这个wakeup()是可以被绕过的,

序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

eg:
$b = new Demo('fl4g.php');
echo serialize($b);         # 输出O:4:"Demo":1:{s:10:" Demo file";s:8:"fl4g.php";}

# 把Demo后的属性数量修改一下就能跳过,这里+是为了绕过php的preg_match 检查(可选)

$var = 'O:+4:"Demo":2:{s:10:" Demo file";s:8:"fl4g.php";}';


或者

C:4:"Demo":1:{s:10:" Demo file";s:8:"fl4g.php";}
O标识符代表对象类型,而C标识符代表类名类型。如果将O替换为C,则在反序列化时会将其解释为一个新的类名字符串,从而创建一个新的类而不是对象。因为这个新的类没有被序列化过,所以它没有任何属性或方法。这样一来,在反序列化时,__wakeup魔术方法就不会被自动调用。

__construct()

使用关键字new实例化对象时会自动调用构造方法

__destruct()

  • 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

  • 或者当php代码声明周期执行完毕结束后,会自动调用该方法。

  • 当对象被unset()后 ;系统会自动调用该方法。

  • 当对象被重新赋值后 ;系统会自动调用该方法。

call_user_func_array和call_user_func的区别

call_user_func接受一个函数名(字符串)作为第一个参数,后面可以跟随任意数量的参数,这些参数将被传递给回调函数

call_user_func_array以数组的形式接受参数,这使得它非常适合在你不确定回调函数需要多少个参数,或者参数是动态生成的场景下使用。


http://www.kler.cn/news/368209.html

相关文章:

  • itext自定义pdf
  • 多元线性回归【正规方程/sklearn】
  • iOS AVAudioSession 详解【音乐播放器的配置】
  • 让你的 IDEA 使用更流畅 | IDEA内存修改
  • 博客搭建之路:hexo增加搜索功能
  • [计算机网络]第一周
  • NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置
  • 洛谷 P2760 科技庄园(多重背包,二进制优化)
  • Cyber Weekly #30
  • 【语音转文本新体验】Windows部署Whisper Web结合内网穿透轻松远程转录——“cpolar内网穿透”
  • python爬虫基础篇:文本操作和二进制存储
  • 31个省份农业科技水平(农业技术创新或农业科技专利数据)2010-2022年
  • macport 多版本php快速切换自定义命令pvm shell脚本
  • java平方根计算 C语言指针变量
  • Mercury:一款网络元数据捕捉与安全分析工具
  • 计算机网络——有连接传输层协议TCP
  • 如何使用Qlik Sense Util
  • 使用 Cursor 和 Devbox 快速开发并上线 Gin 项目
  • ifftshift函数
  • 缓存放置文章调研
  • 二十二、Python基础语法(模块)
  • 通过企业架构蓝图(EA Blueprint)构建企业数字化转型之路
  • STM32 HAL 陶晶池串口屏使用
  • GEE引擎传奇UI界面修改教程
  • MybatisPlus入门(一)MybatisPlus简介
  • Java三大特性之一—— 封装