【问题标题】:PHP serialize() for object injectionPHP serialize() 用于对象注入
【发布时间】:2016-03-23 22:28:17
【问题描述】:

我目前正在分析一种称为 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);

【问题讨论】:

  • 只是为了澄清你想将$ssunserialize($ss) 转换回对象并且它不起作用?或者你想重建什么?
  • 不应该是这样的:public $fg = new SuperClass() {};
  • 您是否尝试拆分new foo snd 尝试类似$foo = new foo(); echo serialize($foo);
  • PHP7 允许匿名类

标签: php object serialization code-injection exploit


【解决方案1】:

如果你想看看 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);

这会产生以下输出

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
        )

)

您可以使用它来查看如何操作序列化字符串以向字符串添加任何内容以使对象包含您想要的任何内容。

【讨论】:

  • 非常感谢!这正是我一直在寻找的。没想到我实际上可以在序列化之前修改已定义类中的属性。
【解决方案2】:

可能字段需要是类的实例。

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
}

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

【讨论】:

    猜你喜欢
    • 2013-03-14
    • 2023-03-12
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多