代码审计-PHP反序列化漏洞

news/2024/5/5 11:33:43/文章来源:https://www.cnblogs.com/ZZslBl0g/p/16602044.html

什么是序列化

序列化可以实现将对象压缩并格式化,方便数据的传输和存储。
为什么要序列化?
PHP 文件在执行结束时会把对象销毁,如果下次要引用这个对象的话就很麻烦,所以就有了对象序列化,实现对象的长久存储,对象序列化之后存储起来,下次调用时直接调出来反序列化之后就可以使用了。
学习序列化要了解的基本内容。
类(Class): 类的定义包含了数据的形式以及对数据的操作。
对象:对象是类的实例。
方法:类中定义的函数。

<?php
//创建一个类 Testclass Test{ //定义 3 个属性,最后序列化后看一下这 3 个属性序列化后的结果。private $a = "private";public $b = "public";protected $c = "protected";} 
//创建一个对象,对象是类的实例。$test = new Test();
//序列化 test 这个对象$data = serialize($test);
//打印序列化后的对象echo $data;
?>

展示结果(前提条件,php只有再apache下可以运行,之前我创建了txt,发现无法运行,避免踩坑)
序列化之后的结果,每个字符都具有具体含义

O:4:"Test":3: {s:7:"Testa";s:7:"private"; s:1:"b";s:6:"public"; s:4:"*c";s:9:"protected";}

O Object 对象
4 名字长度为 4 Test(对象名称)
3 表示对象中存在3个属性

s:7:"Testa"; 变量名字
s:7:"private"; 值
  • s string 字符串
  • 7 变量名长度为7 private私有的,会在Testa前后添加\00 ,即\X00Test\X00a (因此长度为7)
  • s string 字符串
  • 7 变量的值长度为7 private 值
s:1:"b";
s:6:"public"
  • s string
  • 1 名字长度 1
  • b 变量名字
s:4:"*c";
s:9:"protected";
  • s string
  • 4 名字长度 4
  • *c 变量名字 \x00*\x00c

序列化的过程:
通过classTest创建一个对象,然后把这个对象进行序列化,打印出来

反序列化:

PHP 反序列化漏洞又叫做 PHP 对象注入漏洞,成因在于代码中的 unserialize() 接收的参数可控,从上面的例子看,这个函数的参数是一个序列化的对象,而序列化的对象只含有对象的属性,那我们就要利用对对象属性的篡改实现最终的攻击
代码如下:
(注意:Testa和*c的部分要留出空格来,与前面的的长度相符合)
输出要用var_dump而不是echo

<?php$data = 'O:4:"test":3:{s:7:" Test a";s:7:"private";s:1:"b";s:6:"public";s:4:" * c";s:9:"protected";}';
$free = unserialize($data);
var_dump($free);
?>

结果如下:

object(__PHP_Incomplete_Class)#1 (4) {["__PHP_Incomplete_Class_Name"]=>string(4) "test"[" Test a"]=>   //名字string(7) "private"  //值["b"]=>  //名字string(6) "public"   //值[" * c"]=> //名字string(9) "protected"   //值
}

反序列化造成漏洞的原因:

  • 反序列化一般都是用户传递过来恶意代码,通过反序列化执行
  • 反序列化的字符串用户可以控制
  • 内容长度改变以后,前面的长度也需要跟着改变

序列化-魔术方法

魔术方法介绍:
方法:类中定义的函数。
上面我们演示了如何进行序列化和反序列化,但是我们仅使用了属性,也就是变量,变量我们可以当
做数据来看待,而编程就是对数据进行一些列的操作和处理,操作和处理数据的过程我们一般通过函数来
定义,函数在面向对象编程中我们一般称之为方法,所以后续如果老师说到方法就等于说的是函数功能。
特殊的方法-魔术方法。
PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法,这些都是 PHP 内置的方法。
__construct 当一个对象创建时被调用,
__destruct 当一个对象销毁时被调用,
__wakeup() 使用 unserialize 时触发
__sleep() 使用 serialize 时触发
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用 isset()或 empty()触发
__unset() 在不可访问的属性上使用 unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象作为函数调用时触发

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

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

相关文章

世事无常,人生有定,此乃时也、运也、命也

参考: https://www.163.com/dy/article/H6NVOULE0528OPI5.html“万般皆由命,半点不由人。”半生已过,红尘辗转,才真正明白人的寿命与财富,在你来到人世间的那一刻上天就安排好了,半点由不得我们自己。正所谓“世事无常,人生有定,此乃时也、运也、命也!” 所谓命者。先…

三次握手,四次挥手

三次握手 连接建立阶段: 第一次握手:客户端的应用进程主动打开,并向服务端发出请求报文段。其首部中:SYN=1,seq=x。 第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。 第三次握手:客户端收到确认报文之后…

操作系统学习笔记4 | CPU管理 多进程图像

操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件。操作系统通过多进程图像实现对CPU的管理。所以多进程图像是操作系统的核心图像。操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件。而通过学习笔记3的简史回顾,操作系统通过多进…

Hadoop十九

HDFS API操作在Windows上操作hadoop,需要添加hadoop依赖,我的hadoop是3.3.1版本的,我用的依赖是3.2.0的,需要配置环境变量 PATH添加如下路径: 然后双击依赖中的一闪而过就是成功的。 在maven项目中添加如下依赖<dependencies><!-- https://mvnrepository.com/a…

框架-逻辑层(逻辑层简介和注册程序)

逻辑层简介 小程序逻辑层 小程序开发框架的逻辑层是使用JavaScript编写的。 逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈。 在 JavaScript 的基础上,微信做了一些修改,以方便地开发小程序。增加 App 和 Page 方法,进行程序和页面的注册。 增加 getApp和g…

