Web攻防10_PHP反序列化_概念魔术方法POP链构造

文章目录

  • 1、什么是反序列化操作? - 类型转换
  • 2、常见PHP魔术方法- 对象逻辑
      • 魔术方法概念
      • 常见魔术方法
      • 魔术方法与反序列化漏洞
  • 3、反序列化安全漏洞
      • 原理:
      • 漏洞探针
      • 漏洞危害
  • 4、反序列化漏洞利用- POP链构造
      • 反序列化常见起点
      • 反序列化常见跳板
      • 反序列化常见终点
      • POP链构造练习:

请添加图片描述

1、什么是反序列化操作? - 类型转换

- PHP & JavaEE & Python

序列化:将对象转换为数组或字符串等格式

反序列化:将数组或字符串等格式转换成对象

相关函数

serialize() //将对象转换成一个字符串

unserialize() //将字符串还原成一个对象

为什么要序列化(将对象转换为字节序列字符串格式)?

  1. 要将对象状态保存在文件或数据库中时,无法直接保存,需要将对象进行序列化,读取时反序列化
  2. 要将对象进行远程传输时(如前后端交互发送数据),将字符化的数据进行传输,接收后进行反序列化

2、常见PHP魔术方法- 对象逻辑

魔术方法概念

一个类中自带的特殊的方法,可以不需要主动调用,会在程序运行的一些特殊时刻自动触发。

魔术方法名称不可更改,但是可以重写。

常见魔术方法

  • __construct(): 在实例化一个对象时自动调用,用于对象的初始化操作。
  • __destruct(): 在对象被销毁时自动调用,用于执行清理操作。
  • __get($property): 在访问一个不可访问的属性时自动调用,用于获取属性的值。
  • __set($property, $value): 在给一个不可访问的属性赋值时自动调用,用于设置属性的值。
  • __isset($property): 在对不可访问的属性使用 isset() 或 empty() 时自动调用,用于判断属性是否已设置。
  • __unset($property): 在对不可访问的属性使用 unset() 时自动调用,用于销毁属性。
  • __call($method, $arguments): 在调用一个不可访问的方法时自动调用,用于动态调用方法。
  • __callStatic($method, $arguments): 在调用一个不可访问的静态方法时自动调用,用于动态调用静态方法。
  • __toString(): 在将对象以字符串形式输出时自动调用,用于自定义对象的字符串表示。
  • __invoke(): 在将对象作为函数调用时自动调用,用于将对象作为可调用的函数。
  • __wakeup(): 在对象被反序列化时自动调用,用于对象的重新初始化操作,与反序列化漏洞相关。
  • __set_state($properties): 在使用 var_export() 导出一个对象时调用,用于自定义对象的导出。
  • __clone(): 在对象被克隆时自动调用,用于处理对象的深拷贝。
  • __sleep(): 在对象被序列化时自动调用,用于返回需要被序列化的属性列表。
  • __autoload($class): 在使用未定义的类时自动调用,用于自动加载类文件。
  • __debugInfo(): 在调用 var_dump() 时自动调用,用于自定义对象的调试信息。

魔术方法与反序列化漏洞

在PHP中,对象的序列化和反序列化通常会触发魔术方法的调用,特别是__wakeup()__destruct() 方法。

  • __wakeup(): 在对象被反序列化时自动调用,用于对象的重新初始化操作。如果未正确实现,恶意用户可以在对象重新初始化时执行恶意代码,导致安全漏洞。
  • __destruct(): 在对象被销毁时自动调用,用于执行清理操作。如果未正确实现,恶意用户可以在对象销毁时执行恶意代码,导致安全漏洞。

因此,开发者在编写具有反序列化功能的PHP应用程序时,如果没有正确安全的实现相关魔术方法,就会被恶意用户利用反序列化漏洞来执行不受控制的代码。

3、反序列化安全漏洞

原理:

未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

示例漏洞:

<?phpclass B{public $cmd='ipconfig';public function __destruct(){system($this->cmd);}}//函数引用,无对象创建触发魔术方法unserialize($_GET['x']);

漏洞探针

反序列化漏洞一般经常通过白盒审计发现,发现后可能会公开

在黑盒中几乎不可能发现未知的反序列化漏洞,只能通过目标的技术栈类型及版本来找到有公开过的反序列化漏洞,再通过工具来利用。

