【问题标题】:Are these awk commands vulnerable to code injection?这些 awk 命令是否容易受到代码注入的影响?
【发布时间】:2019-06-14 04:39:39
【问题描述】:

当我阅读How do I use shell variables in an awk script? 的答案时,我不确定如何正确编写使用 shell 变量的特定 awk 命令的脚本。

接受的答案演示了如何在awkcommand 中插入 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}' 但这不起作用。

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

【问题讨论】:

    标签: linux bash shell awk code-injection


    【解决方案1】:

    当然,两者都容易受到攻击,第一个稍微弱一点。

    这打破了你的第二行:

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

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

    【讨论】:

    • 太棒了。
    • 你能帮我让它运行sl吗?我试过HWLINK="\";sl -a;#"。没用。
    • 那行不通——此时,你在一个正则表达式中,所以\"最终只是试图匹配一个引用。我所做的是使用/{} 打破正则表达式,它与现有的/ 一起构成//{}(带有空语句的空正则表达式);然后使用 BEGIN{ ... } 在开始时调用 awk 代码;最后,我再次使用/,这样您的关闭/ 就不会在没有朋友的情况下挂起。此外,您将 shell 和 awk 混为一谈; sl 是一个 shell 命令,你不能像属于那里一样运行它。你必须使用system 命令。 "/{}BEGIN{system(\"sl -a\");exit}/"
    • 现在想象一下BEGIN语句中的以下代码{system( "rm -rf *") }
    • @EdMorton:问题是因为它没有被引用,任何空格都会终止 awk 脚本;如果你不能有空格来分隔它,globbing 将不会真正起作用。例如。如果您尝试输入 kvantour 的 {system("rm -rf *")},则 awk 脚本只会是 //{}BEGIN{system("rm,从而导致语法错误。编辑:但是,您可以在空格后加一个分号并编写普通的 bash 命令,这确实可以 glob... 是的,是的,你是对的,它是 more 所以。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我很难选择一个,因为两者都很有帮助(并且同样受到支持)。这次我和另一个一起去了,但你确实有我的支持。 p.s.:很棒的个人资料图片!
    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多