在Windows上防止外壳注射
问题描述:
这是否认为安全?在Windows上防止外壳注射
def clipboard(foo):
import sys, subprocess
system = sys.platform
if 'win' in system:
cmd = 'echo %s | CLIP' % (foo,)
subprocess.call(cmd, shell=True)
if __name__ == '__main__':
clipboard('RMDIR /S/Q C:\') #something terrible that actually works.
不用说,这只是将一些输入复制到剪贴板。我问:通过将我的参数包装成格式化的字符串,引用元组中的元素,我是否可以防止发生shell注入攻击?
答
没有,外壳注塑仍然发生在你的情况这: 剪贴板(“你好; RMDIR/S/Q C:\”) 这将会把“你好”到剪贴板,但执行命令rmdir。
可能使用引号和shlex可以帮助,如:
import shlex
if 'win' in system:
safe_arg='"%s"'%foo
assert len(shlex.split(safe_arg)) == 1, "Injection attempt detected"
cmd = 'echo %s | CLIP' % (safe_arg,)
编辑:上面的代码仍然是既不安全也不强劲。我认为以下情况至少会有所好转,但仍可能有误报:
foo = str(foo.strip('"').strip())
safe_arg = '"%s"'%foo
if '"' in foo:
if (len(shlex.split(safe_arg, False, False)) != 1): ...
+0
我试图将'shlex'和'Popen'一起使用,就像[在他们的例子中](http://docs.python.org/library/subprocess.html#subprocess.Popen)所示的文档一样。我没想过用'shlex'来验证参数。这很实用,很容易理解。谢谢。 – Droogans 2012-03-02 16:21:55
答
如果您使用read in the manual,在shell中执行命令容易受到注入攻击,如果您使用来自不可信源的未处理文本作为命令。如果程序使用的权限比用户通常拥有的权限多,这只是一个问题。
这与不可变对象的问题完全分离。 Python字符串是immutable。
'shell是否等于true ...现在怎么办?代表一些用户输入? – 2012-03-01 19:24:31
我为你澄清。 – Droogans 2012-03-01 20:36:56