Всем доброго времени суток. Побывал на BlackHat USA в этом году, теперь думаю медленно выкатывать интересные доклады сюда.
Сегодняшний наш топик посвящается новой PHP-уязвимости. Ну т.е. как новой, данная уязвимость является логичным продолжением PHP Unserialization Vulnerability, правда теперь она позволяет провести RCE.
Теперь давайте поговорим про обертки:
Большинство файловых операций в PHP позволяют использовать различные обертки, такие как data://, zlib:// или php:// при доступе к файлу. Некоторые из этих оберток часто используются для получения удаленного доступа к файлам. Для примера: обертка используются, чтобы слить исходных код, который в другом случае просто исполняется.
Так в чем же кроется смысл, если все это уже давно известная инфа?
А дело в том, что никто не обращал внимания на phar:// обертку. Вы можете спросить у меня:"Yuki, ты шо ебаннутый? Что интересного в Phar? (PHP Archive)"
А я отвечу тебе мой дорогой %username%, что там содержаться метаданные в формате serial3.
Давайте создадим файл Phar и добавим объект с некоторыми метаданными:
Если мы посмотрим на наш test.phar, который мы только что создали, то увидим наш объект, который хранится как сериализованная строка.
Инъекция PHP-объекта:
Если теперь с нашим Phar выполняется файловая операция с помощью phar: // , то его сериализованные метаданные уже не являются таковыми. А это значит, что наш заинжекченный объект загружается в область приложения. А теперь самое интересное, мой дорогой %username%. Если это приложение имеет класс с именем AnyClass, и у него есть магический метод __destruct () или __wakeup (), то эти методы автоматически вызываются. Это означает, что мы можем запускать любой деструктор или метод пробуждения в коде PHP - приложения. Самый худший в данном случае исход, если данные методы работают с введенными пользовательскими данными, так как это может привести к дальнейшим уязвимостям.
Использование
1) Хакер должен иметь возможность заллить обработанный файл Phar на сервер. Но Сэм Томас (докладчик) нашел несколько хороших трюков, как файл Phar засунуть в поддельный JPG, поэтому функция загрузки изображений уже достаточна для взлома.
2) Обычно полный путь к файлу в операциях типа file() уже создает серьезнуть опасность, поэтому ввод, который используются в этих функциях обычно проверяется. Однако запуск phar:// возможен из любой файловой операции, так что можно использовать какой-нибудь file_exists(), который является менее защищенным.
Референсы:
- http://php.net/manual/phar.fileformat.manifestfile.php
Сегодняшний наш топик посвящается новой PHP-уязвимости. Ну т.е. как новой, данная уязвимость является логичным продолжением PHP Unserialization Vulnerability, правда теперь она позволяет провести RCE.
Теперь давайте поговорим про обертки:
Большинство файловых операций в PHP позволяют использовать различные обертки, такие как data://, zlib:// или php:// при доступе к файлу. Некоторые из этих оберток часто используются для получения удаленного доступа к файлам. Для примера: обертка используются, чтобы слить исходных код, который в другом случае просто исполняется.
Код:
Remote File Inclusion Exploitation
Code:
include('php://filter/convert.base64-encode/resource=index.php');
include('data://text/plain;base64,cGhwaW5mbygpCg==');
Так в чем же кроется смысл, если все это уже давно известная инфа?
А дело в том, что никто не обращал внимания на phar:// обертку. Вы можете спросить у меня:"Yuki, ты шо ебаннутый? Что интересного в Phar? (PHP Archive)"
А я отвечу тебе мой дорогой %username%, что там содержаться метаданные в формате serial3.
Давайте создадим файл Phar и добавим объект с некоторыми метаданными:
Код:
Creating a Phar File
Code:
// create new Phar
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ? >');
// add object of any class as meta data
class AnyClass {}
$object = new AnyClass;
$object->data = 'rips';
$phar->setMetadata($object);
$phar->stopBuffering();
Если мы посмотрим на наш test.phar, который мы только что создали, то увидим наш объект, который хранится как сериализованная строка.
Инъекция PHP-объекта:
Если теперь с нашим Phar выполняется файловая операция с помощью phar: // , то его сериализованные метаданные уже не являются таковыми. А это значит, что наш заинжекченный объект загружается в область приложения. А теперь самое интересное, мой дорогой %username%. Если это приложение имеет класс с именем AnyClass, и у него есть магический метод __destruct () или __wakeup (), то эти методы автоматически вызываются. Это означает, что мы можем запускать любой деструктор или метод пробуждения в коде PHP - приложения. Самый худший в данном случае исход, если данные методы работают с введенными пользовательскими данными, так как это может привести к дальнейшим уязвимостям.
Код:
PHP Object Injection via Phar file
Code:
class AnyClass {
function __destruct() {
echo $this->data;
}
}
// output: rips
include('phar://test.phar');
Использование
1) Хакер должен иметь возможность заллить обработанный файл Phar на сервер. Но Сэм Томас (докладчик) нашел несколько хороших трюков, как файл Phar засунуть в поддельный JPG, поэтому функция загрузки изображений уже достаточна для взлома.
2) Обычно полный путь к файлу в операциях типа file() уже создает серьезнуть опасность, поэтому ввод, который используются в этих функциях обычно проверяется. Однако запуск phar:// возможен из любой файловой операции, так что можно использовать какой-нибудь file_exists(), который является менее защищенным.
Референсы:
- http://php.net/manual/phar.fileformat.manifestfile.php
Последнее редактирование: