Bash 在此代码中可以使用eval进行代码注入吗?
这是我第一次使用bash,我知道eval在使用它时会有一些风险。你能给它注入代码吗?例如,我想运行ls命令并查看文件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
#!/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”的内容?