【发布时间】: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 这样的操作系统命令,或者你认为“不可能”?
【问题讨论】:
我有以下黑客挑战,我们不知道是否有有效的解决方案。
我们有以下服务器脚本:
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 允许反斜杠转义空格和换行符等字符。您可以输入 \space 来嵌入空格,\enter 让read 解析多行输入。
echo 接受几个标志。如果$s 是-n 或-e 那么它实际上不会回显$s;相反,它会将$s 解释为命令行标志。
【讨论】:
使用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
【讨论】:
当然:
read s
$s > /home/user/"$s".txt
如果我输入uname,则会打印出Linux。但请注意:这是一场安全噩梦。如果有人输入rm -rf $HOME 怎么办?包含斜杠的命令也会有问题。
【讨论】:
$s可以被控制。我认为这意味着脚本就是这样,无法更改。