问题描述摘要-
软件使用外部输入来构造应位于受限制目录内的路径名,但它没有正确清理绝对路径序列,例如“/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);
如何清理路径以解决问题?
3条答案
按热度按时间lnvxswe21#
这取决于马克思是如何走到这一步的。很可能是因为
File
仍然有污点。所以要确保两者都是/../
以及/%46%46/
替换为/
.第二,给予
File
要开始的父目录,稍后比较要处理的文件的路径。下面是一些常见的示例代码。如果文件不是以完整的父目录开始的,则表示您有一个路径遍历。checkmarx只能检查变量是否包含受污染的值,在某些情况下检查逻辑是否正确。还请考虑正在运行的进程和文件系统权限。许多应用程序都具有覆盖自己的可执行文件的能力。
wswtfjt72#
基于对绝对路径遍历漏洞的checkmarx查询(我相信通常是缓解方法之一)的阅读,是为了预先设置硬编码路径,以避免攻击者遍历文件系统:
文件有一个构造函数,它接受第二个参数,该参数将允许您执行一些预处理
vulvrdjw3#
对于这个问题,我建议您硬编码允许您的程序工作的目录的绝对路径;这样地:
然后,当您接受参数时,将其视为如下所示的相对路径:
要清理用户的输入,请确保他不包括
..
也不包括\
也不是/
```private static void sanitize(filename){
if(Pattern.compile("..|\|/").matcher(filename).find()){
Throw new RuntimeException("filename:'"+filename+"' is bad.");
}
}