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

时间:2019-06-14 04:39:39

标签: linux bash shell awk 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 $1}'
ip -o route | awk "/$HWLINK/"' && ! /default/ {print $1}'

因此,主要问题是这些(或两者)中的任何一个是否易受攻击。

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

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

2 个答案:

答案 0 :(得分:4)

您的想法是正确的,让外壳变量在awk内插可以允许恶意代码注入。正确指出的是使用-v语法,但是您的尝试失败了,因为带有变量的模式匹配无法以/../的形式工作,请使用直接~匹配

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

建议清理传递给awk的变量的方法是使用ARGV数组或ENVIRON变量。通过这种方式传递的变量不会由外壳进行扩展

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

如果您将var的值打印在awk内,它将是文字foo\n\n,而 not 多行字符串通常会在外壳将其展开。

答案 1 :(得分:4)

当然,两者都很容易受到攻击,但第一个则不那么容易。

这会打断您的第二行:

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\"}/"

我看到您已经使用了正确的语法:)