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

根本的解决办法
- 避免使用直接外部参数来作为文件名。
- 在打开一个文件的时候,指定固定的目录名,并且确保文件名里不含有目录部分
- 例如,在当前目录用 open(filename) 打开一个叫 filename 的文件,若向 filename 里传入绝对路径,那攻击者就有可能打开任意目录下的文件。一种回避方法是使用固定的目录名例如 dirname,像 open(dirname+filename) 这样打开文件。但这仍然无法阻止攻击者用相对路径“../”绕过限制。要解决上面所有问题,可以使用 basename() 这类从路径名中提取出文件名部分的 API,像 open(dirname+basename(filename)) 这样,从 filename 里去掉目录部分、只保留文件名。
保险对策
- 正确设置服务器上文件访问的权限。
- 检查文件名
- 如果传入的文件名参数里有类似
/、../、..\ 这样可以解释为目录名的字符串就中止处理。但是在 URL 的解码处理中,已经编码过的 %2F、..%2F、..%5C,或者二次编码的 %252F、..%252F、..%255C 作为输入值很有可能被判定为有效的字符串,需要注意处理时机。(需要先对 URL 进行解码,然后再检查有没有非法字符串)