我有以下的黑客挑战,我们不知道,如果有一个有效的解决方案。如何在双引号内执行Linux shell变量?
我们有以下服务器脚本:
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变量?
我们有以下服务器脚本:
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
或者您认为“无路可走”?
我没有看到执行任意命令的任何途径。每次引用脚本时都会引用$s
,这样就限制了您可以执行的操作。
我看到的唯一严重的攻击媒介是echo
语句写入基于$s
的文件名。由于您控制着$s
,因此可以使脚本写入一些意外的位置。
$s
可能包含像bob/important.txt
这样的字符串。如果以足够的权限执行,该脚本将覆盖/home/user/bob/important.txt
。对不起,鲍勃!
或者更糟的是,$s
可能是bob/../../../etc/passwd
。该脚本会尝试写入/home/user/bob/../../../etc/passwd
。如果脚本以root身份运行......呃哦!
重要的是要注意脚本只能写入这些地方,如果它具有正确的权限。
你可以在$s
嵌入特殊字符会导致创建不规则的文件名。不小心的脚本可以被利用。例如,如果$s
是foo -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/foo
和bar.txt
你留下了rm -rf .
—一切都在当前目录中被删除。哎呀!
(他们应该引述"$file"
!)
还有其他两个小东西,虽然我不知道如何利用这些恶意,做导致脚本的行为稍有不同比打算。
read
允许反斜杠转义空格和换行符等字符。您可以输入\空间嵌入空间和\进入有read
分析输入的多条线。
echo
接受一对标志。如果$s
是-n
或-e
那么它实际上不会回显$s
;相反,它会将$s
解释为命令行标志。
肯定的:
read s
$s > /home/user/"$s".txt
如果我进入uname
,这个打印Linux
。但要小心:这是一个安全噩梦。如果有人输入rm -rf $HOME
怎么办?您也可能遇到包含斜线的命令问题。
使用read -r s
或任何\
将会丢失/你的命令missinterpreted。
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
我同意你在安全噩梦。但只要这个人没有root权限,它只会杀死用户的主目录(用户可能会责怪程序员,尽管..)。 – fuesika
这个问题假设只有'$ s'可以被控制。我认为这意味着脚本就是它,它不能改变。 –