В вашем примере представлены три интересных вопроса, которые легче понять
в разлуке.
Во-первых, Windows позволяет выполнять несколько операторов в одной строке
разделяя знаком "&". Это потенциально может быть использовано при инъекционной атаке.
Во-вторых, ECHO анализирует и интерпретирует передаваемые ему сообщения. Если сообщение
«ВЫКЛ» или «/?» или даже пустым, то ECHO предоставит другой ожидаемый
поведение, чем просто копирование сообщения в стандартный вывод.
В-третьих, вы знаете, что можно ввести код в несколько
скриптовые языки, в том числе командные файлы, и хотите изучить способы
распознать его, чтобы вы могли лучше защищаться от него в своем коде.
Было бы легче распознать порядок, в котором происходят события
в вашем скрипте, если вы добавите оператор echo до и после
ты пытаешься ввести. Назовите это foo.bat.
@echo off
echo before
echo %1
echo after
Теперь вы можете легче определить, была ли ваша попытка инъекции выполнена в
командная строка (не инъекция) или была выполнена в результате параметра
расширение, которое вырвалось из оператора echo и выполнило новый оператор
(Инъекция).
foo dir
Результаты:
before
dir
after
Довольно нормально до сих пор. Попробуйте параметр, который эхо интерпретирует.
foo /?
Результаты:
before
Displays messages, or turns command-echoing on or off.
ECHO [ON | OFF]
ECHO [message]
Type ECHO without parameters to display the current echo setting.
after
Хм. Помощь по команде echo. Это, вероятно, не желаемое использование
эхо в этом командном файле, но это не инъекция. Параметры были
не используется для «выхода за пределы» либо эхо-оператора или
синтаксис командного файла.
foo dog & dir
Результаты:
before
dog
after
[A spill of my current directory]
Хорошо, режиссёр произошел вне сценария. Не впрыск.
foo ^&dir/w
Результат:
before
ECHO is off.
[A spill of my current directory in wide format]
after
Так вот, мы кое-что получили. DIR не является функцией ECHO и является
работает между утверждениями до и после. Давай попробуем
более драматично, но все же в основном безвредно.
foo ^&dir\/s
Хлоп! Вы можете передать произвольную команду, которая потенциально может повлиять
производительность вашей системы - все внутри безобидного "echo% 1".