PERL

Practical Extraction and Report Language —
«практический язык для извлечения данных и составления отчётов»

Листинг 38

Приводимый ниже пример демонстрирует, к чему может привести отсутствие фильтрации вводимых клиентами данных.

Воспользовавшись допущенными ошибками, злоумышленник сможет получить доступ к содержимому любых файлов системы, доступного скрипту, отправив запрос "/etc/passwd", к тому же отметив символ конвейера ("") дает возможность запускать любое приложение доступное данному скрипту и посмотреть в браузере весь результат его работы. Например, "echo "+ +" >/.rhosts" позволит подключаться по протоколам rlogin без обязательного ввода пароля.

Однако не все недостатки так очевидны. Найдите ошибку в реализации этого же примера, усиленный добавлением расширения ".html" к названию запускаемого файла:

open(f,$filename.".html");

while()

{

print;

}


Листинг 39.

Один из примеров некорректной защиты от доступа к другим файлам.

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

"\0" - задание конца строки

"-" чтение со стандартного ввода

">",">>" и "+>" открытие файла для записи, дозаписи и перезаписи соответственно

"&" обращение к файловому манипулятору

"" и "`" запуск программы

"+<" открытие файла для записи и чтения

".." и "/" - обращение к вышележащим каталогам

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

open (psw,"passwd") die; #открытие файла паролей

#...некоторый код...

print "введите имя файла:"

#запрос имени отображаемого файла

$filename=<>; chop $filename;

if ($filename eq "passwd")

#проверка имени на корректность

{print "Hello,Hacker!\n";die;}

open(f,$filename) die; #вывод файла на экран

while()

{

print;

}

Листинг 40 Пример, демонстрирующий несанкционированный доступ к секретному файлу через его манипулятор

Если ввести "<&psw", или "<&=psw", то на экране появится содержимое секретного файла – пароли.

Главная

Perl-скрипты

Android

Карта сайта