3

这是我第一次使用 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
4

3 回答 3

2

我相信这种特殊的使用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-06T00:21:58.373 回答
1

if$VARIABLE包含;执行后的命令

VARIABLE=';ls'
echo "- $VARIABLE: $(eval echo \$$VARIABLE)"

执行的命令eval

echo $;ls

由于$后面没有标识符,因此它只是逐字逐句地回显。然后ls被执行。

您还可以在开头放置一个有效的标识符:

foo=123
VARIABLE="foo;ls"

这将执行

echo $foo;ls

所以它会回123ls.

于 2020-11-05T22:26:49.090 回答
1

eval除了与 Bash 3.2+一起使用之外,您还可以使用间接变量引用${!varname}

for variable in $(compgen -v CONFIG_)
do
   echo "- $variable: ${!variable}"
done

使用 Bash 4.2+ 版,您可以对nameref变量执行相同操作declare -n var

for variable in $(compgen -v CONFIG_)
do
  declare -n value=$variable
  echo "- $variable: $value"
done
于 2020-11-05T23:40:30.490 回答