WEB渗透—PHP反序列化(四)

Web渗透—PHP反序列化        课程学习分享(课程非本人制作,仅提供学习分享)


靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场

课程地址:PHP反序列化漏洞学习_哔哩哔_bilibili


七、wakeup和sleep

1.__sleep()

序列化serialize()函数会检查类中是否存在一个魔术方法__sleep()

如果存在,该方法会先被调用,然后才执行序列化操作。

此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。

如果该方法未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误。

<?php
class User {const SITE = 'uusama';public $username;public $nickname;private $password;public function __construct($username, $nickname, $password){$this->username = $username;$this->nickname = $nickname;$this->password = $password;}public function __sleep(){return array('username', 'nickname');  //__sleep()执行返回需要序列化的变量名,过滤掉password变量}
}
$user = new User('a', 'b', 'c');
echo serialize($user);             //serialize()只序列化sleep返回的变量
?>

触发时机:序列化serialize()之前

功能:对象被序列化之前触发,返回需要被序列化存储的成员变量,删除不必要的属性

参数:成员属性(return array)

返回值:需要被序列化存储的成员属性('username','nickname'

2.__sleep()例题

通过审计代码,发现通过benben参数传入的值会赋值传给$cmd,而当执行序列化前会先执行__sleep(),只返回username成员属性,通过system()函数包含,所以可以直接传入命令进行执行。

3.__wakeup()

unserialize()会检查是否存在一个__wakeup()方法

如果存在,则会先调用__wakeup()方法,预先准备对象需要的资源

预先准备对象资源,返回void,常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。

__wakeup()在反序列化unserialize()之前;__destruct()在反序列化unserialize()之后。

<?php
class User {const SITE = 'uusama';public $username;public $nickname;private $password;private $order;public function __wakeup(){$this->password = $this->username;   //反序列化之前触发wakeup,给password赋值}
}
$user_ser = 'O:4:"User":2:{s:8:"username";s:1:"a";s:8:"nickname";s:1:"b";}'; //字符串中没有定义password
var_dump(unserialize($user_ser));        //userialize()结果包含password的值
?>

触发时机:反序列化unserialize()之前

功能:(无)

参数:(无)

返回值:(无)(包含password的赋值)

4.__wakeup()

解题代码:
<?php
class User {public $username = "whoami";
}
$user_ser = new User();
echo serialize($user_ser);
?>输出结果:
O:4:"User":1:{s:8:"username";s:6:"whoami";}

通过审计代码,发现通过benben参数传入值会直接赋值给$user_ser,并反序列化$user_ser,所以我们需要向benben参数内传入序列化值。而反序列化被调用前会先执行__wakeup(),调用username成员属性,通过system()函数包含,所以我们要通过序列化给username成员变量赋值传入系统命令。


八、toString和invoke

1.__toString()

表达方式错误导致魔术方法触发(把对象当成字符串调用时触发)

常用于构造POP链接

<?php
class User {var $benben = "this is test!!";public function __toString(){return '格式不对,输出不了!';}
}
$test = new User() ;  //把类User实例化宁赋值给$test,此时$test是个对象
print_r($test);       //调用对象可以使用print_r或者var_dump
echo $test;
?>

触发时机:把对象当成字符串调用

功能:(无)

参数:(无)

返回值:(无)

如果使用echo或者print只能调用字符串的方式去调用对象,即把对象当成字符串使用,此时自动触发toString()

2.__invoke()

格式表达错误导致魔术方法触发(把对象当成函数调用时触发)

<?php
class User {var $benben = "this is test!!";public function __invoke(){echo  '它不是个函数!';}
}
$test = new User() ;     //把类User实例化并赋值给$test为对象
echo $test ->benben;     //正常输出对象里的值benben
echo $test() ->benben;   //加()是把test当成函数test()来调用,此时触发invoke()
?>

触发时机:把对象当成函数调用

功能:(无)

参数:(无)

返回值:(无)

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

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

相关文章

使用 React 实现自定义数据展示日历组件

目录 背景实现日历组件父组件数据 效果最后 背景 项目中需要实现一个日历组件&#xff0c;并且需要展示月&#xff0c;日所对应的数据&#xff08;因为项目需求问题&#xff0c;就不统计年数据总量&#xff09;。网上找了一堆&#xff0c;基本都不大符合项目需求&#xff0c;且…

OpenHarmony鸿蒙原生应用开发,ArkTS、ArkUI学习踩坑学习笔记,持续更新中。

一、AMD处理器win10系统下&#xff0c;DevEco Studio模拟器启动失败解决办法。 结论&#xff1a;在BIOS里面将Hyper-V打开&#xff0c;DevEco Studio模拟器可以成功启动。 二、ArkTS自定义组件导出、引用实现。 如果在另外的文件中引用组件&#xff0c;需要使用export关键字导…

3ds max软件中的一些常用功能分享!

3ds max软件有很多小伙伴反馈说&#xff0c;明明有很多3ds max教程资料。却不知道如何入门3dmax。 掌握3dmax基本功能是开始使用3dmax的基础之一&#xff0c;所以&#xff0c;小编带大家盘点一下3dmax常用操作。 3dmax常用功能介绍如下&#xff0c;快快跟着小编一起看起来。 1…

预测性维护在汽车制造行业中的应用

汽车制造行业是一个高度复杂和精细化的领域&#xff0c;依赖于各种设备来完成生产流程。这些设备包括机械装配线、焊接机器人、喷涂设备、传送带等。然而&#xff0c;这些设备在长时间运行中不可避免地会遇到各种故障&#xff0c;给生产进程带来延误和成本增加。为了应对这一挑…

LeetCode Hot100 79.单词搜索

题目&#xff1a; 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Button按钮组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Button按钮组件 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、Button按钮组件 Button 组件也是基础组件之一&#xff0c;和其它基础组件不…

Linux之grep、sed、awk

目录 1.grep 2.sed 3.awk 1.grep grep 擅长过滤查找&#xff0c;按行进行过滤 例&#xff1a; 当有用户对我们的主机进行爆破攻击时&#xff0c;我们可以使用grep将 ip 查找出来&#xff0c;进行封锁等处理 在 /var/log 目录下的 secure 文件中存放在用户登录连接信息&am…

自动化测试成本高效果差,意义在哪?

自动化测试的成本高效果差&#xff1f;首先这个结论就太过武断了一些。 任何技术都需要放到适合的地方去使用&#xff0c;否则一定是达不到理想的效果的。举例大炮打蚊子&#xff0c;同样是成本高效果差&#xff0c;难道大炮就没有存在的意义了吗&#xff1f; 当然不是&#…

ATKXCOM串口助手接受中文字符乱码问题

中文乱码大多是编码格式问题&#xff0c;如心知天气API返回的数据编码格式为UTF-8格式&#xff0c;同理串口调试助手需要更改为对应的编码格式&#xff0c;正点原子的串口调试助手具有多种编码格式可以更改。 PS:点击左下角设置图标即可设置

OpenAI发布AGI安全风险框架!董事会可随时叫停GPT-5等模型发布,奥特曼也得乖乖听话

OpenAI 再次强调模型安全性&#xff01;AGI 安全团队 Preparedness 发布模型安全评估与监控框架&#xff01; 这两天关注 AI 圈新闻的小伙伴们可能也有发现&#xff0c;近期的 OpenAI 可谓进行了一系列动作反复强调模型的“安全性”。 前有 OpenAI 安全系统&#xff08;Safety…

工业镜头常见的类型

在机器视觉中&#xff0c;工业镜头作为机器视觉系统的核心部件&#xff0c;常常需要和工业相机搭配使用。工业镜头&#xff0c;属于一种光学系统。光学系统是指由透镜、反射镜、棱镜和光阑等多种光学元件按一定次序组合成的系统。那么工业镜头都有哪些类型&#xff1f; 一、按照…

搭建APP应用程序如何选择服务器

Hello&#xff0c;各位同学们好&#xff01;我是咕噜铁蛋&#xff0c;我经常收到许多关于如何搭建APP的询问。其中&#xff0c;如何选择服务器是许多初创企业和开发者经常面临的问题。带着这些问题我也通过一些科技手段收集整理了些知识&#xff0c;今天我就和大家来来探讨如何…

BKP 备份寄存器 RTC 实时时钟-stm32入门

这一章节我们要讲的主要内容是 RTC 实时时钟&#xff0c;对应手册&#xff0c;是第 16 章的位置。 实时时钟这个东西&#xff0c;本质上是一个定时器&#xff0c;但是这个定时器&#xff0c;是专门用来产生年月日时分秒&#xff0c;这种日期和时间信息的。所以学会了 STM32 的…

HTML + JavaScript 实现网页录制音频与下载

HTML JavaScript 实现网页录制音频与下载 HTML JavaScript 实现网页录制音频与下载简介getUserMediaMediaRecorder获取和处理音频流实现音频的录制和播放音频效果的处理实时语音通话的应用兼容性和 Latency 问题 项目代码运行实例参考源码下载 HTML JavaScript 实现网页录制…

银行测试:第三方支付平台业务流,功能/性能/安全测试方法

1、第三方支付平台的功能和结构特点 在信用方面&#xff0c;第三方支付平台作为中介&#xff0c;在网上交易的商家和消费者之间作一个信用的中转&#xff0c;通过改造支付流程来约束双方的行为&#xff0c;从而在一定程度上缓解彼此对双方信用的猜疑&#xff0c;增加对网上购物…

【lesson18】MySQL内置函数(1)日期函数和字符串函数

文章目录 日期函数函数使用具体使用案例建表插入数据建表插入数据 字符串函数函数使用具体使用案例建表插入数据测试 日期函数 函数使用 获得年月日&#xff1a; 获得时分秒&#xff1a; 获得时间戳&#xff1a; 获得现在的时间&#xff1a; 在日期的基础上加日期&#xf…

C++ Qt开发:TableWidget表格组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍TableWidget表格组件的常用方法及灵活运用。 …

基于python的leetcode算法介绍之递归

文章目录 零 算法介绍一 简单示例 辗转相除法Leetcode例题与思路[509. 斐波那契数](https://leetcode.cn/problems/fibonacci-number/)解题思路&#xff1a;题解&#xff1a; [206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)解题思路&#xff1a;题解&…

Jmeter中使用py插件

-安装插件 1、下载插件jython-standalone-2.7.0.jar到jmeter的lib\ext目录下 链接&#xff1a; https://pan.baidu.com/s/13ZXtUwoQEV62M98GaIR26w 提取码&#xff1a;ioyk 2、重启jmeter&#xff0c;查看是否生效&#xff0c;如果这个语言有python的选项说明可以了&#xf…

VMware虚拟机安装Linux操作系统

1.CentOS 7安装 软件选择&#xff0c;安装桌面系统 2.配置虚拟机网卡 3.连接Xshell