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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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






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





Perl скрипты

Использование каналов

Вот скрипт, написанный без всякой защиты. Он отображает заданный файл из дерева каталогов /home/httpd/:

#pipe1.cgi

my $filename= "/home/httpd/".$input{filename};
print "<BODY>File : $filename<BR>";
open(FILE,"$filename") || goto form;
print <FILE>;

Не смейтесь с этого примера! Я видел подобные скрипты.

Первое использование его очевидно:

pipe1.cgi?filename=..%2F..%2F..%2Fetc%2Fpasswd

Нужно только поднятся вверх по дереву, чтобы получить доступ к любому файлу. Однако тут есть другая более интересная возможность: выполнить команду по своему выбору. В Perl, команда open(FILE, "/bin/ls") открывает двоичный файл "/bin/ls"... однако open(FILE, "/bin/ls |") исполняет указанную команду. Добавление одного символа канала |, изменяет поведение open().

Другая проблема возникает из-за того, что не проверяется существование файла, что позволяет нам не только выполнить любую команду, но и передать ей аргументы: pipe1.cgi?filename=..%2F..%2F..%2Fbin%2Fcat%20%2fetc%2fpasswd%20| отображает содержимое файла паролей.

Проверка на существование файла для открытия, дает меньше свободы:

#pipe2.cgi

my $filename= "/home/httpd/".$input{filename};
print "<BODY>File : $filename<BR>";
if (-e $filename) {
  open(FILE,"$filename") || goto form;
  print <FILE>
} else {
  print "-e failed: no file\n";
}

Предыдущий пример больше не работает. Проверка "-e" не проходит, так как невозможно найти файл "../../../bin/cat /etc/passwd |".

Попробуем сейчас команду /bin/ls. Поведение скрипта будет тем же. То есть, если мы попытаемся вывести список файлов в директрии /etc, "-e" проверит существование файла "../../../bin/ls /etc |", однако он также не существует. Так как мы не можем задать имя нужного файла, мы не сможем получить ничего интересного :(

Однако по-прежнему есть "выход из положения", даже если наш результат не так уж хорош. Файл /bin/ls существует (на большинстве систем), однако, если open() вызвана с этим именем файла, команда не будет выполнена, а будет выведен двоичный код. Поэтому мы должны найти способ поместить канал '|' в конец имени, но так, чтобы он не использовался при проверке "-e". Мы уже знаем решение - нулевой байт. Если мы пошлем "../../../bin/ls\0|" в качестве имени, проверка на существование пройдет успешно, так как она касается только "../../../bin/ls", однако open() может видеть канал и поэтому выполнит команду. Поэтому, URI, который нам даст содержимое текущей дериктории таков:

pipe2.cgi?filename=../../../bin/ls%00|

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



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





Copyright © 2005-2016 Project.Net.Ru