Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Безопасная эксплуатация Apache, часть 7: атаки с использованием функций ОС сервера

Оригинал: Securing Apache, Part 7: Fool-proofing the Server OS
Автор: Arpit Bajpai
Дата публикации: 1 Марта 2011 г.
Перевод: А.Панин
Дата перевода: 31 Января 2013 г.

Вникая все глубже в вопросы безопасной эксплуатации веб-приложений и Apache, на этот раз мы рассмотрим атаки, использующие функции ОС и позволяющие производить раскрытие путей файлов на сервере и получать важную информацию о его работе. Атаки, описанные ниже, чаще всего не рассматриваются подробно или считаются достаточно очевидными.

Исполнение команд ОС

Уязвимости исполнения команд ОС (также известные под названием шелл-инъекций) позволяют взломщикам исполнять команды операционной системы при помощи манипуляций с данными, передаваемыми приложению. Они чаще всего проявляются в случаях, когда сценарии исполняют внешние команды ОС, формируемые без предварительной проверки передаваемых данных. Эти команды будут исполняться с привилегиями программного компонента (сервера базы данных, сервера веб-приложения, веб-сервера, программы-обертки или приложения), с помощью которого происходит их вызов. Это обстоятельство позволяет взломщику получить доступ к недоступным до этого момента данным (таким, как директории и файлы операционной системы), использовать не предусмотренные приложением или опасные команды, загрузить вредоносные программы на сервер или даже получить пароли напрямую от операционной системы. Диаграмма ниже иллюстрирует механизм данных атак.

Атака с исполнением команд ОС
Рисунок 1: Атака с исполнением команд ОС

Уязвимости исполнения команд ОС чаще всего обнаруживаются в сценариях на языках Perl и PHP, так как эти программные окружения склоняют разработчиков к повторному использованию программ из состава ОС. Тем не менее, существует вероятность обнаружения подобных уязвимостей и в приложениях на языках Java и ASP. Давайте рассмотрим несколько примеров сценариев, использующих языки Perl и PHP.

Следующий код CGI-приложения на Perl является частью веб-приложения для администрирования сервера. Он позволяет администраторам задать путь к директории на сервере и узнать о том, какой объем дискового пространства занимает ее содержимое:
#!/usr/bin/perl
use strict;
use CGI qw(:standard escapeHTML);
print header, start_html("");
print "<pre>";
my $command = "du -h --exclude php* /var/www/html";
$command= $command.param("dir");
$command=`$command`;
print "$commandn";
print end_html;

При использовании сценария по назначению происходит простое объединение введенного пользователем значения параметра dir и части команды, после чего происходит выполнение получившейся в результате команды и вывод результатов. Строка URL при корректном использовании сценария может выглядеть следующим образом: http://www.example.com/cgi-bin/showinfo.pl?dir=/public.

Данная функция может эксплуатироваться различными способами при условии передачи специально сформированной строки с символами, имеющими специфическое значение для командного интерпретатора. Например, символ канала (|) используется для перенаправления вывода одного процесса на вход другого, позволяя создать конвейер из множества команд. Взломщик может использовать его для вставки второй команды (и получения ее вывода) с помощью вредоносной строки URL, такой, как http://www.example.com/cgi-bin/showinfo.pl?dir=/public|%20cat&20/etc/passwd. В данном случае вывод команды du перенаправляется на вход команды cat /etc/passwd и просто игнорируется, причем в итоге производится вывод содержимого файла passwd.

Примечание: В большинстве операционных систем ограничивается доступ к системным файлам. Также технология теневых паролей сделала данный тип атаки не таким опасным, каким он был раньше. При этом данный вид атаки все еще опасен в случае получения содержимого файлов .php, в которых могут содержаться адреса узлов, имена пользователей и пароли для сервера базы данных, а также другие конфигурационные данные, а также в случае получения содержимого самих файлов базы данных.
PHP также предоставляет функции, такие, как passthru() и exec(), а также оператор обратной кавычки для выполнения внешних программ. Рассмотрим следующий код PHP, выводящий список файлов в домашней директории определенного пользователя:
$output = `ls -al /home/$username`;
echo $output;

