Perl скрипты
Нулевой байт
Для Perl все символы одинаковы, что отлично, например, от функций C. Для Perl нулевой символ конца строки - это такой же символ как и все остальные. И что?
Давайте добавим следующий код в наш скрипт, чтобы получить showhtml.cgi :
# showhtml.cgi
my $filename= $input{filename}.".html";
print "<BODY>File : $filename<BR>";
if (-e $filename) {
open(FILE,"$filename") || goto form;
print <FILE>;
}
Функция ReadParse() получает только один аргумент: имя файла для отображения. Чтобы не допустить чтения файлов отличных от HTML некоторыми "невежливыми гостями", мы добавляем расширение ".html " в конец имени файла. Однако помните, что нулевой байт - это такой же символ, как и все остальные...
Поэтому, если наш запрос showhtml.cgi?filename=%2Fetc%2Fpasswd%00 , файл будет называться my $filename = "/etc/passwd\0.html" и нашему удивленному взору предстанет кое-что не являющееся HTML.
Что случилось? Команда strace показывает, как Perl открывает файл:
/tmp >>cat >open.pl << EOF
> #!/usr/bin/perl
> open(FILE, "/etc/passwd\0.html");
> EOF
/tmp >>chmod 0700 open.pl
/tmp >>strace ./open.pl 2>&1 | grep open
execve("./open.pl", ["./open.pl"], [/* 24 vars */]) = 0
...
open("./open.pl", O_RDONLY) = 3
read(3, "#!/usr/bin/perl\n\nopen(FILE, \"/et"..., 4096) = 51
open("/etc/passwd", O_RDONLY) = 3
Последний open() , показанный strace , соответствует системному вызову, написанному на C. Мы можем видеть, что расширение .html исчезает, что позволяет нам открыть /etc/passwd.
Это проблема решается при помощи одного регулярного выражения, которое удаляет все нулевые байты:
s/\0//g;
[ Назад ]
[ Содержание ]
[ Вперед ]
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|