我们的客户端有一个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路径有什么特别的东西让它无法写入该路径吗?或者我错过了什么?