这些 awk 命令是否容易受到代码注入的攻击?

Mar*_*377 2 linux bash shell awk code-injection

当我阅读如何在 awk 脚本中使用 shell 变量? 的答案时,我不确定如何正确编写使用 shell 变量的特定 awk 命令脚本。。

接受的答案演示了在命令中插入 shell 变量如何awk容易发生恶意代码注入,虽然我能够重现该演示,但我无法使用以下两个命令中的任何一个找到相同的问题:

#HWLINK=enp10s0
ip -o route | awk '/'$HWLINK'/ && ! /default/ {print $1}'
ip -o route | awk "/$HWLINK/"' && ! /default/ {print $1}'
Run Code Online (Sandbox Code Playgroud)

因此,主要问题是其中任何一个(或两个)是否容易受到攻击。

第二个问题是哪种形式是首选。我尝试过ip -o route | awk -v hwlink="$HWLINK" '/hwlink/ && ! /default/ {print $1}',但这不起作用。

ps这是一个重构;原来的命令是ip -o route | grep $HWLINK | grep -v default | awk '{print $1}'.

Ini*_*ian 5

您的想法是正确的,让 shell 变量插入内部awk可能会导致恶意代码注入。正如正确指出的那样,使用-v语法,但是您的尝试失败了,因为与变量的模式匹配在表单中不起作用/../,请使用直接~匹配

ip -o route | awk -v hwlink="$HWLINK" '$0 ~ hwlink && ! /default/ {print $1}'
Run Code Online (Sandbox Code Playgroud)

清理传递给的变量的推荐方法awk是使用ARGV数组或ENVIRON变量。以这种方式传递的变量不会经过 shell 进行的扩展

value='foo\n\n'
awk 'BEGIN {var=ARGV[1]; delete ARGV[1]}' "$value"
Run Code Online (Sandbox Code Playgroud)

如果打印var内部的值awk,它将是一个文字foo\n\n,而不是shell 展开它时通常发生的多行字符串。