这些 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\"}/"
我看到你已经掌握了正确的语法:)
当我阅读 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\"}/"
我看到你已经掌握了正确的语法:)