2014-10-28 3 views
3

Я читал, что команда open() с двумя аргументами уязвима для инъекций, тогда как команда open() с 3 аргументами не может быть впрысками.perl open() предотвращение впрыска

, у меня есть каталог, в котором все мои файлы имеют общий префикс, то есть «File-» так пример файла будет, файл-SomeSourceCode.txt

Как бы что-то вроде open(FILEHANDLE, "some/random/dir/file-" . $fileextension) уязвимы?

, где $fileextension может быть любым видом «имени файла» для каждого. Насколько я понимаю, это не будет уязвимым для имени файла, такого как | shutdown -r |, который будет выполнять команду на сервере.

+0

Это может быть не очень уязвимым, если аргумент имени файла начинается с строки литерала (хотя я бы не поставил большие суммы на него). Реальная уязвимость - это когда аргумент является именем переменной, возможно, полученным без проверки из аргумента командной строки. В любом случае нет веской причины не использовать 3-аргументную версию 'open'. Вы обеспокоены безопасностью какого-либо старого кода, который вы не можете обновить? –

+3

Это вопрос опасности и накладных расходов. Существует опасность. Эта опасность полностью устраняется тремя аргументами 'open'. Зачем пытаться смягчить этот риск, когда вам не нужно принимать его в первую очередь. – Sobrique

+0

В главе «Технологии безопасного программирования», посвященной освоению Perl, рассказывается о таких вещах. –

ответ

9
open(my $fh, "some/random/dir/file-" . $user_text) 

- полностью уязвим. Мало того, что неправильные инъекции делают его невозможно открыть файл с именем

some/random/dir/file-foo| 

он может быть использован для выполнения произвольных команд

$ perl -e'open(my $fh, "file-".$ARGV[0])' ' ; echo 0wned >&2 |' 
sh: 1: file-: not found 
0wned 
+0

спасибо за разъяснение –

+0

Я думаю, что это отличный ответ о том, почему 2 arg 'open' никогда не должны использоваться - уверен, вы можете убедиться, что вы проверяете свои входы и будьте осторожны, но зачем беспокоиться, когда вы можете гарантировать, что проблема никогда не существовала в первое место. – Sobrique

0

Простейшая возможная уязвимость, когда ваш $fileextension внезапно становится /../../../../../etc/passwd. Другая возможность заключается в том, чтобы сделать ваш "some/random/dir/file-" . $fileextension точкой для какого-либо существующего исполняемого файла, в этом случае отлично справится трюк с добавлением | any-command |.

+0

Примечание: для этого потребуется каталог, который начинается с 'some/random/dir/file -' – ikegami

+0

. Согласитесь - ваша идея передать команду оболочки напрямую намного лучше. – afenster

+0

Это не имеет ничего общего с открытием двух-arg; три-arg open были бы в равной степени уязвимы для этого. – ikegami

1

Я бы прокомментировать @ikegami отличного пост, но у меня нет разрешение.

Другим возможным вектором полезной нагрузки является запуск вредоносного ввода с = (равным), таким образом, имя, которое уже жестко запрограммировано, будет обрабатываться как переменная оболочки.

perl -e'open(my $fh, "file".$ARGV[0])' '=foo echo 0wned >&2 |' 

В некоторых случаях скрипты cgi останавливаются на ошибках, с этой полезной нагрузкой ошибка не генерируется.

Смежные вопросы