4.5.1- 测试目录遍历文件包含

测试目录遍历文件包含

ID
WSTG-ATHZ-01

总结

许多 Web 应用程序使用和管理文件作为其日常操作的一部分。使用设计或部署不当的输入验证方法,攻击者可以利用该系统来读取或写入无法访问的文件。在特定情况下,可以执行任意代码或系统命令。

传统上,Web 服务器和 Web 应用程序实施身份验证机制来控制对文件和资源的访问。Web 服务器尝试将用户的文件限制在“根目录”或“Web 文档根目录”中,该目录表示文件系统上的物理目录。用户必须将此目录视为 Web 应用程序分层结构的基本目录。

权限的定义是使用访问控制列表 (ACL) 进行的,该列表标识哪些用户或组应该能够访问、修改或执行服务器上的特定文件。这些机制旨在防止恶意用户访问敏感文件(例如,类 UNIX 平台上的公共文件 /etc/passwd )或避免执行系统命令。

许多 Web 应用程序使用服务器端脚本来包含不同类型的文件。使用此方法来管理图像、模板、加载静态文本等是很常见的。不幸的是,如果输入参数(即表单参数、cookie 值)未正确验证,这些应用程序会暴露安全漏洞。

在 Web 服务器和 Web 应用程序中,此类问题出现在路径遍历/文件包含攻击中。通过利用此类漏洞,攻击者能够读取他们通常无法读取的目录或文件,访问 Web 文档根目录之外的数据,或者包含来自外部站点的脚本和其他类型的文件。

出于OWASP测试指南的目的,仅考虑与Web应用程序相关的安全威胁,而不考虑对Web服务器的威胁(例如,臭名昭著的Microsoft IIS Web服务器的转义代码%5c )。进一步的阅读建议将在参考资料部分为感兴趣的读者提供。

这种攻击也称为点-点-斜杠攻击(../)、目录遍历、目录爬升或回溯。

在评估期间,为了发现路径遍历和文件包含缺陷,测试人员需要执行两个不同的阶段:

  1. 输入向量枚举(对每个输入向量的系统评估)
  2. 测试技术(对攻击者用来利用漏洞的每种攻击技术进行系统评估)

测试目标

  • 确定与路径遍历相关的注入点。
  • 评估绕过技术并确定路径遍历的程度。

如何测试

黑盒测试

输入向量枚举

为了确定应用程序的哪个部分容易受到输入验证绕过的影响,测试人员需要枚举应用程序中接受用户内容的所有部分。这还包括 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: 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 是没有意义的。/etc/passwd

http://example.com/getUserProfile.jsp?item=../../../../etc/passwd

另一个常见的示例是包含来自外部源的内容:

http://example.com/index.php?file=http://www.owasp.org/malicioustxt

这同样适用于 cookie 或用于动态页面生成的任何其他输入向量。

可以在 PayloadsAllTheThings - File Inclusion 中找到更多文件包含有效负载

需要注意的是,不同的操作系统使用不同的路径分隔符

  • 类 Unix 操作系统:
    • 根目录: /
    • 目录分隔符: /
  • Windows 操作系统:
    • 根目录: <drive letter>:
    • 目录分隔符: \ or /
  • Classic macOS:
    • 根目录:<drive letter>:
    • 目录分隔符::

开发人员经常犯的错误是,不期望每种形式的编码,因此只对基本编码内容进行验证。如果一开始测试字符串不成功,请尝试其他编码方案。

您可以在 PayloadsAllTheThings - Directory Traversal中找到编码技术和现成的目录遍历有效负载

Windows 特定注意事项
  • Windows shell:将以下任何内容附加到 shell 命令中使用的路径后,功能上没有区别:

    • 尖括号<> 路径末尾

    • 路径末尾的双引号(正确关闭)

    • 无关的当前目录标记,例如./ or .\\

    • 包含可能存在也可能不存在的任意项的无关父目录标记:

      • file.txt
      • file.txt...
      • file.txt<spaces>
      • file.txt""""
      • file.txt<<<>>><
      • ./././file.txt
      • nonexistant/../file.txt
  • Windows API:在将字符串作为文件名的任何 shell 命令或 API 调用中使用时,将丢弃以下项:

    • 时期
    • 空间
  • Windows UNC 文件路径:用于引用 SMB 共享上的文件。有时,可以使应用程序引用远程 UNC 文件路径上的文件。如果是这样,Windows SMB 服务器可能会将存储的凭据发送给攻击者,这些凭据可以被捕获和破解。它们还可能与自引用 IP 地址或域名一起使用以逃避过滤器,或用于访问攻击者无法访问但可从 Web 服务器访问的 SMB 共享上的文件。

    • \\server_or_ip\path\to\file.abc
    • \\?\server_or_ip\path\to\file.abc
  • Windows NT 设备Namespace:用于引用 Windows 设备命名空间。某些引用将允许使用不同的路径访问文件系统。
    - 可能等同于驱动器号,例如 c:\,甚至是没有分配号的驱动器卷:\\.\GLOBALROOT\Device\HarddiskVolume1\
    - 指机器上的第一个光盘驱动器:\\.\CdRom0\

灰盒测试
当使用灰盒测试方法进行分析时,测试人员必须遵循与黑盒测试相同的方法。但是,由于他们可以查看源代码,因此可以更轻松、更准确地搜索输入向量。在源代码审查期间,他们可以使用简单的工具(如 grep 命令)在应用程序代码中搜索一个或多个常见模式:包含函数/方法、文件系统操作等。

  • PHP: include(), include_once(), require(), require_once(), fopen(), readfile(), ...
  • JSP/Servlet: java.io.File(), java.io.FileReader(), ...
  • ASP: include file, include virtual, ...

使用在线代码搜索引擎(例如, Searchcode),还可以在互联网上发布的开源软件中找到路径遍历缺陷。

对于 PHP,测试人员可以使用以下正则表达式:

(include|require)(_once)?\s*['"(]?\s*\$_(GET|POST|COOKIE)

使用灰盒测试方法,可以发现在标准黑盒评估中通常更难发现甚至不可能发现的漏洞。

某些 Web 应用程序使用存储在数据库中的值和参数生成动态页面。当应用程序将数据添加到数据库时,可以插入特制的路径遍历字符串。这种安全问题很难发现,因为包含函数中的参数看起来是内部的和安全的,但实际上并非如此。

此外,通过查看源代码,可以分析应该处理无效输入的函数:一些开发人员试图更改无效输入以使其有效,从而避免警告和错误。这些功能通常容易出现安全漏洞。

考虑具有以下说明的 Web 应用程序:

filename = Request.QueryString("file");
Replace(filename, "/","\");
Replace(filename, "..\","");

缺陷测试是通过以下方式实现的:

file=....//....//boot.ini
file=....\\....\\boot.ini
file= ..\..\boot.ini

Tools

引用

白皮书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值