如何深入理解网鼎杯2020朱雀组phpweb中的php反序列化漏洞?

摘要:作为一个学习ctf时间不长的萌新,之前所做的反序列化题目都是一知半解,只知道这种题目都是一堆class,找eval当链尾,然后组成pop链最后有个执行unserialize的地方,这种题才是php反序列化题目。本题作为一个简单的变式,对我对
作为一个学习ctf时间不长的萌新,之前所做的反序列化题目都是一知半解,只知道这种题目都是一堆class,找eval当链尾,然后组成pop链最后有个执行unserialize的地方,这种题才是php反序列化题目。本题作为一个简单的变式,对我对反序列化的理解有很大的帮助。 首先题目是一个不停刷新的页面,buu靶场没法dirsearch扫只能抓包看看有什么信息,发现post传了两个参数,func=data&p=Y-m-d h:i:s a,这里就可以猜测func是调用的函数名,p是函数的参数,传func=system&p=ls /回显hacker,显然是被过滤了,改变参数仍然回显hacker,那么过滤的就应该是函数名。我们利用文件读取函数来读源文件源码 func=readfile&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..."); } } ?> 简单进行代码审计,发现gettime函数就是一个执行命令的函数,要给call_user_func函数传func和p参数,func就是要用的函数名,p是参数。然后一个test类里面有gettime函数,两个传参,两个判断后执行gettime 首先只利用最后两个判断执行命令肯定是行不通的,因为黑名单几乎把所有能用的执行命令的函数全部过滤了。所以这里就要用到反序列化,在最后两个判断中利用第二个gettime函数来unserialize即可。
阅读全文