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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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






 
 
| Добавить в избранное | Сделать стартовой 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