【代码扫描修复】绝对路径遍历(高危)

漏洞描述:

摘要:

​ 允许用户输入控制文件系统操作所用的路径会导致攻击者能够访问或修改其他受保护的系统资源。

缺陷描述:

​ 当满足以下两个条件时,就会产生路径遍历错误:

  1. 攻击者可以指定某一文件系统操作中所使用的路径。
  2. 攻击者可以通过指定特定资源来获取某种权限,而这种权限在一般情况下是不可能获得的。

例如,在某一程序中,攻击者可以获得特定的权限,以重写指定的文件或是在其控制的配置环境下运行程序。

示例1: 下面的代码使用来自于 HTTP

请求的输入来创建一个文件名。程序员没有考虑到攻击者可能使用像 “…/…/tomcat/conf/server.xml” 一样的文件名,从而导致应用程序删除它自己的配置文件。

String rName = request.getParameter("reportName");
File rFile = new File("/usr/local/apfr/reports" + rName);
...
rFile.delete();

示例2: 下面的代码使用来自于配置文件的输入来决定打开哪个文件,并返回给用户。如果程序在一定的权限下运行,且恶意用户能够篡改配置文件,那么他们可以通过程序读取系统中以 .txt 扩展名结尾的所有文件。

fis = new FileInputStream(cfg.getPorperty("sub") + ".txt");
amt = fis.read(arr);
out.println(arr);

​ 有些人认为在移动世界中,典型的漏洞(如:path manipulation)是无意义的 – 为什么用户要攻击自己?但是,谨记移动平台的本质是从各种来源下载并在相同设备上运行的应用程序。恶意软件在银行应用程序附近运行的可能性很高,他们会强制扩展应用程序的攻击面(包括跨进程通信)。

示例3: 以下代码 “ 示例1 ” 改编未适用于 Android 平台。

...
String rName = this.getIntent().getExtras().getString("reportName");
File rFile = getBaseContext().getFileStreamPath(rName);
...
rFile.delete();
...

解决方案:

官方建议:

​ 防止路径遍历的最佳方法是采用一些间接手段:例如创建一份和合法资源名的列表,并且规定用户只能选择其中的文件名。通过这种方法,用户就不能直接由自己来指定资源的名称了。

​ 但在某些情况下,这种方法并不可行,因为这样一份合法资源名的列表过于庞大、难于跟踪。因此,程序员通常在这种情况下采用黑名单的办法。在输入之前,黑名单会有选择地拒绝或避免潜在的危险字符。但是,任何这样一份名单都不可能是完整的,而且随着时间的推移而果实。更好的方法是创建一份白名单,允许其中的字符出现在资源名称中,且只接受完全由这些被认可的字符组成的输入。

示例4 白名单例子:

public boolean validateFile(File file) throws IOException {
    //This represents the format d:\myapp\temp\<file name> where the file name
    //can consist of alpha-numeric, space/tab, period and dash characters and
    //cannot exceed 20 characters in length
    String goodPattern = "d:(\\\\|/)myapp(\\\\|/)temp(\\\\|/)(\\w|\\s|\\.|-){1,20}"";
    Pattern p = Pattern.compile(goodPattern, Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(file.getCanonicalPath());
    if(!m.matches()) {
    	return false;
    }
    return true;
}

临时修复方案:

​ 使用 2.6 版本的 commons-io 工具包自带的工具:

修改前:

File file = new File(path);

修改后:

import org.apache.commons.io.FileUtils;

File file = FileUtils.getFile(path);

整理完毕,完结撒花~

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: system.getproperty不会直接引起绝对路径遍历。system.getproperty是一个Java函数,在Java代码中用来获取系统属性的方法。它可以获取与系统相关的属性,如文件路径、编码方式、操作系统类型等。 如果在使用system.getproperty时,程序员不小心传入了一些不受信任的用户输入,那么绝对路径遍历就有可能发生。比如,程序员使用system.getproperty获取文件路径时,如果不对用户输入进行过滤或验证,那么用户可能会通过构造特殊的输入,使得程序加载或读取了不应该被访问的文件。 因此,在使用system.getproperty时,需要注意对用户输入进行过滤或者使用安全的默认值。此外,程序员还需要注意使用安全的文件访问API,如JavaPath和File类,来避免绝对路径遍历和其他文件安全问题的发生。 ### 回答2: System.getProperty()是用于从系统中获取属性值的Java API方法之一。系统属性是由操作系统或Java虚拟机设置的键值对,可以用于指定程序的行为和环境。这个方法可以用来获取属性的值,例如Java运行时间,操作系统版本等。 关于是否会引起绝对路径遍历,实际上与它本身没有必然联系。System.getProperty()本身是一个安全的Java API方法,没有直接引起绝对路径遍历的风险。但使用该方法获取的属性值可能会出现反向路径遍历的问题,从而引起绝对路径遍历的风险。 在实际开发过程中,如果在获取属性值时没有进行充分的验证和过滤,可能会给黑客攻击机会,从而实现绝对路径遍历攻击,进而访问系统中的敏感文件。 因此,为了保证系统的安全,我们应该在使用 System.getProperty() 时注意对获取的属性值进行过滤和验证,确保获取正确的属性值,并避免出现任何反向路径遍历的安全问题。同时,我们也可以采用相对路径而不是绝对路径的方式来获取文件路径,以避免绝对路径遍历的风险。 ### 回答3: system.getproperty是Java中的一个方法,它可以获取系统属性值。该方法不会直接引起绝对路径遍历,因为它只是获取系统属性值的字符串,并不会涉及到文件操作。 绝对路径遍历是一种安全漏洞,攻击者利用该漏洞可以读取/修改/删除未授权的文件。绝对路径遍历通常通过接收输入的参数来实现,攻击者通过在输入中插入包含“../”或“..\”等字符串的路径,以跳过应用程序的限制,从而访问系统上的敏感文件。 在使用system.getproperty获取系统属性时,如果不谨慎地将获取到的字符串作为路径来使用,那么就可能引起绝对路径遍历漏洞。例如,如果system.getproperty获取到的是系统的用户目录路径(例如"/home/user"),如果不进行任何处理,就可能导致攻击者访问用户的私人文件。 为避免绝对路径遍历漏洞,从system.getproperty获取到的系统属性值应该经过严格的验证和过滤,确保路径安全,例如使用Java中的File.getCanonicalPath()方法。此外,还应该将从用户输入获取的参数与安全白名单进行比较,并使用安全编码实践来防止其他类型的攻击,如SQL注入或跨站脚本攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值