PHP 用于对象注入的 serialize()
PHP serialize() for object injection
我目前正在分析名为 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));
?>
产生以下输出:
foo Object
(
[test] => 1
[fg] => SuperClass Object
(
)
)
我的问题是,如何重新创建可以传递给 serialize() 函数以创建相同输入字符串的对象结构? PHP 不允许嵌套 类,所以我很困惑是否有可能用 serialize()?
生成这样的字符串
我会这样做,但是由于 PHP 不允许嵌套 类,它不会工作:
class foo {
public $test = 1;
public $fg = class SuperClass {
}
}
echo serialize(new foo);
可能字段需要是 class 的实例。
class foo {
public $test = 1;
public $fg = new SuperClass();
}
var_dump(serialize(new foo()));
替代您的语法,PHP7 提供匿名 classes 功能
public $fg = new class() extends SuperClass {
// some additional implementation here
}
因此您可以添加稍后将在序列化字符串中显示的字段。在当前示例中存在 none。
如果您想了解 PHP 如何序列化这样的 class 结构,这就是我假设您要问的问题,那么请像这样创建您的 classes
<?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
)
)
您可以尝试一下,了解如何操作序列化字符串以向字符串添加任何内容,从而使对象包含您想要的任何内容。
我目前正在分析名为 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));
?>
产生以下输出:
foo Object
(
[test] => 1
[fg] => SuperClass Object
(
)
)
我的问题是,如何重新创建可以传递给 serialize() 函数以创建相同输入字符串的对象结构? PHP 不允许嵌套 类,所以我很困惑是否有可能用 serialize()?
生成这样的字符串我会这样做,但是由于 PHP 不允许嵌套 类,它不会工作:
class foo {
public $test = 1;
public $fg = class SuperClass {
}
}
echo serialize(new foo);
可能字段需要是 class 的实例。
class foo {
public $test = 1;
public $fg = new SuperClass();
}
var_dump(serialize(new foo()));
替代您的语法,PHP7 提供匿名 classes 功能
public $fg = new class() extends SuperClass {
// some additional implementation here
}
因此您可以添加稍后将在序列化字符串中显示的字段。在当前示例中存在 none。
如果您想了解 PHP 如何序列化这样的 class 结构,这就是我假设您要问的问题,那么请像这样创建您的 classes
<?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
)
)
您可以尝试一下,了解如何操作序列化字符串以向字符串添加任何内容,从而使对象包含您想要的任何内容。