DVWA – Преобразование локального включения файлов в удаленную эксплуатацию кода

Вопрос или проблема

Я читаю этот блог, и там говорится:

Если к файлу /proc/self/environ можно получить доступ через LFI, то в этом случае “RCE” может быть достигнута, запросив файл в сочетании с полезной нагрузкой, записанной в поле HTTP User-Agent.

Затем говорится:

GET lfi.php?file=../../../proc/self/environ HTTP/1.1
User-Agent: <?php phpinfo();?>

Теперь, если злоумышленник отправляет вышеуказанный HTTP-запрос веб-серверу, то:

  1. Сначала данные поля User-Agent будут записаны в файл /proc/self/environ.
  2. Затем запрос страницы “lfi.php?file=../../../proc/self/environ” включит содержание файла /proc/self/environ в выходную страницу, и наша полезная нагрузка будет выполнена.

Теперь я понимаю первую часть, что когда мы включаем /proc/self/environ, операционная система на основе Linux заполняет файл информацией, относящейся к среде, из которой он был вызван. В нашем случае он заполняется HTTP-запросом, поскольку нашей средой является браузер.

То, что я не понимаю, так это почему содержание HTTP-запроса выполняется? С точки зрения разработчика, lfi.php выполняется, и в файле есть функция, которая читает содержимое файла, переданного ей в качестве параметра. Таким образом, содержание файла /proc/self/environ, а следовательно, и содержание HTTP-запроса должно быть прочитано, а не выполнено.

Может кто-то объяснить, что я пропустил?

Я думаю, когда это работает так (если это действительно так?), это потому, что в старых версиях PHP код PHP выполнялся, как только он выводился сервером. В нормальном .php файле, который частично является HTML и частично PHP, возможно, веб-сервер выводил весь HTML до тех пор, пока не наталкивался на оператор <?php, а затем начинал выполнять код PHP. Я не совсем уверен, потому что не могу воспроизвести это на современной копии PHP.

Что касается чего-то, я только что попробовал это на веб-хостинге, который использует PHP 7.2.30, и это действительно не кажется работающим так (больше?). Я действительно не эксперт. Очевидно, если вы используете include, include_once, require и т.д. для файла из переменной, это станет RCE.

первый тест (не сработает):

<?php
  readfile($_GET['lfi']);
?>

третий тест (сработает):

<?php
      $str = $_GET['lfi'];
      include $str;
?>

Википедия просто говорит, что это должна быть функция, которая выполняет файлы, и затем приводит хороший пример, почему кто-то может кодировать приложение таким образом. https://en.wikipedia.org/wiki/File_inclusion_vulnerability#PHP

Согласно Документации по PHP Include

” Когда файл включается, парсинг выходит из режима PHP и переходит в режим HTML в начале целевого файла и возобновляется в конце. По этой причине весь код внутри целевого файла, который должен выполняться как код PHP, должен быть заключен между допустимыми открывающими и закрывающими тегами PHP.

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

В качестве примера ниже простой LFI-уязвимый приложение:

LFI-уязвимый

Как вы можете видеть ниже, я создал несколько расширений файлов, все из которых содержат код PHP, который выводит ‘Привет, CPUKiller’, а затем вызывает phpinfo().

Файлы

Как вы можете видеть ниже на скриншотах, все файлы выполняют код PHP, и в этом случае расширение не имеет значения:

CPUKillerTest

CPUKillerTest.whatever

И так далее…

Единственный случай, когда наш include не сработает, это когда мы создадим файл с недопустимыми тегами PHP, как вы можете видеть ниже, я создал файл с недопустимыми тегами PHP для тестирования:

введите описание изображения здесь

если мы затем попробуем включить этот файл, используя LFI, это не сработает, как вы можете видеть ниже:

Неправильно

Заключение

Есть причина, по которой отравление журналов является очень мощной техникой, которую вы можете использовать, чтобы эскалировать LFI до RCE, отравляя любой файл, в который вы добавляете входящие данные, и читая его, используя LFI. Этот файл может быть любым журнальным файлом, таким как журналы доступа и ошибок Apache, журналы SSH, журналы SMTP, любой файл, который содержит любые данные запроса, которые вы можете контролировать. Так как важнее всего добавить допустимые теги PHP, это сработает, если вы это сделаете!

Надеюсь, это помогло!

Ответ или решение

Преобразование Local File Inclusion (LFI) в удаленное выполнение кода (RCE) с использованием DVWA

Введение

Local File Inclusion (LFI) – это уязвимость в веб-приложениях, позволяющая злоумышленнику включать файлы, находящиеся на сервере, в ответ от приложения. При этом возможны сценарии, в которых LFI может быть использована для достижения пушечного результата, такого как удаленное выполнение кода (RCE). В данном материале мы рассмотрим, как это можно сделать с использованием файла /proc/self/environ на Linux-системах и HTTP заголовка User-Agent.

Понимание механизма

Как было упомянуто в предоставленном материале, файл /proc/self/environ содержит информацию о среде выполнения текущего процесса, включая переменные окружения HTTP-заголовков, поступающих на сервер. Например, когда злоумышленник отправляет HTTP-запрос, в котором заголовок User-Agent содержит PHP-код, как в следующем примере:

GET lfi.php?file=../../../proc/self/environ HTTP/1.1
User-Agent: <?php phpinfo(); ?>

Последствия запроса

При получении данного запроса сервер выполняет следующие операции:

  1. HTTP-заголовки, включая заголовок User-Agent, записываются в файл /proc/self/environ.
  2. Скрипт lfi.php использует функцию, которая читает содержимое файла, который передается через параметр file. В данном случае это — файл /proc/self/environ.
  3. Если файл содержит код PHP, который находится внутри корректных PHP-тегов, то этот код будет обработан интерпретатором PHP.

Почему происходит выполнение кода, а не просто чтение?

Это может вызвать недоумение, особенно для разработчиков, которые ожидают, что содержимое файла будет просто прочитано кириллически. Однако, как указывает документация PHP, при подключении файла с помощью таких конструкций, как include, require и их вариации, сервер начинает разбирать код на PHP.

  • Код, записанный в файл, будет выполнен, если он обрамлён корректными PHP-тегами, независимо от расширения файла.
  • На этом этапе важно, чтобы код был исполняемым, так как PHP обрабатывает файл, и, если он содержит активные PHP конструкции, они будут исполнены на сервере.

Использование переменных окружения делает LFI особенно опасной, поскольку злоумышленник получает возможность инжектировать произвольный PHP-код через возможности, предоставляемые приложением для запроса различных файлов.

Демонстрация и тестирование

Если вы хотите протестировать этот вектор атаки, вам необходимо создать скрипт, который будет уязвим к LFI:

<?php
$file = $_GET['file'];
include($file);
?>

Здесь важно понимать, что использование функции include при наличии уязвимости LFI может привести к выполнению кода в заголовках, что и является источником уязвимости.

Рекомендуется также следить за содержимым лог-файлов (например, access.log или error.log), так как они могут содержать инъектируемые данные и создавать потенциальные пути для RCE при правильной манипуляции с ними.

Заключение

Таким образом, превращение Local File Inclusion в Remote Code Execution возможно за счёт правильного использования переменных окружения, если в них встроен код PHP. Необходимо обратить внимание на безопасность приложений и избегать использования конструкций, позволяющих привязку файлов, которые могут быть подвержены изменениям со стороны пользователя. Регулярное обновление и патчинг используемого программного обеспечения, использование принципов безопасного программирования и ограничение прав доступа к файловой системе являются обязательными мерами для защиты от подобных уязвимостей.

Оцените материал
Добавить комментарий

Капча загружается...