定义

目录遍历漏洞是由于网站存在配置缺陷,导致网站目录可以被任意浏览,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件、配置文件等,攻击者利用该信息可以为进一步入侵网站做准备。目录遍历是针对windows和Apache的一种常见攻击方法,它能让攻击者访问受限制的目录,通过执行cmd.exe /c命令来提取目录信息,或在Web服务器的根目录以外执行命令。

目录遍历漏洞的探测:可以利用web漏洞扫描器扫描web应用进行检测,也可以通过搜索,网站标题包含“index of”关键词的网站进行访问。

目录遍历漏洞的危害:攻击者通过访问网站某一目录时,该目录没有默认首页文件或没有正确设置默认首页文件,将会把整个目录结构列出来,将网站结构完全暴露给攻击者;攻击者可能通过浏览目录结构,访问到某些隐秘文件(如PHPINFO文件、服务器探针文件、网站管理员后台访问地址、数据库连接文件等)。

目录遍历漏洞原理

许多的Web应用程序一般会有对服务器的文件读取查看的功能,大多会用到提交的参数来指明文件名

形如:http://www.nuanyue.com/getfile=image.jgp

当服务器处理传送过来的image.jpg文件名后,Web应用程序即会自动添加完整路径,形如“d://site/images/image.jpg”,将读取的内容返回给访问者。

初看,在只是文件交互的一种简单的过程,但是由于文件名可以任意更改而服务器支持“~/”,“../”等特殊符号的目录回溯,从而使攻击者越权访问或者覆盖敏感数据,如网站的配置文件、系统的核心文件,这样的缺陷被命名为路径遍历漏洞。在检查一些常规的Web应用程序时,也常常有发现,只是相对隐蔽而已。

发现路径遍历漏洞

路径遍历漏洞的发现,主要是对Web应用程序的文件读取交互的功能块,进行检测,面对这样的读取方式:

“http://www.nuanyue.com/test/downfile.jsp?filename=fan.pdf”

我们可以使用 “../”来作试探,

比如提交Url:“getfile=/fan/fan/*53.pdf”,而系统在解析

是“d://site/test/pdf/fan/fan/../../*53.pdf"

通过“../”跳转目录“/fan”,即“d://site/test/pdf/*53.pdf”,

返回了读取文件的正常的页面。

路径遍历漏洞隐藏一般在文件读取或者展示图片功能块这样的通过参数提交上来的文件名,从这可以看出来过滤交互数据是完全有必要的。恶意攻击者当然后会利用对文件的读取权限进行跨越目录访问,

比如访问一些受控制的文件,“../../../../../../../etc/passwd“或

者”../../../../boot.ini“,当然现在部分网站都有类似Waf的防护设备,只要在数据中会有/etc /boot.ini等文件名出直接进行拦截。

1、加密参数传递的数据

在WEB应用程序对文件名进行加密之后再提交,比如:“downfile.jsp?filename=ZmfugsbS”,在参数filename用的是Base64加密,而攻击者要想绕过,只需简单的将名加密后再附加提交即可!所以说,采用一些有规律或者轻量能识别的加密方式,也是存在风险的。

 

2、编码绕过

尝试使用不同的编码转换进行过滤性的绕过,比如url编码,通过参参数进行url编码提交,"downfile.jsp?filename=%66%61%6E%2E%70%64%66"来绕过。

URL编码绕过需要编码两次,第一次是浏览器传到后端自动解码,第二次是后端使用函数进行解码。

 

3、目录限定绕过

在有些Web应用程序是通过限定目录权限来分离的。当然这样的方法不值得可取的,攻击者可以通过某些特殊的符号“~”来绕过。例如这样提交“downfile.jps?filename=~/../boot”。能过这样一个符号,就可以直接跳转到硬盘目录下了。

 

4、绕过文件后缀过滤

一些web应用程序在读取前,会对提交的文件后缀进行检测,攻击者可以在文件名后放一个空字节编码来绕过这样的文件类型的检查。

例如:../../.../../boot.ini%00.jpg,web应用程序使用的Api会允许字符串中包含空字符,当实际获取文件名时,刚由系统的Api会直接截断,而解析为"../../../../boot.ini"

在类似Uninx的系统中也可以使用url编码的换行符,例如:../../../etc/passwd%0a.jpg,如果文件系统在获取含有换行符的文件名,会截短为文件名。也可以尝试%20,例如:../../../index.jsp%20

 

5、绕过来路验证

HTTP Referer:HTTP Referer是header的一部份,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接来的。

 

如果应用程序要求用户提供的文件名必须以预期的基本文件夹开头,例如/var/www/images,则可能包含所需的基本文件夹,后跟合适的遍历序列。例如:

filename=/var/www/images/../../../etc/passwd

 还有一种目录遍历,那就是因为这个web服务器的配置不当造成的。

Index of/

 

我们可以直接利​​谷歌黑客语​​法来寻找此形式的目录遍历漏洞:

intitle:Index of

 例如:

1、IIS“目录浏览”前打勾,就是允许目录列表显示。

web安全——目录遍历漏洞_文件名

2、Apache配置文件httpd.con中Options 为Indexes就是允许目录列表显示。

 web安全——目录遍历漏洞_文件名_02 

注意:虽然说此 Options 值为 Indexes,但是你去访问的时候依然不会目录列表展示,会提示403禁止访问,这也是phpstudy为了安全吧!所以说有时候,并不代表你这样设置就可以以目录列表的方式去显示了。

 

Apache设置Opions选项具体中以参考:

​http://httpd.apache.org/docs/2.2/mod/core.html#options​

防范遍历路径漏洞

在防范遍历路径漏洞的方法中,最有效的是权限的控制,谨慎的处理向文件系统API传递过来的参数路径。主要是因为大多数的目录或者文件权限均没有得到合理的配置,而Web应用程序对文件的读取大多依赖于系统本身的API,在参数传递的过程,如果没有得严谨的控制,则会出现越权现象的出现。在这种情况下,Web应用程序可以采取以下防御方法,最好是组合使用。

(1) 数据净化,对网站用户提交过来的文件名进行硬编码或者统一编码,对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。

(2) Web应用程序可以使用chrooted环境访问包含被访问文件的目录,或者使用绝对路径+参数来控制访问目录,使其即使是越权或者跨越目录也是在指定的目录下。

总结

路径遍历漏洞允许恶意攻击者突破Web应用程序的安全控制,直接访问攻击者想要的敏感数据 ,包括配置文件、日志、源代码等,配合其它漏洞的综合利用,攻击者可以轻易的获取更高的权限,并且这样的漏洞在发掘上也是很容易的,只要对Web应用程序的读写功能块直接手工检测,通过返回的页面内容来判断,是很直观的,利用起来也相对简单。

 

所有的绕过情况都是对路径过滤不严导致的,所以可以采取以下两中方法来缓解这个漏洞:1、设置白名单,仅允许路径中包含允许的片段或数据类型。2、在经过白名单过滤以后再与基线路径拼接,让路径结构规范化。