目录遍历(路径遍历)是由于web服务器或者web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以使web根目录以外的文件),甚至执行系统命令。
目录遍历漏洞原理比较简单,就是程序在实现上没有充分过滤用户输入的../
之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。这里的目录跳转符可以是../
,也可是../
的ASCII编码或者是unicode编码等。
网站应用提供文件下载,其中文件储存在服务器中,网站脚本利用代码获取此目录文件将其显示在网站上,其中如果没有对代码进行相关的验证过滤,将会导致目录遍历漏洞。
漏洞代码 mlbl.php
$dir_path=$_REQUEST['path'];
$filename=scandir($dir_path);
var_dump($filename);
payload
http://127.0.0.1/mlbl.php?path=../.././
在web应用程序对文件名加密后再提交,比如:downfile.php?filename=ZmFuLnBkZg-
,在参数filename使用Base64加密,而攻击者想要绕过,只需要简单的将文件Base64加密后再附加提交即可。所以说采用一些有规律或者轻易识别的加密方式,也是存在风险的。
尝试使用不同的编码转换进行过滤性的绕过,比如:URL编码,通过对参数进行URL编码提交,downfile.php?filename=%66%61%6E%2E%70%64%66
来绕过。
在有些web应用程序是通过限定目录权限进行分离的。当然这样的方法不值的可取,攻击者可以通过某些特殊的符号~
来绕过,比如downfile.php?filename=~/../boot
。能过这样一个符号,就可以直接跳转到硬盘目录下了。
有些web应用程序在读取文件前,会对文件后缀进行检测,攻击者可以在文件名后面放上一个空字节的编码,来绕过这样的文件类型的检测。
比如:../../../boot.ini%00.jpg
,web应用程序使用API会允许字符串中包含空字符,当实际获取文件名时,则有系统的API会直接截断,从而解析为../../../boot.ini
。
在UNIX系统中也可以使用URL编码的换行符,比如:../../../etc/passwd%0a.jpg
如果文件系统在获取含有换行符的文件名,会截短为文件名。也可以尝试%20,例如: ../../../index.jsp%20
Http Referer : HTTP Referer
是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的
在一些Web应用程序中,会有对提交参数的来路进行判断的方法,而绕过的方法可以尝试通过在网站留言或者交互的地方提交Url再点击或者直接修改Http Referer即可,这主要是原因Http Referer是由客户端浏览器发送的,服务器是无法控制的,而将此变量当作一个值得信任源是错误的。
由于web服务器的配置不当造成的index of /
目录遍历。我们可以直接利用谷歌语法来寻找此形式的目录遍历漏洞
intitle:index of
对网站用户提交过来的文件名进行硬编码或者统一编码,对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。
Web应用程序可以使用chrooted环境访问包含被访问文件的目录,或者使用绝对路径+参数来控制访问目录,使其即使是越权或者跨越目录也是在指定的目录下。
对于Tomcat而言,管理员修改配置文件 conf
目录下的web.xml
,将 <param-value>true</param-value>
中的true
改为false
重启tomcat即可。
对于Apache而言,管理员通过修改conf
目录下的httpd.conf
文件来禁止使用目录索引。以Apache 2.2.25
版本为例,打开httpd.conf
文件将Options Indexes FollowSymLinks
中的Indexes
删除,这样web目录下的所有目录都不再生成索引。
对IIS而言,如果不需要可执行的CGI,可以删除可执行虚拟目录或直接关闭目录浏览;如果确实需要可执行的虚拟目录,建议将可执行的虚拟目录单独放在一个分区。