《Web安全测试学习手册》- 服务器端目录遍历

0x00 服务器端目录遍历

1)什么是服务器端目录遍历

当客户端访问到一个目录时,Web服务中间件将会默认寻找一个index list中的文件,若文件不存在,则会列出当前目录下所有文件或返回403状态码,而列出目录下所有文件的行为称为目录遍历。

2)服务器端目录遍历的特点

中间件配置不得当

0x01 服务器端目录遍历 - 风险等级

0x02 服务器端目录遍历 - 原理

当客户端访问到一个目录时,Web服务中间件将会默认寻找一个index list中的文件,若文件不存在,则会列出当前目录下所有文件或返回403状态码。

0x03 服务器端目录遍历 - 常见场景

  • Tomcat
  • Nginx
  • Apache
  • IIS
  • … 均有此类现象

0x04 测试方案

先使用dirb扫描一些存在的目录,再使用浏览器访问已存在的目录,查看是否能够列出目录下的文件

命令:dirb http://target

0x02

0x05 修复方案

Apache

修改站点目录对应的配置文件

列出目录索引

<Directory />
    Options +Indexes +FollowSymLinks # 将 "+" 与 Indexes 去掉即可限制列出目录索引
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

修改后:

<Directory />
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

不列出目录索引

创建DirectoryIndex默认文件

大家都见过很多框架的每个目录都有一个index.html文件,这个文件的存在是非常有意义的,很多线上的Web服务器都没有合格配置列出目录索引。导致网站内部许多文件都被攻击者查看到,泄漏大量信息。

为了防止列出目录索引,我们可以在站点的每个文件夹中创建一个index.html,这个文件内容是什么都无所谓了。当攻击者想通过列目录的手法访问你站点文件夹的时候,Web服务器将会判断当前目录下有没有DirectoryIndex默认首页,如果存在就显示DirectoryIndex对应的文件名的内容,这样攻击者就无法查看该目录下有什么文件了。

Tomcat

修改conf/web.xml配置文件

列出目录索引

<init-param>
            <param-name>listings</param-name> 
            <param-value>true</param-value> <!-- 将true改为false -->
</init-param>

修改后:

<init-param>
            <param-name>listings</param-name> 
            <param-value>false</param-value>
</init-param>

不列出目录索引

Nginx

修改conf/nginx.conf配置文件

列出目录索引

location / {
            index  index.html index.htm index.php l.php;
           autoindex on;  
}

修改后:

location / {
            index  index.html index.htm index.php l.php;
           autoindex off;  
}

不列出目录索引

IIS

设置”目录浏览”权限

列出目录索引

设置目录索引

不列出目录索引