如何在双引号内执行Linux shell变量?

时间:2013-12-10 14:17:07

标签: linux shell variables sh

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

我们有以下服务器脚本:

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这样的操作系统命令,或者您认为“没办法”?

3 个答案:

答案 0 :(得分:3)

我没有看到执行任意命令的任何途径。每次引用脚本时都会引用$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 来嵌入空格,然后输入 \ 输入,让read解析多行输入

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

答案 1 :(得分: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

答案 2 :(得分:1)

不确定

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

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