我对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中?
答案 0 :(得分:3)
这不是您脚本中的错误。您的调用等同于
rm test
./test.sh " ; "
没有任何内容可以传递给$1
,导致test.sh
执行任意命令。
除了能够阅读任何文件,包括/dev/zero
之类的无限文件以及可能阻止/dev/stdin
之类的文件外,唯一可能的问题是您可以传入选项,例如{{1} }。
可以避免这种情况
-v
Bash脚本本身通常是数据安全的,但是像SQL注入和system()调用一样,注入攻击可能发生在例如cat -- "$1"
,sed
,awk
以及大量其他命令未正确使用,引用错误可能会触发逻辑错误。
这些东西很少与tar
或`..`
等shell语法有关,而且更像是与“w foo”等看似无辜的字符串相关,因此很难在更高级别上进行过滤。