跳到主要内容

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

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

目录遍历漏洞

根本的解决办法

  • 避免使用直接外部参数来作为文件名。
  • 在打开一个文件的时候,指定固定目录名、并且文件里不要含有目录名
    • 例如,在当前目录用 open(filename) 打开一个叫 filename 的文件,若向 filename 里传入绝对目录,那攻击者就有可能拥有打开任意目录的权限。回避方法有一种,就是使用固定的目录名例如 dirname,就可以像 open(dirname+filename) 这样打开文件。但是这也无法避免使用相对目录“../”来回避攻击。要解决上面所有问题,可以使用一个 basename() 函数,这个函数从调用一个转换路径名转换到文件名的API,然后像 open(dirname+basename(filename)) 这样,从 filename 里提取出不含有目录的文件名。

保险对策

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