TRC技术讲座 目录穿越的攻击和防御 - 第一部分


我在 威胁研究中心 的渗透测试团队工作,与使用网站动态扫描作为其应用安全解决方案一部分的客户合作。应用安全是更大的网络安全生态系统的一个关键部分,负责处理直接针对面向用户的界面的黑客攻击。我的工作是在应用程序中找到易受攻击的功能,并让客户的开发团队知道他们需要在哪里修复他们的代码。

下面是我在一个客户的实际网站上发现的一个目录穿越黑客,正如他们所说的 "在野外"。我们的客户是一个涉及信息管理的大型企业客户,但这可能存在于许多允许用户上传和下载文件的网络应用程序中。

在开放网络应用安全项目(OWASP)的术语中,目录穿越攻击属于前10名中的A4类。 不安全的直接对象引用 。目录遍历攻击的目的是访问存储在网络根文件夹之外的文件和目录。通过操纵以 "点-点-斜线(.../)"序列引用文件的变量及其变化,或通过使用绝对文件路径,黑客可能能够访问存储在文件系统中的任意文件和目录--包括应用程序源代码或配置和关键系统文件。这种类型的攻击被称为 "点状斜线"、"路径穿越"、"目录穿越"、"目录爬升 "和 "回溯"。应该注意的是,对文件的访问受到系统操作访问控制的限制(例如在微软视窗操作系统上的 "锁定 "或 "使用中 "的文件)。

在大多数情况下,我看到的问题是,通过使用点-点-斜线序列,可以通过下载功能访问非预期的内容,但在这种情况下,我能够*上传*文件到一个非预期的位置。

这里有一个简化的例子([编辑]名字的地方,以保护无辜者)。

文件应该放到特定活动的文件子文件夹中,但我却把它们放到了主项目文件夹中。文件名中的每个点点斜线都被解释为在文件路径中上升一级的指令。简化的图示。

Picture1

接下来的部分包括我在测试时看到的实际请求(又做了一些删减)。你可以看到,在上传新文件的POST正文请求中,包含了带有dod-dot-斜线字符的文件名。

好的,所以POST请求到。

site.com/filepath/filepath/task/uploadFileAndDetails.do

content-type: multipart/form-data

The filename is submitted in the following places in the POST data:

Content-Disposition: form-data; name=”fileName” /../../WHS Testfile Plaintext

—————————–478258899660247721576781152

Content-Disposition: form-data; name=”file”; filename=”/../../WHS Testfile Plaintext”

Content-Type: application/octet-stream

The response was positive but uninformative:

{“status”:0,”message”:”Success”,”result”:null}

发送的改变文件名的请求在 "FileDestinationPath "参数中向我们展示了更多关于文件被存储的地方。

{“activitySid”:5504,”taskSid”:0,”fileDetailsVOs”:[{“fileName”:”/../../Testfile 
  Plaintext”,”file”:null,”fileLookupSid”:950,”fileTypeName”:”Other (optional)”,”fileDescription”:” 
    “,”taskNumbers”:””,”oldTaskSeqNumbers”:””,”fileUploadedDate”:”Apr 27 2016 22:28:10″,”fileModifiedDate”:”Feb 23 2015 
      18:05:50″,”operation”:”U”,”fileDestinationPath”:”/apps/[redacted]_data/[redacted]Files/UploadedFiles/04/5504″,”hasFileUploaded”:”Y”,”hasToBeDeleted”:”Y”,”oldFileName”:”/../../Testfile Plaintext”}]}

最后是下载文件的请求,URL参数 "FileLocView "中显示的文件路径描述了应用程序应该从哪里获取我想要的文件。

检索/重新下载文件的完整请求。

https:// site.com/filepath/filepath/viewFileOpen.do?fileLocView=/

apps/[redacted]_data/[redacted]Files/UploadedFiles/02/5502/ZIPOUTPUT// ../../WHS Testfile

Plaintext

以"/.../.../whstestfile "文件名上传的文件可以通过进入(应用程序提供的默认位置)"...UploadedFiles/02/5502/ZIPOUTPUT//.../.../whstestfile "或"...UploadedFiles/whstestfile "来访问。

通过删除标记,我可以看到我的文件被存储(在这种情况下)在项目文件夹的 "Uploaded Files "中。

为了检查所有的活动都上传到相同的UploadedFiles文件夹,我去了一个不同的活动,上传了一个新的文件,但使用了相同的文件名。在这个例子中,新的非法文件覆盖了第一个非法文件,我通过下载文件并检查内容是原始文本还是新文本来验证。

最后,我完全改变了下载请求,并能够访问Hosts文件(/.../.../.../etc/hosts)。这意味着我被允许进入那些我不应该从网访问的目录。由于显而易见的原因,我没有*试图覆盖生产服务器上的localhost文件,但这种漏洞的组合有一些非常严重的负面潜力--这是一个糟糕的路径遍历漏洞组合。