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
И разбивает ее на две инструкции:
/usr/bin/finger kmaster\ , которая вероятнее всего ничего не даст... но она нам и не нужна :-)
cat /etc/passwd - она покажет нам файл с паролями.
Решение этой проблемы простое: надо в регулярном выражении обрабатывать и сам бэкслэш '\ '.
[ Назад ]
[ Содержание ]
[ Вперед ]
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|