Библиотека сайта 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.
#!/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 , в которых могут содержаться адреса узлов, имена пользователей и пароли для сервера базы данных, а также другие конфигурационные данные, а также в случае получения содержимого самих файлов базы данных.
|
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-доступа к серверу и, возможно, атаковать другие узлы, к которым можно получить доступ с использованием данного сервера.
Мероприятия по повышению безопасности
- Уберите бит исполнения для группы всех пользователей (
-rwxrwxrw-
) у программ ОС. Для учетной записи пользователя, с привилегиями которой работает веб-сервер, должно быть запрещено выполнение ряда системных команд даже в том случае, если взломщику удалось обойти механизмы защиты веб-приложения и воспользоваться им для выполнения этих команд. - Производите проверку всех полей ввода на наличие таких символов, как
;
,|
,/
или%00
. Так как список таких символов ограничен, лучшим решением является разрешение ввода только ожидаемых символов и фильтрация всех остальных - создайте список разрешенных символов, соответствующих спецификации, и отклоняйте все другие символы, либо преобразуйте их в разрешенные. Например, для правильного отображения амперсанда (&
), который может встретиться в пользовательском вводе и который должен быть частью HTML-страницы, следует преобразовать его в строку&
. - В качестве дополнительной меры безопасности вы можете также отфильтровывать имена директорий, содержащих приложения, такие, как
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
$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
и предоставит его содержимое взломщику.
Атаки обхода путей в большинстве случаев направлены на эксплуатацию уязвимостей приложений в функциях загрузки, скачивания и показа содержимого файлов, которые часто встречаются в приложениях для совместной работы (где пользователи могут делиться документами); в приложениях для ведения блогов и проведения аукционов (где пользователи могут загружать изображения); и в информационных приложениях (где пользователи получают документы, такие, как книги в электронном виде, технические руководства и корпоративные отчеты).
В большинстве случаев могут быть применены меры повышения безопасности - фильтрация прямых и обратных слэшей - но и в этом случае взломщики также могут попытаться использовать простые закодированные представления этих последовательностей, такие, как представленные в следующей таблице.
Символ | Кодирование URL | Кодирование 16-bit Unicode | Двойное кодирование URL |
Точка | %2e | %u002e | %252e |
Прямой слэш | %2f | %u2215 | %252f |
Обратный слэш | %5c | %u2216 | %255c |
Мероприятия по повышению безопасности
- На самом деле не существует веской причины, по которой сервер 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>
запрещает просмотр содержимого директорий, защищая сервер от атак обхода директорий). - Кроме этого, удостоверьтесь в том, что учетная запись пользователя, используемая веб-сервером или веб-приложением, обладает минимально возможными правами чтения файлов вне корневой директории веб-сервера. Также следует сменить заданные по умолчанию пути к корневым директориям сервера.
- После окончания всех необходимых операций по декодированию и приведению путей для переданных пользователем имен файлов следует проверить все введенные данные и использовать только строки с разрешенными символами (такими, как буквы и числа). Процедура проверки должна особо тщательно определять наличие мета-символов командной оболочки, таких, как
/
и символы объединения команд (&&
для Windows и точка с запятой для командных оболочек UNIX). - Следует установить жесткое ограничение длины введенных пользователем данных. Учтите, что это ограничение должно быть применено к любому параметру, передаваемому между клиентом и сервером, а не только к параметрам, которые может изменить пользователь с помощью текстовых полей или подобных полей ввода.
- Приложение должно использовать заданный список допустимых типов файлов и отклонять все запросы в отношении файлов другого типа. Лучше проводить эту проверку до декодирования и приведения путей переданных пользователем файлов.
- Информация о любом запросе, содержащем символы для перемещения по файловой системе, должна быть добавлена в журнал событий приложения в виде предупреждения о попытке нарушения безопасности, также должно быть сгенерировано предупреждение для администратора, завершена сессия пользователя и, если это возможно, заблокирована учетная запись пользователя.
- Две функции,
realpath()
иbasename()
, реализованы в PHP для облегчения предупреждения атак обхода директорий. Функцияrealpath()
преобразует специальные символы.
или..
в строке, возвращая абсолютный путь к файлу. Например, если бы переменная$filename
из сценария атаки 2 была бы передана функцииrealpath()
, было бы возвращено имя файла/etc/passwd
. С другой стороны, функцияbasename()
удаляет часть строки с указанием директорий, оставляя только имя файла. С помощью этих двух функций возможно реализовать код из сценария атаки 2 более безопасным способом:$username = basename(realpath($_GET['user'])); $filename = "/home/users/$username"; readfile($filename);
Инструменты
- Dotdotpwn является очень гибким инструментом, разработанным с использованием языка Perl и предназначенным для fuzzing-тестирования и поиска уязвимостей обхода директорий на серверах HTTP/FTP. При работе с Windows-системами он также определяет наличие файла
boot.ini
, доступного с помощью атак обхода директорий на уязвимых системах. Он доступен для свободного скачивания на веб-сайте вместе с документацией. - Этот веб-ресурс содержит множество строк URL, используемых взломщиками в ходе реализации атак обхода путей. На данном домене также расположены другие неплохие ресурсы, посвященные безопасности приложений и этичным методам взлома.
Продолжение статьи смотрите здесь.