Инъекция Баша из переменной - PullRequest
0 голосов
/ 30 января 2019

У меня есть фрагмент кода, работающий на очень удаленном сервере

ID=555
SLEEP_TIME=`ssh user@192.168.1.1 "cat /tmp/$ID.sleep; date >> /tmp/$ID.log"`
echo SLEEP_TIME $SLEEP_TIME
sleep $SLEEP_TIME

Да, без кавычек вокруг $ SLEEP_TIME.ssh user@192.168.1.1 работает нормально, без пароля, по ключу.Я вижу обновление /tmp/555.log.Извините, я потерял контроль над этим удаленным сервером (на котором выше выполняется код cron), допустив ошибку в конфигурации sshd.Но я управляю сервером 192.168.1.1 и могу помещать все что угодно в переменную /tmp/555.sleep = $ SLEEP_TIME. Как добавить код в переменную $ SLEEP_TIME, заставляя удаленный сервер выполнять его?

Это 100%законны.Оба сервера принадлежат моей компании.Пожалуйста спаси меня!Действительно, я потерял контроль над удаленным сервером, потому что я использовал сложный трюк с переадресацией портов для доступа к нему, так как его IP-адрес NATs несколько раз.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Как я могу вставить некоторый код в переменную $ SLEEP_TIME, заставляя удаленный сервер выполнить его?

Вы не можете. Расширение оболочки происходит один раз за команду. Расширение оболочки делает расширение параметра оболочки или подстановка команд .Это происходит одновременно.Вы не можете сделать оба.Вы не можете сначала развернуть переменную, а затем развернуть ее во второй раз, чтобы выполнить подстановку команд, потому что это два раскрытия.С здесь .

(Можно утверждать, что перенаправления происходят после расширения оболочки в bash за это , нопростой тест показывает, что это не так. Интересно, если это специально. Но руководство по Bash не было написано для языковых слоев. Вот почему это «руководство», а не «спецификация».)

Цитирование этоиспользуется для запрета разделения слов.Единственное, что вы можете сделать, - это сделать ваш скрипт ошибочным, передав непарсируемый аргумент в sleep или передав два или более аргументов в сон.

Также, пожалуйста, не используйте backticks `` для подстановки команд.Они устарели, не могут быть вложенными, нечитаемыми и выглядят безобразно.Используйте $(...).

0 голосов
/ 30 января 2019

Поскольку SLEEP_TIME является просто переменной и не выполняется, я не думаю, что есть способ сделать это.Так что нет, насколько я могу видеть, извините.

...