漏洞危害

  • 远程代码执行(RCE): 恶意用户可以利用反序列化漏洞来执行任意代码,包括远程命令执行,这可能导致服务器被完全控制。
  • 敏感信息泄露: 攻击者可以利用反序列化漏洞来访问和泄露应用程序中的敏感信息,例如数据库凭据、会话令牌等。
  • 拒绝服务(DoS): 恶意用户可以利用反序列化漏洞来触发服务崩溃或资源耗尽,导致拒绝服务攻击,使应用程序不可用。
  • 提权: 如果应用程序以特权权限运行,攻击者可以利用反序列化漏洞来提升其权限,例如从普通用户权限提升到管理员权限。

4、反序列化漏洞利用- POP链构造

POP:面向属性编程(Property-Oriented Programing)常用于上层语言构造特定调用链的方法,序列化攻击都在PHP魔术方法中出现可利用的漏洞,因自动调用触发漏洞,但如关键代码没在魔术方法中,而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系起来。

反序列化常见起点

  • __wakeup(): 在对象被反序列化时自动调用,用于对象的重新初始化操作,与反序列化漏洞相关。

  • __destruct(): 在对象被销毁时自动调用,用于执行清理操作。

  • __toString(): 在将对象以字符串形式输出时自动调用,用于自定义对象的字符串表示。

反序列化常见跳板

  • __get($property): 在访问一个不可访问的属性时自动调用,用于获取属性的值。
  • __set($property, $value): 在给一个不可访问的属性赋值时自动调用,用于设置属性的值。
  • __isset($property): 在对不可访问的属性使用 isset() 或 empty() 时自动调用,用于判断属性是否已设置。

反序列化常见终点

  • __call($method, $arguments): 在调用一个不可访问的方法时自动调用,用于动态调用方法。
  • call_user_func() 一般php代码执行会选择这里
  • call_user_func_array() 一般php代码执行会选择这里

构造pop链时去掉不用改变或不可改变的内容,将所需修改内容保留修改即可

POP链构造练习:

CTFSHOW-反序列化题目254~258

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

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

相关文章

html单页使用vue

html单页使用vue <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0, shrink-to-fitno, minimum-scale1.0, maximum-scale1.0, user-scalableno&q…

LeetCode 19. 删除链表的倒数第 N 个结点

LeetCode 19. 删除链表的倒数第 N 个结点 1、题目 力扣题目链接&#xff1a;19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a; head [1,2,3,4,5], n 2 输出&am…

LeetCode 678——有效的括号字符串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 需要两个栈&#xff0c;一个用来保存左括号所在的位置索引&#xff0c;一个用来保存星号所在的位置索引。 从左往右遍历字符串&#xff0c;如果是左括号或者星号&#xff0c;则将位置索引分别入栈&#xff0c;如…

ELK——日志处理界的瑞士军刀

目录 引言 一、ELK简介 &#xff08;一&#xff09;基本概述 1.Elasticsearch服务 2.Logstash服务 2.2 logstash关键组件 2.2 logstash数据流向 3.Kibana服务 &#xff08;二&#xff09;ELK工作流程 &#xff08;三&#xff09;ELK的应用价值 二、部署搭建ELK &…

【Web】NSSRound#1-20 Basic 刷题记录(全)

