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

О проекте

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 скрипты

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

Предыдущий скрипт 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