这是我第一次使用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
发布于 2020-11-06 00:21:58
我相信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
发布于 2020-11-05 22:26:49
如果$VARIABLE
包含;
,则将执行该命令之后的命令
VARIABLE=';ls'
echo "- $VARIABLE: $(eval echo \$$VARIABLE)"
eval
执行的命令是
echo $;ls
因为$
后面没有标识符,所以它只是按字面意思回显。然后执行ls
。
您还可以在开头放置一个有效的标识符:
foo=123
VARIABLE="foo;ls"
这将执行
echo $foo;ls
因此,它将回显123
,然后返回ls
的输出。
发布于 2020-11-05 23:40:30
除了在Bash 3.2+中使用eval
之外,还可以使用间接变量引用${!varname}
for variable in $(compgen -v CONFIG_)
do
echo "- $variable: ${!variable}"
done
使用Bash版本的4.2+,您可以对nameref variables declare -n var
执行相同的操作
for variable in $(compgen -v CONFIG_)
do
declare -n value=$variable
echo "- $variable: $value"
done
https://stackoverflow.com/questions/64705997
复制相似问题