众多 Web 应用程序在日常运作中,都离不开对文件的使用与管理。然而,一旦应用程序所采用的输入验证方法设计欠佳或部署不当,攻击者便有机可乘,利用这类漏洞对系统发起攻击,进而读取或写入那些本不应被随意访问的文件。在某些极端情形下,攻击者甚至能够借助此漏洞执行任意代码或系统命令。
传统意义上,Web 服务器与 Web 应用程序通常会部署身份验证机制,以此来管控对文件及资源的访问权限。Web 服务器会尽力将用户可访问的文件范围限定在 “根目录” 或者 “Web 文档根目录” 之内,而这两个目录在文件系统中实际上对应着一个物理目录。用户应将此目录视作 Web 应用程序层次结构的基础目录。
通过访问控制列表(ACL)来定义权限,这些列表能够识别哪些用户或用户组具备访问、修改或执行服务器上特定文件的权限。这些机制的设计初衷,在于防范恶意用户访问敏感文件(例如,在类 Unix 平台上常见的 /etc/passwd 文件),同时避免恶意用户执行系统命令。大量 Web 应用程序所采用的服务器端脚本,往往会涉及包含不同类型的文件。借助这些方法来管理图像、模板、加载静态文本等操作,在实际应用中极为普遍。但遗憾的是,倘若输入参数(如表单参数、cookie 值)未能得到妥善验证,这些应用程序便极有可能暴露出安全漏洞。在 Web 服务器和 Web 应用程序领域,此类问题频繁出现在路径遍历 / 文件包含攻击场景中。攻击者通过利用这一漏洞,能够读取那些他们通常无权访问的目录或文件,获取 Web 文档根目录之外的数据,甚至能够访问外部站点中包含的脚本及其他类型的文件。
测试目标
- 识别与路径遍历相关的注入点:精准定位应用程序中可能被攻击者利用进行路径遍历攻击的输入位置。
- 评估绕过技术并确定路径遍历的范围:深入分析攻击者可能采用的绕过现有安全机制的技术方法,并明确路径遍历漏洞可能影响的范围,以便全面评估风险。
测试方法
- 黑盒测试
输入向量枚举:为了确定应用程序的哪些部分容易受到输入验证绕过的影响,测试人员需要全面枚举应用程序中所有接受用户内容的部分。这不仅涵盖了 HTTP GET 和 POST 查询这类常见的数据传输方式,还包括文件上传以及 HTML 表单等用户交互元素。在此阶段,需要执行以下检查示例:
- 是否有用于文件相关操作的请求参数:仔细排查请求链接中是否存在与文件操作相关的参数,例如:
- http://example.com/getUserProfile.jsp?item=ikki.html
- http://example.com/index.php?file=content
- http://example.com/main.cgi?home=index.htm
- 是否有不寻常的文件扩展名:留意那些不符合常规应用场景的文件扩展名,它们可能暗示着潜在的安全风险或者异常的文件处理逻辑。
- 是否有有趣的变量名称:关注变量命名是否存在可疑之处,一些具有误导性或暗示特殊功能的变量名可能与漏洞相关。
- 是否可以识别 Web 应用程序使用的 cookie,以用于动态生成页面或模板:深入检查 cookie 信息,查看其中是否包含用于动态生成页面或模板的关键参数,例如:
- Cookie: ID=d9ccd3f4f9f18cc1:TM=2166255468:LM=1162655568:S=3cFpqbJgMSSPKVMV:TEMPLATE=flower
- Cookie: USER=1826cc8f:PSTYLE=GreenDotRed
测试技术
- 测试的下一个关键阶段是深入分析 Web 应用程序中存在的输入验证函数。以前述 getUserProfile.jsp 的例子来说,该动态页面负责从文件中加载静态信息并展示给用户。攻击者可能会尝试插入恶意字符串../../../../etc/passwd,试图包含 Linux/Unix 系统的密码哈希文件。显然,只有当应用程序的验证检查点未能有效拦截此类恶意输入时,这种攻击才有可能得逞。同时,根据文件系统的权限设置,Web 应用程序本身必须具备读取这些文件的权限,攻击才具备实际可行性。
- 需特别注意的是:为了成功测试此类漏洞,测试人员必须充分了解被测试系统的架构以及被请求文件的实际存储位置。例如,从 IIS Web 服务器请求 /etc/passwd 文件显然是毫无意义的,因为 IIS 服务器运行在 Windows 环境下,并不存在 /etc/passwd 这样的文件路径。
- http://example.com/getUserProfile.jsp?item=../../../../etc/passwd
另一个常见的攻击场景是针对来自外部来源包含的内容:
- http://example.com/index.php?file=http://www.OWASP.org/malicioustxt
- 这种攻击方式同样适用于 cookie 或者任何其他用于动态页面生成的输入向量。若想获取更多的文件包含攻击 Payload,可以在 PayloadsAllTheThings - File Inclusion 中进行查找。
- 值得强调的是,不同的操作系统所使用的路径分隔符存在差异:
开发人员在进行输入验证时,常常容易犯的一个错误是未能全面考虑到各种形式的编码情况,仅仅对基本编码内容进行验证。因此,若一开始使用的测试字符串未能成功触发漏洞,可以尝试更换另一种编码方案进行测试。相关的编码技术以及预先准备好的目录遍历攻击有效 Payload,可在 PayloadsAllTheThings - Directory Traversal 中获取。
Windows 特定注意事项
- Windows Shell:在 Windows Shell 环境下,将以下任何内容附加到 shell 命令中的路径后,都不会对命令的正常功能产生影响:
- 路径末尾的尖括号 <和>:例如,在执行某个涉及文件路径的命令时,即使在路径末尾添加了 <或>,系统仍会按照正常逻辑处理路径,不会将其视为非法字符或影响路径的解析。
- 路径末尾的双引号(正确闭合):若在路径末尾添加一对正确闭合的双引号,如 ",Windows Shell 会正确识别并处理路径,不会因双引号的存在而报错或改变路径的执行逻辑。
- Windows API:在任何 shell 命令或 API 调用中,当一个字符串被作为文件名时,以下项目会被系统丢弃:
- 句号:若文件名中包含单独的句号,如 file.,在通过 Windows API 进行处理时,该句号会被自动忽略,不影响文件的识别和操作。
- 空格:文件名中的空格在 Windows API 处理过程中也会被丢弃。例如,名为 file name.txt 的文件,在 API 调用时,系统会将其等同于 filename.txt 进行处理。
- Windows UNC 文件路径:该路径用于引用 SMB 共享上的文件。在某些情况下,应用程序可能被设置为允许引用远程 UNC 文件路径上的文件。此时,若攻击者能够利用相关漏洞,Windows SMB 服务器可能会将存储的凭据发送给攻击者,而攻击者可以通过特定手段捕获并破解这些凭据,从而获取非法访问权限。这些 UNC 路径还可以与自引用 IP 地址或者域名结合使用,以此实现规避过滤器的目的,或者用于访问那些攻击者自身无法直接访问,但 Web 服务器却有权限访问的 SMB 共享上的文件。例如:
- \server_or_ip\path\to\file.abc
- \?\server_or_ip\path\to\file.abc
- Windows NT 设备命名空间:此命名空间用于引用 Windows 设备。其中某些引用方式允许通过不同的路径去访问文件系统。例如:
- 可能等同于驱动器盘符,例如 c:\,甚至是没有指定盘符的驱动器卷:\.\GLOBALROOT\Device\HarddiskVolume1\,这种特殊的路径表示方式可以在特定场景下访问到与 c:\ 类似的文件系统位置,即使没有明确指定驱动器盘符。
- 指机器上的第一个光盘驱动器:\.\CdRom0\,通过此路径可以直接访问到机器上的第一个光盘驱动器,为攻击者提供了一种潜在的利用途径。
- 灰盒测试
当采用灰盒测试方法进行分析时,测试人员在整体流程上必须遵循与黑盒测试相同的基本步骤。然而,由于灰盒测试允许测试人员查看应用程序的源代码,这使得他们能够更加便捷、精准地搜索输入向量。在进行源代码审查时,测试人员可以借助一些简单实用的工具(例如 grep 命令),在应用程序代码中搜索一种或多种常见的关键模式,如包含函数 / 方法、文件系统操作等相关的代码片段。
此外,测试人员还可以借助在线代码搜索引擎(例如 Searchcode),在互联网上公开发布的开源软件中查找路径遍历漏洞。通过采用灰盒测试方法,能够发现一些在传统黑盒测试中难以察觉的漏洞。某些 Web 应用程序会使用存储在数据库中的值和参数来生成动态页面。当应用程序向数据库中添加数据时,攻击者有可能插入特制的路径遍历字符串。由于包含函数内部的参数看似处于内部环境且相对安全,但实际上可能并未经过严格的安全验证,这种隐藏较深的安全问题在普通测试中很难被发现。
再者,通过审查源代码,测试人员可以深入分析处理无效输入的函数逻辑。有些开发人员为了避免程序出现警告和错误,尝试对无效输入进行修改使其看似有效,但这种处理方式往往容易引入新的安全漏洞。
工具
- DotDotPwn - The Directory Traversal Fuzzer:这是一款专门针对目录遍历漏洞进行测试的工具,能够通过发送大量精心构造的测试数据,快速检测目标应用程序是否存在路径遍历漏洞。
- Path Traversal Fuzz Strings (from WFuzz Tool):该工具包含了一系列用于路径遍历测试的模糊字符串,可作为测试数据的来源,帮助测试人员更全面地检测应用程序对不同输入的响应,从而发现潜在的漏洞。
- ZAP:一款功能强大的开源 Web 应用程序安全测试工具,能够对 Web 应用进行全面扫描,其中包括对路径遍历和文件包含漏洞的检测。它不仅可以自动检测常见的安全问题,还支持手动测试和扩展插件,方便测试人员根据具体需求进行定制化测试。
- Burp Suite:同样是一款广受欢迎的 Web 安全测试工具,具备丰富的功能模块。在目录遍历和文件包含测试方面,它能够帮助测试人员拦截、修改和分析 HTTP 请求与响应,通过手动操作和自动化测试相结合的方式,精准定位应用程序中的安全漏洞。
- Encoding/Decoding tools:编码 / 解码工具在测试过程中起着重要作用。由于不同操作系统和应用程序对输入的编码方式可能存在差异,测试人员可以利用此类工具对测试数据进行各种编码转换,以模拟不同场景下的输入,从而提高检测漏洞的成功率。
- String searcher "grep":如前文所述,grep 命令是一款在源代码审查中非常实用的字符串搜索工具。它能够快速在大量代码文件中查找特定的字符串模式,帮助测试人员定位与文件操作、路径处理相关的代码片段,进而分析是否存在安全漏洞。
- DirBuster:主要用于目录枚举,通过尝试各种常见的目录和文件名,探测 Web 服务器上可能存在的隐藏目录和文件。在路径遍历测试中,它可以辅助测试人员了解目标服务器的目录结构,为进一步的漏洞检测提供基础信息。