繁体   English   中英

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

[英]How to execute Linux shell variables within double quotes?

如果没有有效的解决方案,我将面临以下黑客挑战,我们不知道。

我们有以下服务器脚本:

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类的OS命令,或者您认为“没有办法”?

我看不到执行任意命令的任何途径。 脚本每次被引用时都引用$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 foo -rf . bar ,然后是文件/home/user/foo -rf . bar.txt /home/user/foo -rf . bar.txt将被创建。

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

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

还有另外两个小问题,尽管我不知道如何恶意利用它们,但确实会导致脚本的行为与预期的有所不同。

  • read允许反斜杠转义字符,例如空格和换行符。 您可以输入\\ 空间嵌入空格和\\ 回车read分析输入的多条线。

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

使用read -rs或任何\\将丢失/未命中。

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

当然:

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

如果输入uname ,将显示Linux 但是请注意:这是一场安全噩梦。 如果有人输入rm -rf $HOME怎么办? 您还会对包含斜杠的命令有疑问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM