Как выполнить команду unix без использования пробела, чтобы выполнить удаленную команду?
Я изучал удаленное / произвольное выполнение команд. При этом я наткнулся на какой-то Ruby, который, как мне показалось, будет интересно попробовать.
Я был несколько успешным, так как мне удалось заставить его выполнить команду 'ls', но я не могу понять, как добавлять пробелы в мои команды. Если я добавлю пробел, метод синтаксического анализа, который вызывает URI, выдает исключение.
Вот код, который я пытался использовать:
injection = "www.google.com';ls;#"
require 'uri'
URI.parse(injection)
puts `curl '#{injection}'`
Таким образом, ваша задача, если вы решите принять ее, это запустить команду "ls -l" вместо "ls", просто изменив строку ввода. Вы не можете изменить ничего, кроме первой строки.
Вещи, которые я пробовал:
ls%2f-l - # Doesn't raise an exception but unix doesn't unescape CGI encodings.
ls\x20-l - # Raises an exception because Ruby parses the UTF-8.
# Other various escape combinations (\\x20, etc)
Может быть, это невозможно?
Спасибо
2 ответа
Вы можете использовать внутренний разделитель полей (<space><tab><newline>
). Так как это то, с чем оболочка в любом случае разделяется, она примет это как разделитель.
injection = "www.google.com';ls$IFS-l;#"
(Кстати, спасибо за хорошую загадку субботнего вечера.)
Это возможно. Просто поместите вашу строку в кавычки:
1) из командной строки:
two strings
# Без кавычек: оболочка видит две строки
"one string"
# с одинарными (') или двойными кавычками (") оболочка видит только одну строку
2) из строкового литерала
mystring = "\"this will be interpreted as one string\"";