Как выполнить команду 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\"";

Другие вопросы по тегам