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

Are these awk commands vulnerable to code injection?

当我阅读 How do I use shell variables in an awk script?.

的答案时,我不确定如何正确编写使用 shell 变量的特定 awk 命令的脚本

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

#HWLINK=enp10s0
ip -o route | awk '/'$HWLINK'/ && ! /default/ {print }'
ip -o route | awk "/$HWLINK/"' && ! /default/ {print }'

因此,主要问题是这些(或两者)是否存在漏洞。

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

p.s。这是一个重构;原始命令是 ip -o route | grep $HWLINK | grep -v default | awk '{print }'.

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

ip -o route | awk -v hwlink="$HWLINK" '[=10=] ~ hwlink && ! /default/ {print }'

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

进行扩展
value='foo\n\n'
awk 'BEGIN {var=ARGV[1]; delete ARGV[1]}' "$value"

如果您在 awk 中打印 var 的值,它将是文字 foo\n\n 而不是 multi-line 字符串,通常在 shell 扩展它时发生。

当然,两者都很脆弱,第一个不那么脆弱。

这打破了你的第二行:

HWLINK="/{}BEGIN{print \"Your mother was a hamster and your father smelt of elderberries\"}/"

它不会中断您的第一行的唯一原因是,为了能够注入到第一行,它不能包含空格。

HWLINK="/{}BEGIN{print\"Your_mother_was_a_hamster_and_your_father_smelt_of_elderberries\"}/"

我看到你已经掌握了正确的语法:)