目录 [NSSRound#1 Basic]basic_check [NSSRound#1 Basic]sql_by_sql [NSSCTF 2nd]php签到 [NSSCTF 2nd]MyBox [NSSCTF 2nd]MyBox(revenge) [NSSCTF 2nd]MyHurricane [NSSCTF 2nd]MyJs [NSSRound#3 Team]This1sMysql [NSSRound#3 Team]path_by_path [NSSRound#…

Spring MVC 中的适配器模式

文章目录 Spring MVC 中的适配器模式为什么不直接调用&#xff1f;解决方案一&#xff1a;统一 Controller解决方案二&#xff1a;使用适配器模式DispatcherServlet 对 Adpater 的使用 Spring MVC 中的适配器模式 为什么不直接调用&#xff1f; DispatcherServlet 为什么不直…

【入门】时钟旋转

时间限制 : 1 秒 内存限制 : 128 MB 时钟上面的时针从m时走到n时旋转了多少度&#xff1f;&#xff08;m<n&#xff0c;且m和n都是1~12之间的整数&#xff09; 输入 2个整数m和n 输出 一个整数代表时针旋转的度数 样例 输入 1 4 输出 90 提示 基础问题 #includ…

Python爬取天气信息,并进行语音播报

1、涉及的主要库 requests&#xff1a;requests 是一个Python的HTTP库&#xff0c;用于发送HTTP请求和处理响应。它是基于Python的 urllib 和 httplib 库的封装&#xff0c;提供了更加简洁、易用的接口&#xff0c;使得发送HTTP请求变得更加方便。你可以使用 requests 库来获取…

SQL语法 case when语句用法讲解

CASE WHEN解释 &#xff1a; SQL中的CASE WHEN语句是一种条件表达式&#xff0c;它允许你根据不同的情况返回不同的值。CASE WHEN通常用于SELECT语句中&#xff0c;用于创建新的列&#xff0c;该列的值取决于其他列的值。CASE WHEN可以用于任何可以使用表达式的地方。 大致概…

JavaScript模块化:CommonJS、AMD与ES模块化

JavaScript模块化&#xff1a;CommonJS、AMD与ES模块化 随着Web应用程序变得越来越复杂&#xff0c;JavaScript代码的组织和管理变得越来越重要。为了解决这个问题&#xff0c;JavaScript社区引入了模块化编程的概念。本文将详细介绍三种主要的JavaScript模块化规范&#xff1…

二叉树和数据结构

小红的完全二叉树构造 题目描述 小红想构造一个总共 n 个节点完全二叉树&#xff0c;该二叉树满足以下两个性质&#xff1a; 1. 所有节点的权值值为 1 ~ n 的一个排列。 2. 除了根节点以外&#xff0c;每个节点的权值和它父亲的权值的乘积为偶数。 请你帮小红构造出这个二叉树…

three.js捋文档的记录笔记(五):threejs引入

地址1&#xff1a;http://www.webgl3d.cn/pages/aac9ab/ 地址2&#xff1a;http://www.webgl3d.cn/Three.js/ &#xff08;作者&#xff1a;郭隆邦 该说不说 大佬真牛 整的教程通俗易懂还详细&#xff09; 本地静态服务器 vscode配置live-server插件 在官网案例里打开对应.ht…

K8S一 k8s基础知识及实战

一 K8S 概览 1.1 K8S 是什么&#xff1f; K8S官网文档&#xff1a;https://kubernetes.io/zh/docs/home/ K8S 是Kubernetes的全称&#xff0c;源于希腊语&#xff0c;意为“舵手”或“飞行员”&#xff0c;官方称其是&#xff1a;用于自动部署、扩展和管理“容器化&#xff08…

软考 系统架构设计师系列知识点之大数据设计理论与实践(5)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;4&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第3节 Lambda架构 19.3.1 Lambda架构对大数据处理系统的理解 Lambda架构由Storm的作者Nathan Marz提出&…

目标检测与图像分类的区别(概念)

目标检测和图像分类是计算机视觉领域的两个重要任务&#xff0c;它们有一些关键的区别&#xff1a; 1、任务目标 图像分类&#xff1a;图像分类的任务是将输入的图像分为不同的类别&#xff0c;通常是预定义的类别集合。在这种任务中&#xff0c;算法的目标是确定图像中包含的…

伺服系统中电机磁极偏角自学习的实现方案

一、 电机磁极偏角自学习原理简述 要知道磁极偏角&#xff0c;首先要明确的是磁极角&#xff0c;在我个人的理解里磁极角就是park和Ipark变换里所需的电角度&#xff0c;我们的矢量控制方法是定磁链的&#xff0c;就是要保证两相同步旋转坐标系的Id轴和三相静止坐标系的A轴要重…

45---M.2 SSD电路设计

视频链接 M.2 SSD硬件电路设计01_哔哩哔哩_bilibili M.2 SSD电路设计 1、M.2简介 1.1、M.2基本介绍 M.2接口也叫NGFF&#xff0c;英文全称Next Generation Form Factor。M.2接口是为超极本&#xff08;Ultrabook&#xff09;量身定做的新一代接口标准&#xff0c;是Intel推…

nginx优化总结及系统内核优化

一、nginx优化 1. 性能优化&#xff1a; 需求内容实现IO多路复用use epoll;设置工作进程数worker_processes 与CPU数量相同或auto;工作进程静态绑核worker_cpu_affinity设置并发worker_connections worker_rlimit_nofile连接保持超时keepalive_timeout 服务器超时时间 [客户端…

2024年150道高频Java面试题(二十八)

55. 解释一下 Java 中的等待/通知机制。 Java中的等待/通知机制是线程间通信的一种方式&#xff0c;它通过Object类的三个方法来实现&#xff1a;wait(), wait(long timeout), 和 notify(), 以及 notifyAll()。 wait(): 当一个线程调用一个共享对象的 wait() 方法时&#xff…

Java实现二叉树(下)

1.前言 http://t.csdnimg.cn/lO4S7 在前文我们已经简单的讲解了二叉树的基本概念&#xff0c;本文将讲解具体的实现 2.基本功能的实现 2.1获取树中节点个数 public int size(TreeNode root){if(rootnull){return 0;}int retsize(root.left)size(root.right)1;return ret;}p…