Корректной строкой URL может быть следующая строка: http://www.example.com/viewfiles.php?username=arpit. Если в передаваемой строке используется символ точки с запятой, то с помощью него производится отметка окончания первой команды и начала второй. Примером вредоносной строки URL может быть следующая строка: http://www.example.com/viewfiles.php?username=arpit;cat%20/etc/passwd, с помощью которой производится вывод содержимого файла passwd.

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

Мероприятия по повышению безопасности

Атаки с исполнением команд ОС находятся в списке наиболее редко упоминаемых типов атак, но следующие меры повышения безопасности могут значительно помочь в их нейтрализации:
  1. Уберите бит исполнения для группы всех пользователей (-rwxrwxrw-) у программ ОС. Для учетной записи пользователя, с привилегиями которой работает веб-сервер, должно быть запрещено выполнение ряда системных команд даже в том случае, если взломщику удалось обойти механизмы защиты веб-приложения и воспользоваться им для выполнения этих команд.
  2. Производите проверку всех полей ввода на наличие таких символов, как ;,|,/ или %00. Так как список таких символов ограничен, лучшим решением является разрешение ввода только ожидаемых символов и фильтрация всех остальных - создайте список разрешенных символов, соответствующих спецификации, и отклоняйте все другие символы, либо преобразуйте их в разрешенные. Например, для правильного отображения амперсанда (&), который может встретиться в пользовательском вводе и который должен быть частью HTML-страницы, следует преобразовать его в строку &amp;.
  3. В качестве дополнительной меры безопасности вы можете также отфильтровывать имена директорий, содержащих приложения, такие, как bin, sbin, opt.

Атаки обхода путей (директорий)

Веб-серверы в большинстве случаев настроены таким образом, чтобы запрещать доступ к определенной части файловой системы, называемой "корневой директорией веб-сервера" ("Web document root"). Эта директория содержит файлы и сценарии, используемые для работы веб-приложения.

В ходе атаки обхода путей взломщик производит манипуляции со строкой URL таким образом, что веб-сервер исполняет сценарий или раскрывает содержимое файла, располагающегося на сервере, включая те случаи, в которых файлы располагаются вне корневой директории веб-сервера. Такие атаки проводятся с помощью последовательностей специальных символов во входных параметрах строк URL, куках и заголовках HTTP-запросов.

В случае самой примитивной атаки обхода путей может использоваться специальная последовательность символов ../ для изменения пути к запрашиваемому файлу или ресурсу в строке URL. Хотя большинство веб-серверов предотвращают переход за границу корневой директории веб-сервера с помощью данной последовательности символов, использование альтернативных кодировок для кодирования последовательности ../, таких, как Unicode, позволяет обойти некоторые фильтры безопасности. Даже в том случае, если веб-сервер корректно предотвращает попытки проведения атак обхода путей с использованием строк URL, любое приложение, реализующее интерфейс на основе протокола HTTP, потенциально уязвимо для данного типа атак.

Примечание: В системах UNIX родительская директория обозначается с помощью последовательности символов ../, в то время как в Windows - с помощью ...

Сценарий атаки 1

Корректная строка URL http://www.example.com/scripts/database.php?report=quarter1.txt используется для вывода содержимого текстового файла. Однако, преобразование ее к следующему виду http://www.example.com/scripts/database.php?report=../scripts/database.php%00txt заставит приложение на языке PHP вывести исходный код файла database.php, обрабатывая его как текстовый файл, содержимое которого должно быть показано.

Взломщик использует последовательность ../ для перехода в директорию на уровень выше "текущей" директории и перехода в директорию /scripts. Последовательность символов %00 используется одновременно для преодоления простой проверки расширения файла и отделения расширения во время чтения и обработки файла средствами PHP. Этот пример подчеркивает особую важность постоянных проверок и фильтраций введенных пользователем данных перед их обработкой.

Сценарий атаки 2

Код на языке PHP, представленный ниже, принимает имя пользователя и открывает файл, соответствующий этому имени. Уязвимость в этом коде может эксплуатироваться при помощи передачи специального имени пользователя, которое приводит к открытию сценарием другого файла.
$username = $_GET['user'];
$filename = "/home/users/$username";
readfile($filename);

Предположим, что корректная строка URL выглядит следующим образом: www.example.com/profile.php?user=arpit.pdf. Если взломщик передаст измененную строку URL, подобную www.example.com/profile.php?user=../../etc/passwd то PHP прочитает файл /etc/passwd и предоставит его содержимое взломщику.

