【问题标题】:How to execute Linux shell variables within double quotes?如何在双引号内执行 Linux shell 变量?
【发布时间】:2013-12-10 14:17:06
【问题描述】:

我有以下黑客挑战,我们不知道是否有有效的解决方案。

我们有以下服务器脚本:

read s  # read user input into var s
echo "$s"

# tests if it starts with 'a-f'

echo "$s" > "/home/user/${s}.txt"

我们只控制输入“$s”。是否有可能发送像uname 这样的操作系统命令,或者你认为“不可能”?

【问题讨论】:

    标签: linux shell variables sh


    【解决方案1】:

    我看不到执行任意命令的任何途径。该脚本在每次被引用时都会引用$s,因此限制了您可以执行的操作。

    我看到的唯一严重的攻击向量是echo 语句写入基于$s 的文件名。由于您控制$s,因此您可以使脚本写入一些意想不到的位置。

    • $s 可以包含类似bob/important.txt 的字符串。如果以足够的权限执行,此脚本将覆盖/home/user/bob/important.txt。抱歉,鲍勃!

    • 或者,更糟糕的是,$s 可能是 bob/../../../etc/passwd。该脚本将尝试写入/home/user/bob/../../../etc/passwd。如果脚本以 root 身份运行...呃哦!

    需要注意的是,脚本只有在拥有正确权限的情况下才能写入这些地方。

    • 您可以在$s 中嵌入不寻常的字符,这会导致创建不规则的文件名。不小心的脚本可能会被利用。例如,如果 $sfoo -rf . bar,则将创建文件 /home/user/foo -rf . bar.txt

      如果有人跑for file in /home/user; rm $file; done,他们手上会有惊喜。他们最终会运行rm /home/user/foo -rf . bar.txt,这是一场灾难。如果您取出/home/user/foobar.txt,您将留下rm -rf . — 当前目录中的所有内容都将被删除。糟糕!

      (他们应该引用"$file"!)

    还有另外两件小事,虽然我不知道如何恶意利用它们,但确实会导致脚本的行为与预期略有不同。

    • read 允许反斜杠转义空格和换行符等字符。您可以输入 \space 来嵌入空格,\enterread 解析多行输入。

    • echo 接受几个标志。如果$s-n-e 那么它实际上不会回显$s;相反,它会将$s 解释为命令行标志。

    【讨论】:

      【解决方案2】:

      使用read -r s 或任何\ 将被您的命令丢失/错误解释。

      read -r s?"Your input: "
      if [ -n "${s}" ]
       then
         # "filter" file name from command
         echo "${s##*/}" | sed 's|^ *\([[:alnum:]_]\{1,\}\)[[:blank:]].*|/home/user/\1.txt|' | read Output
      
         (
          # put any limitation on user here
          ulimit -t 5 1>/dev/null 2>&1
      
          `${read}`    
         ) > ${OutPut}
       else
         echo "Bad command" > /home/user/Error.txt
       fi
      

      【讨论】:

        【解决方案3】:

        当然:

        read s
        $s > /home/user/"$s".txt
        

        如果我输入uname,则会打印出Linux。但请注意:这是一场安全噩梦。如果有人输入rm -rf $HOME 怎么办?包含斜杠的命令也会有问题。

        【讨论】:

        • 我同意你对安全噩梦的看法。但是只要这个人没有root权限,它只会杀死用户的主目录(虽然用户可能会责怪程序员..)。
        • 问题假设只有$s可以被控制。我认为这意味着脚本就是这样,无法更改。
        猜你喜欢
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2019-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多