跳到主要内容

不检查目录名与目录参数/目录遍历

  • 有一些应用直接使用从外部提供的参数的值来指定要打开的文件名。攻击者可以传入任意文件名,让应用执行意料之外的操作。
  • 这也叫做“目录遍历漏洞”。
  • 使用这些漏洞可以访问到还没有对WEB公开的文件,就像下图一样可以取到上层目录的文件。

目录遍历漏洞

根本的解决办法

  • 避免使用直接外部参数来作为文件名。
  • 在打开一个文件的时候,指定固定的目录名,并且确保文件名里不含有目录部分
    • 例如,在当前目录用 open(filename) 打开一个叫 filename 的文件,若向 filename 里传入绝对路径,那攻击者就有可能打开任意目录下的文件。一种回避方法是使用固定的目录名例如 dirname,像 open(dirname+filename) 这样打开文件。但这仍然无法阻止攻击者用相对路径“../”绕过限制。要解决上面所有问题,可以使用 basename() 这类从路径名中提取出文件名部分的 API,像 open(dirname+basename(filename)) 这样,从 filename 里去掉目录部分、只保留文件名。

保险对策

  • 正确设置服务器上文件访问的权限。
  • 检查文件名
    • 如果传入的文件名参数里有类似 /../..\ 这样可以解释为目录名的字符串就中止处理。但是在 URL 的解码处理中,已经编码过的 %2F..%2F..%5C,或者二次编码的 %252F..%252F..%255C 作为输入值很有可能被判定为有效的字符串,需要注意处理时机。(需要先对 URL 进行解码,然后再检查有没有非法字符串)