П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 178296 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 75764 раз(а).

Учебник HTML.
Просмотров 74199 раз(а).

Руководство по PHP5.
Просмотров 45147 раз(а).

Хостинг через призму DNS.
Просмотров 52090 раз(а).

Подборка текстов стандартных документов.
Просмотров 45220 раз(а).

Учебник PHP - Самоучитель
Просмотров 51452 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 51912 раз(а).

Внешние атаки...
Просмотров 42020 раз(а).

Учебник PHP.
Просмотров 37395 раз(а).

SSI в примерах.
Просмотров 27904 раз(а).






 
 
| Добавить в избранное | Сделать стартовой Project.Net.Ru | Помощь





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;

[ Назад ] [ Содержание ] [ Вперед ]



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru