|
||
|
||
Дыры в скриптах на PERL |
||
...очень хочется надеяться, что полученной информацией Вы воспользуетесь в благих целях. И не кинетесь сломя голову "ломать" все и вся. Сегодня скрипты на PERL можно встретить не только на крупном портале, но и на домашней страничке. Однако мощь языка столь велика, что часто позволяет злоумышленникам взломать Ваш сервер с помощью Ваших же скриптов. Происходит это конечно не по вине самого языка, а по причине незнания web-мастером всех особенностей PERL, и некорректным его использованием. В моей статье "Практическое применение PERL-скриптов" (опубликованной также в IZONE-Gold6) в качестве примера приведен PERL-скрипт. Хотелось бы акцентировать внимание на том, что скрипт служит лишь примером. И в опубликованном виде его применять нецелесообразно, а по соображением безопасности вообще нежелательно. Напомню, в статье шла речь о
построение сайта по единому шаблону, и
для вставки в шаблон html-страниц
прелагалось использовать скрипт на PERL,
текст которого ниже. Работает скрипт следующим образом, берет имя файла из строки запроса и выводит его на экран. В чем ошибка? Все прекрасно пока пользователь пользуется ссылками с Вашего сайта. Однако он может "ручками" изменить строку запроса и тогда увидит на экране любой интересующий его документ с Вашего сайта. Конечно он должен знать имя этого документа, но скрипт предоставляет саму возможность просмотра документа. К примеру. Пусть на сервере
лежит документ secret.txt. На него
естественно нет ни одной ссылки со
страниц сервера. Вызов Ваших страниц
организован следующим образом: Первое, что приходит в голову,
это изменить строку Что казалось бы позволяет
открывать только файлы с расширением
".htm". Точнее это расширение
добавляется к каждой ссылке, и в строке
запроса расширение необходимо опустить.
Выглядеть при этом они будут так: Параметр secret при этом превратится в secret.htm, а secret.txt в secret.txt.htm. И ни один из них не соответствует файлу secret.txt. Но если "плохой юзер"
наберет Почему это происходит? Perl позволяет нулевые символы в качестве данных содержащихся в переменной. В отличии от C NUL не является конечным символом строки. Но лежащие ниже вызовы системы/ядра написаны на "С", который распознает NUL как разделитель строки. Что получается в результате? Скрипт получает secret.txt%00. Преобразует его в secret.txt%00.htm. Далее Perl передает secret.txt\0.htm, но лежащие ниже библиотеки останавливаются когда встречают первый NUL. То есть имя файла превратится в secret.txt... Решение. Нужно удалить нули
в строке запроса. К примеру так: Теперь если "плохой юзер"
наберет Ошибка вторая. Скрипт
позволяет обращаться к файлам более
высокого уровня. Не секрет, что
абсолютное большинство "плохих
юзеров" интересует содержимое /etc/passwd.
Название говорит само за себя (для
пользователей UNIX). А что бы туда попасть
обычно вполне достаточно, применительно
к нашему скрипту, набрать нижеследующее: Дело в том, что каждая последовательность "../" выводит нас на один уровень выше. И после нескольких таких обращений мы попадаем в корень диска. А от туда прямая дорога в /etc/passwd. Решение. Запретить обратный
ход в директориях можно следующим
образом: В этом случае запрос Что, согласитесь, не одно и тоже. И "плохой юзер" ничего не увидит. Ошибка третья. Если файл
открывается на чтение, то лучше делать
это принудительно, а именно: Если не указать знак меньше "<", то по умолчанию файл так же откроется на чтение. Но, как вы наверное догадываетесь, это самое "по умолчанию" иногда можно обойти. Вставив всего один символ "меньше" вы защитите и себя и свой сервер от кучи неприятностей. Рекомендую всем использующим PERL-скрипты проверить их на наличие вышеописанных "дыр". Даже если у Вас нет никакой секретной информации. Как минимум есть что скрывать вашему хостинг-провайдеру. Конкретно, имена пользователей и пароли. P.S. Статья не описывает все "дыры" PERL-скриптов. А указывает на самые распространенные ошибки и дает общие рекомендации по их устранению. Источник - http://rsw.mastak.com/ Автор - Юрий Рассадников
|
||
|
||
Copyright © "Internet Zone", http://www.izcity.com/, info@izcity.com |