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}"
我想知道,现在最新版本的 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}"