Perl скрипты
Перевод строки
Скрипт finger.cgi выполняет инструкцию finger на нашей машине:
#finger.cgi
print "<BODY>";
$login = $input{'login'};
$login =~ s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'"])/\\$1/g;
print "Login $login<BR>\n";
print "Finger<BR>\n";
$CMD= "/usr/bin/finger $login|";
open(FILE,"$CMD") || goto form;
print <FILE>
Этот скрипт по крайней мере предпринимает полезную меру предосторожности: он заботится, чтобы ненужные символы не были интерпретированы оболочкой, помещая '\ ' перед ними. Таким образом, точка с запятой заменяется на "\; " при помощи регулярного выражения. Однако список не содержит все интересные символы. Среди них нет перевода строки '\n '.
В командной строке вашей любимой оболочки вы активизируете инструкцию, нажимая клавишу Ввод , которая передает символ '\n '. В Perl вы можете делать то же самое. Мы уже видели, что инструкция open() позволяет нам выполнять команду, если строка оканчивается символом канала '| '.
Чтобы смоделировать такое поведение, мы добавим возврат каретки и инструкцию после имени, которое посылается команде finger:
finger.cgi?login=kmaster%0Acat%20/etc/passwd
Другие символы, которые позволяют исполнить различные инструкции в одной строке:
; : после окончания первой инструкции, выполняется следующая;
&& : если результат выполнения первой инструкции успешен (т.е. она возвратила 0 оболочке), то выполняется следующая;
|| : при ошибочном выполнении первой инструкции (т.е. она возвратила ненулевое значение оболочке), выполняется следующая.
Эти символы не работают в данном примере, т.к. они обрабатываются регулярным выражением. Однако, найдем способ решить эту проблему.
[ Назад ]
[ Содержание ]
[ Вперед ]
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|