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.hqwc.cn/news/286016.html

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

相关文章

每日一题:LeetCode-LCR 016. 无重复字符的最长子串

每日一题系列&#xff08;day 15&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

【EI会议征稿】第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)

第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09; 2024 4th International Conference on Computer Network Security and Software Engineering 第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09;将于2024年2月…

kubernetesr安全篇之云原生安全概述

云原生 4C 安全模型 云原生 4C 安全模型&#xff0c;是指在四个层面上考虑云原生的安全&#xff1a; Cloud&#xff08;云或基础设施层&#xff09;Cluster&#xff08;Kubernetes 集群层&#xff09;Container&#xff08;容器层&#xff09;Code&#xff08;代码层&#xf…

SAP 特殊采购类80简介

前面我们已经测试特殊采购类40、70,我们今天测试一下特殊采购类80。 特殊采购类80:在替代工厂生产,在成品层维护特殊采购类,需求和收货在计划工厂完成,成品生产和组件采购在生产工厂完成。 80采购类也是我们在SAP系统中实现跨工厂需求传递的一种方式。它具有传递方式简单、…

鸿蒙OS:打破界限的操作系统新星

导言 鸿蒙OS&#xff08;HarmonyOS&#xff09;是华为公司为应对技术封锁而推出的分布式操作系统&#xff0c;其背后蕴含着华为构建全球数字生活愿景的雄心。本文将深入剖析鸿蒙OS的起源、核心特性&#xff0c;并展望其未来在数字生态中的角色。 1. 背景与起源 华为的…

RabbitMQ入门指南(二):架构和管理控制台的使用

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、RabbitMQ架构 二、RabbitMQ管理控制台的使用 1.Exchange交换机 2.Queue队列 3.绑定Exchange交换机和Queue队列 4.发送消息 5.数据隔离 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系统…

Python爬虫全解析

一.爬虫--requests 1.常见的爬虫 -通用爬虫: 抓取系统重要组成部分。抓取的是一整张页面数据。 -聚焦爬虫: 是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。 -增量式爬虫: 检测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。 2.requests模块 re…

信道编码的安全性理论

搞安全和密码的人&#xff0c;总有一个很头疼的问题&#xff1a;当一个方案安全性比较好时&#xff0c;效率就比较低&#xff1b;当提高效率后&#xff0c;安全性又会降低。我们总希望能找到一个平衡点。 信息安全理论中的保密容量&#xff08;secrecy capacity&#xff09;告…

AD20基础操作

1、编译检查项 需要重点检查的&#xff0c;设置为致命错误 点击Messages查看编译结果&#xff1a; 2、添加封装 快捷键M,选择X,Y移动选择对象 编辑偏移量后确定。 另一种快捷方式&#xff1a; CtrlD查看3D模型

【数据结构】树状数组算法总结

知识概览 树状数组有两个作用&#xff1a; 快速求前缀和 时间复杂度O(log(n))修改某一个数 时间复杂度O(log(n)) 例题展示 1. 单点修改&#xff0c;区间查询 题目链接 活动 - AcWing本活动组织刷《算法竞赛进阶指南》&#xff0c;系统学习各种编程算法。主要面向…

自助式可视化开发,ETLCloud的集成之路

自助式可视化开发 自助式可视化开发是指利用可视化工具和平台&#xff0c;使非技术人员能够自主创建、定制和部署数据分析和应用程序的过程。 传统上&#xff0c;数据分析和应用程序开发需要专业的编程和开发技能。但是&#xff0c;自助式可视化开发工具的出现&#xff0c;使…

《ThreadLocal使用与学习总结:2023-12-15》史上最详细由浅入深解析ThreadLocal

由浅入深全面解析ThreadLocal 目录 由浅入深全面解析ThreadLocal简介基本使用ThreadLocal与synchronized的区别ThreadLocal现在的设计&#xff08;JDK1.8&#xff09;ThreadLocal核心方法源码分析ThreadLocalMap源码分析弱引用与内存泄露&#xff08;内存泄漏和弱引用没有直接关…