shell 脚本中是否可以在不使用 eval 的情况下进行命令注入?

Is command injection possible within shell scripts without the use of eval?

我想知道,现在最新版本的 sh、bash、ksh 等是否可以通过执行这个(非常简单的)脚本来获得命令注入?

#!/bin/sh

echo "What is the name of the program you are looking for?"
read program
locate $program

尽管事实上如果他们有 shell 就已经可以执行代码了,我只是想知道变量是否可以包含恶意代码,例如 PHP:

parameter=parameter;ls

还有shellshock(env variables)这个题可以忽略

是的,这是可能的。但它并不像你说的那么简单。 请参阅下面的一些示例。

它不会起作用:

$ read -p "Type some text:" var1
Type some text:Example;hostname

$ echo $var1
Example;hostname

$ $var1
Example;hostname: command not found

但是如果你这样使用,是的,它会起作用:

$ read -p "Type some text:" var1
Type some text:hostname

$ echo $var1
hostname

$ $var1
SSBLZMVM1

如果这样写,您永远不知道是否有 shell 实现可以像那样被欺骗。但是,为了安全起见,您可以将 locate 的参数放在引号中。然后扩展参数将被视为字:

#!/bin/sh

echo "What is the name of the program you are looking for?"
read program
locate "${program}"