Атаки обхода путей в большинстве случаев направлены на эксплуатацию уязвимостей приложений в функциях загрузки, скачивания и показа содержимого файлов, которые часто встречаются в приложениях для совместной работы (где пользователи могут делиться документами); в приложениях для ведения блогов и проведения аукционов (где пользователи могут загружать изображения); и в информационных приложениях (где пользователи получают документы, такие, как книги в электронном виде, технические руководства и корпоративные отчеты).

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

Таблица 1: Некоторые схемы кодирования
Символ Кодирование URL Кодирование 16-bit Unicode Двойное кодирование URL
Точка %2e %u002e %252e
Прямой слэш %2f %u2215 %252f
Обратный слэш %5c %u2216 %255c

Мероприятия по повышению безопасности

Следующие меры безопасности могут быть применены для противодействия атакам обхода путей:
  1. На самом деле не существует веской причины, по которой сервер Apache должен иметь возможность работать с файлами, расположенными вне его корневой директории. Любой запрос файлов, находящихся вне корневой директории, очень подозрителен, поэтому мы запретим данные вызовы с помощью следующих директив в файле httpd.conf:
    <Directory />
    Order Deny, Allow
    Deny from all
    Options none
    AllowOverride none
    </Directory>
    <Directory www>
    Order Allow, Deny
    Allow from all
    Options -Indexes
    </Directory>
    
    (Замените www на заданное вами имя корневой директории веб-сервера. Строка Options -Indexes в секции <Directory www> запрещает просмотр содержимого директорий, защищая сервер от атак обхода директорий).
  2. Кроме этого, удостоверьтесь в том, что учетная запись пользователя, используемая веб-сервером или веб-приложением, обладает минимально возможными правами чтения файлов вне корневой директории веб-сервера. Также следует сменить заданные по умолчанию пути к корневым директориям сервера.
  3. После окончания всех необходимых операций по декодированию и приведению путей для переданных пользователем имен файлов следует проверить все введенные данные и использовать только строки с разрешенными символами (такими, как буквы и числа). Процедура проверки должна особо тщательно определять наличие мета-символов командной оболочки, таких, как / и символы объединения команд (&& для Windows и точка с запятой для командных оболочек UNIX).
  4. Следует установить жесткое ограничение длины введенных пользователем данных. Учтите, что это ограничение должно быть применено к любому параметру, передаваемому между клиентом и сервером, а не только к параметрам, которые может изменить пользователь с помощью текстовых полей или подобных полей ввода.
  5. Приложение должно использовать заданный список допустимых типов файлов и отклонять все запросы в отношении файлов другого типа. Лучше проводить эту проверку до декодирования и приведения путей переданных пользователем файлов.
  6. Информация о любом запросе, содержащем символы для перемещения по файловой системе, должна быть добавлена в журнал событий приложения в виде предупреждения о попытке нарушения безопасности, также должно быть сгенерировано предупреждение для администратора, завершена сессия пользователя и, если это возможно, заблокирована учетная запись пользователя.
  7. Две функции, realpath() и basename(), реализованы в PHP для облегчения предупреждения атак обхода директорий. Функция realpath() преобразует специальные символы . или .. в строке, возвращая абсолютный путь к файлу. Например, если бы переменная $filename из сценария атаки 2 была бы передана функции realpath(), было бы возвращено имя файла /etc/passwd. С другой стороны, функция basename() удаляет часть строки с указанием директорий, оставляя только имя файла. С помощью этих двух функций возможно реализовать код из сценария атаки 2 более безопасным способом:
    $username = basename(realpath($_GET['user']));
    $filename = "/home/users/$username";
    readfile($filename);
    

Инструменты

  1. Dotdotpwn является очень гибким инструментом, разработанным с использованием языка Perl и предназначенным для fuzzing-тестирования и поиска уязвимостей обхода директорий на серверах HTTP/FTP. При работе с Windows-системами он также определяет наличие файла boot.ini, доступного с помощью атак обхода директорий на уязвимых системах. Он доступен для свободного скачивания на веб-сайте вместе с документацией.
  2. Этот веб-ресурс содержит множество строк URL, используемых взломщиками в ходе реализации атак обхода путей. На данном домене также расположены другие неплохие ресурсы, посвященные безопасности приложений и этичным методам взлома.

Продолжение статьи смотрите здесь.