路径遍历是一种安全漏洞,当Web应用程序或服务允许攻击者访问所预期目录结构之外的服务器文件或目录时,可能会发生这种安全漏洞。这可能会导致未经授权的读取或修改敏感数据。在文件上传的上下文中,当应用程序无法正确验证用户指定的文件路径时,可能会发生路径遍历漏洞服务器。
防止文件上传中的路径遍历对于Java应用程序的安全性至关重要,因为它有助于保护敏感数据并防止未经授权访问受限制的文件和目录。在此博客文章中,我们将更详细地探索文件上传中的路径遍历,并向您展示如何使用SNYK代码中的Java应用程序中的此漏洞。
无论您是开发人员还是只是有兴趣了解Java中的安全性,这篇文章都将为您提供信息和见解,以帮助确保您的Java应用程序安全。
了解文件上传中的路径遍历
想象一个允许用户上传配置文件图片的应用程序。该应用程序将配置文件图片存储在服务器上的目录中,例如/images/profiles/
。如果该应用程序未正确验证用户指定的文件名,则攻击者可以上传具有../../etc/passwd
之类的文件名的恶意文件。这将使攻击者能够访问预期目录结构之外的敏感系统文件。
使用百里叶以下面的春季启动应用程序以下面的示例。
@PostMapping("/uploadimage")
public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
var name = file.getOriginalFilename().replace(" ", "_");
var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
Files.write(fileNameAndPath, file.getBytes());
model.addAttribute("msg", "Uploaded images: " + name);
return "person/upload";
}
Web表单是上传图像非常常见的。上传时,我们使用来自传入MultipartFile
的originalFilename
。如果我们拦截并检查HTTP帖子呼叫,我们会发现filename
只是在第24行中显示的此HTTP请求中的元数据。
使用正确的工具,很容易将文件名更改为我们想要的任何东西!当我们将文件名更改为../../../../../../../etc/passwd
时,我们的代码将将文件上传到images/profiles/../../../../../../../etc/passwd
。该路径将被遍历根,并且文件将被覆盖/etc/passwd
。
SNYK代码如何检测路径遍历。
SNYK代码是一种实时SAST工具,可帮助Java开发人员在其应用程序中识别漏洞 - 包括文件上传中的路径遍历。该工具使用基于高级机器学习模型的静态分析来扫描您的代码并确定潜在的安全风险。
关于路径遍历,Snyk Code可以帮助您识别使用用户指定文件路径的位置,并且没有适当的验证。例如,当将我的github存储库连接到Snyk时,Snyk代码在the Web UI中找到了我的路径遍历问题。
接下来,我正在使用启用SNYK代码的Snyk plugin for IntelliJ IDEA。在开发过程中对本地机器进行扫描已经指出了我的文件上传中的路径遍历问题。此外,这也给了我一些有关缓解措施的建议。
通过使用SNYK代码,您可以主动识别并修复这些路径遍历漏洞,然后才能确保您的应用程序的安全性及其处理的数据。
总而言之,SNYK代码可帮助Java开发人员通过扫描其代码并识别未进行适当验证的区域来确定文件上传中的路径遍历漏洞。这可以有助于确保您的应用程序安全并防止潜在的攻击。</p>
减轻文件上传中的路径遍历
修复路径遍历漏洞的最简单方法是避免使用file.getOriginalFilename()
。如果您自己生成名称,则可以绝对控制文件存储的位置,因为它受用户输入的影响。
但是,如果要保留原始文件的名称,我们需要检查存储文件的位置是否是我们想要的位置。 SNYK代码(请参阅IDE插件示例)已经暗示我们可以验证规范路径。
让我们更改以前的示例,以检查CanonicalPath
是否至少从预期的上传文件夹开始。这样,我们可以防止路径遍历问题。
@PostMapping("/uploadimage")
public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
var name = file.getOriginalFilename().replace(" ", "_");
var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
if (!fileNameAndPath.toFile().getCanonicalPath().startsWith(UPLOAD_DIRECTORY)) {
throw new IOException("Could not upload file: " + name);
}
Files.write(fileNameAndPath, file.getBytes());
model.addAttribute("msg", "Uploaded images: " + name);
return "person/upload";
}
防止路径遍历脆弱性至关重要。
路径遍历漏洞是对Java Web应用程序安全性的严重威胁,目前是Snyk在Java Code中找到的最大安全问题之一。开发人员需要意识到并了解如何预防它们。通过实施适当的验证并使用SNYK代码之类的工具来识别潜在的漏洞,开发人员可以帮助确保其应用程序的安全性并防止路径遍历攻击的风险。重要的是要记住,安全是一个持续的过程,并且在识别和缓解漏洞方面保持意识和积极主动是维护Java应用程序的安全性的关键。
修复您的路径遍布脆弱性并赢得酷赃物
Snyk的脆弱性修复程序 - the the Big Fix,目前从2月14日到3月14日运行。加入竞争并修复您的个人项目中的漏洞 - 或您经常使用的开源项目。如果您刚刚发现您的应用程序中有路径遍历漏洞,请将您的项目添加到thebig fix中。修复单一漏洞将使您赢得限量版的大型Fix 2023 T恤,今年的顶级修复器竞争更神话般的奖品。
那么您还在等什么?加入The Big Fix并立即开始确保您的申请。