PHP serialize () для внедрения объекта

В настоящее время я анализирую метод эксплуатации PHP, который называется PHP Object Injection, который позволяет модифицировать уже определенные объекты из-за неанизированного ввода в функцию 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);

0

Решение

Если вы хотите увидеть, как 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
)

)

Вы можете поиграть с этим, чтобы увидеть, как манипулировать сериализованной строкой, чтобы добавить любое содержимое в строку, чтобы объекты содержали все, что вы хотите.

3

Другие решения

Вероятно, поля должны быть экземпляром класса.

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
}

Таким образом, вы можете добавить поля, которые позже будут представлены в сериализованной строке. В текущем примере нет ни одного.

0

По вопросам рекламы [email protected]