1

我对 bash 脚本的安全性有一些疑问。

我有一个名为 的脚本test.sh,看起来像

#!/bin/bash
cat "$1"

是的,非常棒和无辜的脚本......但是当用户(比如使用这个 cgi 脚本的网络用户)给我一个参数 " ; rm -rf /*"或者使用命令替换"`rm -rf /*`"它不是一个好的情况。

所以,这里有一个小测试:

touch test; ./test.sh " ; `rm test`" &>/dev/null; [[ -f "test" ]] && echo ":)" || echo ":("

这将打印出悲伤的脸。

我知道脚本的执行应该以某些具有受限权限的预定义用户(如 apache)身份运行。即使通过此选项访问网络空间文件或资源也存在安全风险。

这可以通过一些正则表达式等在每个脚本中轻松解决......但是,这真的应该在脚本中解决吗?还是在apache和linux中?

4

1 回答 1

3

这不是您的脚本中的错误。您的调用相当于

rm test
./test.sh " ; "

您不能传入任何内容,因为$1这将导致test.sh执行任意命令。

除了读取任何文件的能力,包括无限的文件/dev/zero和可能阻塞的文件,/dev/stdin唯一的潜在问题是你可以传入选项,比如-v.

这可以避免

cat -- "$1"

Bash 脚本本身通常是数据安全的,但就像 SQL 注入和 system() 调用一样,注入攻击可能会在例如sed、和大量其他命令未正确使用时发生,并且引用错误会触发逻辑错误awktar

这些东西很少与像“w foo”这样看似无辜的字符串相关,`..`或者$(..)更多地与shell语法相关,因此它们很难在更高级别上过滤。

于 2013-06-06T23:05:16.677 回答