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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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






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




Perl скрипты

Бэкслэш и точка с запятой

Предыдущий скрипт finger.cgi обходит проблемы, которые могут возникнуть с использованием некоторых символов. Таким образом, URI

finger.cgi?login=kmaster;cat%20/etc/passwd

не работает, так как перед точкой с запятой ставится бэкслэш. Однако, один символ таким образом не обрабатыватся - бэкслэш '\'.

Возьмем к примеру скрипт, который не дает нам подняться по дереву каталогов при помощи регулярного выражения s/\.\.//g, которое удаляет "..". Не важно, что получится! Оболочки могут работать с несколькими подряд идущими '/' (чтобы убедиться просто попробуйте cat ///etc//////passwd).

Например, в вышеуказанном скрипте pipe2.cgi переменная $filename инициализируется при помощи префикса "/home/httpd/". Использование предыдущего регулярного выражения может показаться достаточным, чтобы не дать возможности подняться по директориям наверх. Конечно это выражение защитит от "..", однако что будет если мы поставим бэкслэш перед символом '.'? Регулярное выражение не сработает, если имя файла будет .\./.\./etc/passwd. Заметим, что с таким именем файла прекрасно работает функция system() (или ` ... `), но open() и "-e" возвращают ошибку.

Вернемся к скрипту finger.cgi. Вызов finger.cgi?login=kmaster;cat%20/etc/passwd с использованием точки с запятой не дает ожидаемого результата, так как точка с запятой теряет свое значение после работы регулярного выражения. То есть оболочка получает инструкцию:

/usr/bin/finger kmaster\;cat /etc/passwd

В логах веб-сервера появляется следующая ошибка:

finger: kmaster;cat: no such user.
finger: /etc/passwd: no such user.

Сообщения идентичны тем, что появятся, если вы введете эту команду в командной строке. Источник проблемы в том, что бэкслэш перед ';' заставляет рассматривать этот символ как часть строки "kmaster;cat".

Мы же хотим разделить две инструкции: одну для скрипта, а вторую для своего использования. Для этого мы должны заранее поставить бэкслэш перед ';': <A HREF="finger.cgi?login=kmaster\;cat%20/etc/passwd"> finger.cgi?login=kmaster\;cat%20/etc/passwd</A>. Строка "\;" заменяется скриптом на "\\;", а затем посылается оболочке. Оболочка получает команду :

/usr/bin/finger kmaster\\;cat /etc/passwd
И разбивает ее на две инструкции:
  1. /usr/bin/finger kmaster\, которая вероятнее всего ничего не даст... но она нам и не нужна :-)
  2. cat /etc/passwd - она покажет нам файл с паролями.

Решение этой проблемы простое: надо в регулярном выражении обрабатывать и сам бэкслэш '\'.

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



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





Copyright © 2005-2016 Project.Net.Ru