为什么运行virtualenv的django无法写入该路径?

时间:2016-06-10 08:34:59

标签: python linux django security virtualenv

我们的客户端有一个Web应用程序,它在Ubuntu服务器上运行virtualenv的Django实例。我们对该服务进行了安全审核,并在文件上载表单中发现了一个路径遍历漏洞,该漏洞可能允许攻击者在django用户拥有的路径中写入任意文件。例如:

参数"导入名称"提供值

../some/path/to/create

然后为表单文件字段提供仲裁filename和正确的文件内容

然后应用程序

try:
    path = os.path.join(DEFAULT_UPLOAD_DIR, <Import Name>)
    os.mkdir(path)
    ...
    with open(os.path.join(path, <Filename From Form>)) as upload_file:
        upload_file.write(<File Contents>)
    ...

不安全os.path.join允许攻击者在目录树中向上走,并上传到DEFAULT_UPLOAD_DIR以外的其他目录。所以基本上如果攻击者能够找到服务器上尚未存在的路径,他就能够创建该文件夹,避免os.mkdir()try...except的失败文件上传到那里。

如果攻击者能够写入

,这就转化为真正的漏洞利用
../virtualenvs/<env name>/lib/python2.7/

因为例如Django模块是从virtualenv python目录中的子目录site-packages加载的,而pythonpath告诉我们直接在lib/python2.7下首先加载的是什么,基本上模块加载顺序允许攻击者&# 39;覆盖&#39;一个模块,确保他们的代码在导入时运行。

我们进行了概念验证渗透测试并写信给

../virtualenvs/somepath/__init__.py

哪个成功但由于某种原因我们无法写信

../virtualenvs/<actual env name>/

这是奇怪的,因为权限与somepath完全相同,所有者/组在两种情况下都是Django用户。为Django用户启用virtualenv并转到python shell它允许我进行写操作,因此从易受攻击的表单视图中调用时它似乎很奇怪。

问题是: Django实例运行的virtualenv路径有什么特别的东西让它无法写入该路径吗?或者我错过了什么?

0 个答案:

没有答案