网络应用安全指南/文件包含和泄露
外观
< 网络应用安全指南
如果要包含或发送以响应请求的文件的名称来自用户输入(例如,在菜单系统或下载脚本中),攻击者可能能够请求他们不应该获得的文件。如果用户提供的名称用于包含,这甚至会导致服务器上的代码执行。
为了防止这种攻击
- 不要从用户输入中获取用于包含的文件名,只从受信任的列表或常量中获取。
- 如果要使用用户输入,请针对白名单对其进行验证。检查文件是否存在或输入是否与特定格式匹配是不够的。
- 如果可能,避免脚本读取和传递文件。
- 如果您使用用户提供的文件名读取和传递文件,请彻底验证文件名以避免目录遍历和类似的攻击,并确保用户被允许读取文件。
- 确保应用程序以不超过所需特权运行。
原理
如果攻击者能够上传脚本文件并让应用程序的一部分包含它,他就可以执行任意代码。由于这带来了极大的风险,因此必须仔细避免这种情况。因此,对于此任务,只有最严格的验证(针对白名单进行检查)是合适的。如果要提供文件下载,只需将它们放在一个目录中并让 Web 服务器处理其余部分通常是最佳选择:这不仅比让脚本读取文件更快,而且还避免了对用户提供的文件名的风险解释。在某些情况下,这是不可避免的,例如,如果需要脚本来强制执行只有已登录用户才能下载文件,或者设置特殊标头(参见下一节)。
在这种情况下,确保您正确执行使基于脚本的方法成为必要的访问检查,并彻底验证文件名以阻止攻击者下载他不应该下载的文件。您尤其需要确保攻击者无法指定除预期文件之外的其他文件,尤其是不在预期目录之外的文件,例如,通过使用“..”伪目录名。(请注意,一个“../”可以以多种方式编码!)
以有限特权运行应用程序(通常通过限制 Web 服务器或脚本解释器的特权来完成)可以限制这种(和其他)问题的影响。