用于对象注入的PHP serialize()

用于对象注入的PHP serialize(),php,object,serialization,code-injection,exploit,Php,Object,Serialization,Code Injection,Exploit,我目前正在分析名为PHP对象注入的PHP攻击方法,该方法允许由于unserialize()函数中未初始化的输入而修改已定义的对象 代码如下: <?php class foo {} class SuperClass {} $ss = 'O:3:"foo":2:{s:4:"test";b:1;s:2:"fg";O:10:"SuperClass":0:{}};'; print_r(unserialize($ss)); ?> 我的问题是,如何重新创建可以传递给serialize()

我目前正在分析名为PHP对象注入的PHP攻击方法,该方法允许由于unserialize()函数中未初始化的输入而修改已定义的对象

代码如下:

<?php

class foo {}
class SuperClass {}

$ss = 'O:3:"foo":2:{s:4:"test";b:1;s:2:"fg";O:10:"SuperClass":0:{}};';

print_r(unserialize($ss));

?>
我的问题是,如何重新创建可以传递给serialize()函数以创建相同输入字符串的对象结构?PHP不允许嵌套类,所以我对是否可以用serialize()生成这样的字符串感到困惑

以下是我的做法,但由于PHP不允许嵌套类,因此无法工作:

class foo {

    public $test = 1;
    public $fg = class SuperClass {

    }

}

echo serialize(new foo);

这些字段可能需要是类的实例

class foo {

    public $test = 1;
    public $fg = new SuperClass();
}

var_dump(serialize(new foo()));
除了语法之外,PHP7还提供匿名类功能

public $fg = new class() extends SuperClass {
                // some additional implementation here
}

因此,您可以添加稍后将在序列化字符串中显示的字段。在当前示例中,不存在任何

如果您想了解PHP将如何序列化这样的类结构,而这正是我假设您要问的问题,那么请像这样创建您的类

<?php

class SuperClass
{
    public $name = 'SuperClass';
}

class foo
{
    public $name = 'foo';
    public $test = 1;

}

$s = new SuperClass();
$f = new foo();

$s->fg = $f;

$ss = serialize($s);

echo $ss . PHP_EOL;

$hydrated = unserialize($ss);

print_r($hydrated);

您可以玩这个游戏,看看如何操作序列化字符串,将任何内容添加到字符串中,以使对象包含您想要的任何内容。

只是为了澄清您想将
$ss
非序列化($ss)
转换回对象,但它不工作?或者您试图重新创建什么?它不应该是这样的:public$fg=new SuperClass(){};您是否尝试拆分
newfoo
snd并尝试类似
$foo=newfoo()的操作;echo序列化($foo)PHP7允许匿名类非常感谢您!这正是我想要的。我不认为我可以在序列化之前修改已定义类中的属性。
<?php

class SuperClass
{
    public $name = 'SuperClass';
}

class foo
{
    public $name = 'foo';
    public $test = 1;

}

$s = new SuperClass();
$f = new foo();

$s->fg = $f;

$ss = serialize($s);

echo $ss . PHP_EOL;

$hydrated = unserialize($ss);

print_r($hydrated);
O:10:"SuperClass":2:{s:4:"name";s:10:"SuperClass";s:2:"fg";O:3:"foo":2:{s:4:"name";s:3:"foo";s:4:"test";i:1;}}

SuperClass Object
(
    [name] => SuperClass
    [fg] => foo Object
        (
            [name] => foo
            [test] => 1
        )

)