2

我一直在学习远程/任意命令执行。在这样做的过程中,我遇到了一些我认为尝试和利用会很有趣的 Ruby。

当我设法让它运行“ls”命令时,我已经取得了一些成功,但我不知道如何在我的命令中添加空格字符。如果我在其中添加一个空格,则 URI 调用的 parse 方法会引发异常。

这是我试图利用的代码:

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)

也许这是不可能的?

谢谢

4

2 回答 2

5

您可以使用内部字段分隔符 ( <space><tab><newline>)。由于无论如何这都是外壳分隔的内容,因此它将接受它作为分隔符。

injection = "www.google.com';ls$IFS-l;#"

(顺便说一句,感谢周六晚上的精彩拼图。)

于 2012-09-02T01:10:54.810 回答
0

是 - 这是可能的。只需将您的字符串放在引号中:

1)从命令提示符:

two strings # 无引号:shell 看到两个字符串

"one string"# 使用单引号 (') 或双引号 ("),shell 只能看到一个字符串

2) 从字符串文字

mystring = "\"this will be interpreted as one string\"";

于 2012-09-02T00:31:34.230 回答