什么是目录遍历第一次遇到目录遍历漏洞是在ThinkJS2的时候,代码如下图所示。目的是当用户访问的URL是静态资源时,返回静态资源的地址。其中,pathname为用户访问的URL中的路径。我们发现该代码只是简单解码,然后在第22行与资源目录进行了拼接,这是一个非常明显的目录遍历漏洞。你为什么这么说?假设用户访问的URL为http://xxx.com/../../../xxx.jpg,那么最终返回的文件地址将成为think.RESOURCE_PATH上三个目录下的文件。而这种利用网站的安全漏洞列出服务器目录或文件的方法就成为了目录遍历漏洞(Directorytraversal),也称为路径遍历漏洞(英文:Pathtraversal)。目录遍历在英语世界也被称为../攻击(Dotdotslashattack)、目录攀爬(Directoryclimbing)和回溯(Backtracking)。它的一些攻击方法也可以归类为规范化攻击。via:wikipedia目录遍历的危害目录遍历的最大危害在于它可以让任何用户访问系统的敏感文件,进而攻击整个服务器。比如获取linux下的/etc/passwd文件后,可能会破解root用户的密码。防御方法可以看出,大多数情况下问题的关键是../目录跳转字符,所以防御的首要任务就是过滤。除了过滤之外,还可以判断最终的文件路径,确保请求文件的完整目录后的前N个字符与文档的根目录完全一致。如果相同,则返回内容。否则可能无法返回攻击地址。回到文章开头提到的代码问题,最后通过上面的方法修复了。归一化最终文件地址后,判断开头是否包含RESOURCE_PATH目录。如果不是,则返回空。
