Bash 在此代码中可以使用eval进行代码注入吗?

Bash 在此代码中可以使用eval进行代码注入吗?,bash,code-injection,compgen,Bash,Code Injection,Compgen,这是我第一次使用bash,我知道eval在使用它时会有一些风险。你能给它注入代码吗?例如,我想运行ls命令并查看文件 #!/bin/bash echo "[*] Please enter the name:" echo -n "> " read NAME echo "[*] Please enter the value:" echo -n "> " read VALUE declare CONFIG_$N

这是我第一次使用bash,我知道eval在使用它时会有一些风险。你能给它注入代码吗?例如,我想运行ls命令并查看文件

#!/bin/bash
echo "[*] Please enter the name:"
echo -n "> "
read NAME
echo "[*] Please enter the value:"
echo -n "> "
read VALUE
declare CONFIG_$NAME=$VALUE
for VARIABLE in $(compgen -v CONFIG_)
do
   echo "- $VARIABLE: $(eval echo \$$VARIABLE)"
done

如果
$VARIABLE
包含
执行后的命令

VARIABLE=';ls'
echo "- $VARIABLE: $(eval echo \$$VARIABLE)"
eval
执行的命令为

echo $;ls
因为
$
后面没有标识符,所以它只是字面上的回声。然后执行
ls

您还可以在开头添加有效的标识符:

foo=123
VARIABLE="foo;ls"
这将执行

echo $foo;ls

因此,它将回显
123
,然后返回
ls

的输出。除了在bash3.2+中使用
eval
之外,您还可以使用间接变量引用
${!varname}

$中变量的
(compgen-v CONFIG_41;
做
echo“-$variable:${!variable}”
完成
对于Bash版本4.2+,您可以对nameref变量
declare-nvar
执行相同的操作:

$中变量的
(compgen-v CONFIG_41;
做
声明-n值=$variable
echo“-$variable:$value”
完成

我相信
eval
的这种特殊用法是安全的,因为它只对有效标识符进行操作,或者需要对执行进行一定程度的控制,从而使利用漏洞本身变得毫无意义

作为攻击者,我会忽略
eval
,而使用其他入口点,例如

$ ./myscript
[*] Please enter the name:
> [`date>&2`]
[*] Please enter the value:
> foo
Thu 05 Nov 2020 04:00:37 PM PST
- CONFIG_: foo

如果
$VARIABLE
的扩展包含
;ls
它将被注入。但是,
compgen
可能会添加额外的引号,以防止这种情况发生。我尝试将$VARIABLE设置为;ls,但这将是一个无效的标识符,无法工作。感谢您的回答,它帮助了很多!是否有可能有变量be;什么?因为当我尝试它时,我得到了“无效标识符”错误。我执行了我在Mac上显示的代码。也许bash的更高版本不允许这样做。我只是在运行bash 5.0.3的Linux上尝试了一下,它也起了作用。@Barmar在脚本中,
VARIABLE
是从
compgen-v CONFIG\uu
的输出中设置的——有没有办法让它输出包含“ls”的内容?