【发布时间】: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);
【问题讨论】:
-
只是为了澄清你想将
$ss和unserialize($ss)转换回对象并且它不起作用?或者你想重建什么? -
不应该是这样的:public $fg = new SuperClass() {};
-
您是否尝试拆分
new foosnd 尝试类似$foo = new foo(); echo serialize($foo); -
PHP7 允许匿名类
标签: php object serialization code-injection exploit