tgoop.com/poxek/4761
Create:
Last Update:
Last Update:
#php #десер #десериализация #deserialization
Десериализация — это процесс преобразования строки обратно в объект. В PHP для этого используются функции serialize()
и unserialize()
. Однако, если десериализовать данные из ненадёжных источников, это может стать серьёзной уязвимостью.
Как работает атака?
Рассмотрим пример кода, где используется класс с magic method (если и другие) __wakeup()
— он автоматически вызывается при десериализации объекта:
<?php
class Injection {
public $payload;
function __wakeup() {
eval($this->payload);
}
}
if (isset($_REQUEST['data'])) {
$obj = unserialize($_REQUEST['data']);
// Дальнейшая работа с $obj
}
?>
Злоумышленник может передать специально сформированный сериализованный объект через параметр data:
O:9:"Injection":1:{s:7:"payload";s:21:"phpinfo(); // payload";}
При десериализации будет выполнена команда
phpinfo()
, что может открыть доступ к конфиденциальной информации о веб сервере. Более сложные payload'ы могут привести к RCE и другим атакам.unserialize()
для входящих данных.data = unserialize($input, ['allowed_classes' => ['SafeClass']]);
Ваш опыт?
Сталкивались ли вы с такой багой на проектах? Какие рекомендации давали по защите? Делитесь своим опытом в комментариях)
Дополнительное чтиво
Небезопасная десериализация в PHP: Как создать собственный эксплойт - это статья от моего хорошего знакомого wr3dmast3r
Сериализация и десериализация: что это такое и как это работает - а это базовое чтиво по десеру в пыхе
PayloadsAllTheThings | PHP Deserialization - тут и так понятно что будет)