德飞莱 C51 学习笔记

《电子元件基础教程》 :数字集成电路 从结构上分为 : TTL 型 和 CMOS 型 《跟我学数字电子技术》: 数字电路分为 组合逻辑电路 和 时序逻辑电路

golang中GOPATH、GOROOT、GOBIN不生效等相关问题

比较重要的三个配置:GOPATH、GOROOT、GOBIN GOPATH : go项目开发的工程目录 GOROOT: go安装所在的目录 GOBIN: go项目编译完二进制程序目录 不生效问题,其实应该好好检查是否上面相关路径配置是否正确 编辑vim ~/.bash_profile 添加以下3个配置export GOROOT="/usr/loca…

高性能服务器之事件处理模式

I/O模型 对于一个套接字上的输入操作,通常存在以下两个步骤:等待分组到达,被复制到内核缓冲区中 将数据从内核缓冲区复制到应用进程的缓冲区中对于上述过程,在 Unix 下有 5 中基本的 I/O 模型可以对其进行处理:阻塞式 I/O 非阻塞式 I/O I/O 复用 信号驱动 I/O 异步 I/O1. …

算法总结

1.每日温度题(一道关于栈的问题) 请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 输入: temperatures = [73,74,75,71,69,72,76,73] 输出…

国内可使用chatGPT的十三种方式

国内AI 1. 开放猫 Chat机器人https://mirrorchat.extkj.cn/ chat机器人&#xff1a; Chat机器人https://mirrorchat.extkj.cn/ 3.免费学习测试 免费学习测试https://chat.wuguokai.cn/#/chat/1683348236237 4.AI文本工具站 AI文本工具站一个用于提高工作效率的文本工具网站,应用…

ChatGPT Plus用户专享:86款高效功能插件,详尽安装与使用全攻略

在前天的文章中&#xff0c;我们介绍了 ChatGPT 开放的全新模式 Web Browsing&#xff08;网页浏览&#xff09;&#xff0c;启用后 ChatGPT 就可以开始上网&#xff0c;收集最新的互联网资料进行作答。 其他关于chatgpt使用方面&#xff1a;请访问&#xff1a; 链接&#xf…

ChatGPT自然语言处理的新里程碑

ChatGPT中文网是一个面向中国用户的聊天机器人网站&#xff0c;旨在为国内用户提供一个自然的环境、有趣、实用的聊天体验。它使用最新的自然语言处理技术来帮助用户更好地理解他们的聊天对话&#xff0c;还可以帮助用户解决日常生活中的问题&#xff0c;提供有趣的谈话内容以及…

国内版ChatGPT最全使用方法及使用用途技巧汇总

ChatGPT人工智能技术的出现确实会让一些人担心自己的工作会不会被取代。但实际上&#xff0c;人工智能技术只会替代那些可以被程序自动化的重复性、标准化、无脑力的工作&#xff0c;而对于需要人类创意、想象力和复杂思维的工作来说&#xff0c;AI人工智能技术的发展对于人类来…

ChatGPT和Midjourney王炸组合,开启AI新时代

目录 序言 一&#xff1a;使用ChatGPT进行对话 二&#xff1a;调用newbies robot 三&#xff1a;举例说明 四&#xff1a;付费和使用限制 序言 随着人工智能技术的不断发展&#xff0c;越来越多的人开始使用人工智能工具来创作图画。在这里&#xff0c;我将分享如何结合Ch…

一文带你读懂什么是ChatGPT?

文章目录 前言ChatGPT的发展历史ChatGPT初体验ChatGPT的未来展望提高聊天机器人的对话能力改进聊天机器人的生成能力提高聊天机器人的个性化能力加强聊天机器人的安全性 总结福利彩蛋 前言 橙子送书第1期&#xff01;文末参与活动&#xff0c;即可包邮到家。为即将或正在使用Ja…

【ChatGPT】使用大型语言模型 (LLM) 进行特定领域语言(DSL)生成

使用大型语言模型 (LLM) 进行特定领域语言(DSL)生成,markdown格式,10000字左右。大纲如下:背景介绍,LLM的核心能力,DSL的本质特征,怎样 使用LLM 结合外部知识和领域特定约束,通过 Backus-Naur Form(BNF) 表示进行学习,实现 DSL 的生成。给出具体的实验实例。 文章目录…

漫画:ChatGPT的应用场景有哪些?

第一&#xff0c;文案创作 ChatGPT可以通过用户输入的提示&#xff0c;创作出相应的文本内容。 媒体作者可以给ChatGPT提出要求&#xff0c;让ChatGPT根据某一主题生成的媒体文案。 广告策划人员可以把要推广的商品信息输入给ChatGPT&#xff0c;让ChatGPT针对此商品生成一段广…

手机版ChatGPT app如何在国内使用【附完整教程】

手机版ChatGPT app如何在国内使用【附完整教程】 今天是一个比较有爱的日子520&#xff0c;祝福每位饱子身体健康&#xff0c;万事如意&#xff0c;我理解这应该是最朴实最美好的祝福了&#xff0c;因为我始终认为身体是革命的本钱&#xff01;言归正传&#xff0c;Openai在202…

人人实现ChatGPT自由,手把手教你零撸部署自己聊天私服

我们知道chat gpt最近非常的火爆&#xff0c;朋友圈啊&#xff0c;短视频到处都是chat gpt身影。 但是网上看到各种教程资源&#xff0c;都是不是百分一百的免费&#xff0c;毫无保留教给你的&#xff0c;要么是卖账号 要么是割韭菜的。其实没有什么可以学习的&#xff0c;使用…