checkmarx-如何解决绝对路径遍历问题

gijlo24d  于 2021-07-07  发布在  Java
关注(0)|答案(3)|浏览(1652)

问题描述摘要-
软件使用外部输入来构造应位于受限制目录内的路径名,但它没有正确清理绝对路径序列,例如“/abs/path”,这些路径序列可以解析到该目录之外的位置。
这使得攻击者能够遍历文件系统来访问受限目录之外的文件或目录。
第1行给出了问题

1.String filename = System.getProperty("test");
2.File dictionaryFile = new File(filename);

++

1.String filename = System.getEnv("test");
2.File dictionaryFile = new File(filename);

但是,在创建文件对象之前不会清除路径。这允许任何可以控制系统属性的人确定使用的文件。
[尝试-1]-参考https://www.checkmarx.com/knowledge/knowledgebase/path-traversal 防止路径遍历问题。
试图清理字符串和规范化字符串,但没有运气和得到同样的问题。

path = Jsoup.clean(
                StringEscapeUtils.escapeHtml4(StringEscapeUtils.escapeEcmaScript (StringUtils.replace(path, "'", "''")))
                , Whitelist.basic());

                path = FilenameUtils.normalize(path);

如何清理路径以解决问题?

lnvxswe2

lnvxswe21#

这取决于马克思是如何走到这一步的。很可能是因为 File 仍然有污点。所以要确保两者都是 /../ 以及 /%46%46/ 替换为 / .

checkedInput = userInput.replaceAll("/../", "/");

第二,给予 File 要开始的父目录,稍后比较要处理的文件的路径。下面是一些常见的示例代码。如果文件不是以完整的父目录开始的,则表示您有一个路径遍历。

File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
    // process file
}

checkmarx只能检查变量是否包含受污染的值,在某些情况下检查逻辑是否正确。还请考虑正在运行的进程和文件系统权限。许多应用程序都具有覆盖自己的可执行文件的能力。

wswtfjt7

wswtfjt72#

基于对绝对路径遍历漏洞的checkmarx查询(我相信通常是缓解方法之一)的阅读,是为了预先设置硬编码路径,以避免攻击者遍历文件系统:
文件有一个构造函数,它接受第二个参数,该参数将允许您执行一些预处理

String filename = System.getEnv("test");
File dictionaryFile = new File("C:", filename);
vulvrdjw

vulvrdjw3#

对于这个问题,我建议您硬编码允许您的程序工作的目录的绝对路径;这样地:

String separator = FileSystems.getDefault().getSeparator();
// should resolve to /app/workdir in linux
String WORKING_DIR = separator + "app"+separator +"workdir"+separator ;

然后,当您接受参数时,将其视为如下所示的相对路径:

String filename = System.getProperty("test");
sanitize(filename);
filename = WORKING_DIR+filename;
File dictionaryFile = new File(filename);

要清理用户的输入,请确保他不包括 .. 也不包括 \ 也不是 / ```
private static void sanitize(filename){
if(Pattern.compile("..|\|/").matcher(filename).find()){
Throw new RuntimeException("filename:'"+filename+"' is bad.");
}
}

编辑
如果在linux中运行进程,可以使用 `chroot` 或许你可以在谷歌上搜索一下,看看该如何实现它。

相关问题