Sunucu Üzerinde Dizin Listeleme Özelliği ve Getirdiği Riskler

Onur Yilmaz - 02 Şubat 2017 -

Web sunucusu üzerinde yanlış olarak yapılan ya da ön tanımlı olarak gelen konfigürasyonlar neticesinde dizin listeleme açık hale gelebilmekte ve çeşitli riskler doğurabilmektedir. Söz konusu riskler hakkında bilgi edinmek ve sunucu türüne göre dizin listelemenin nasıl kapatıldığını öğrenmek için detayları blog girdisinden okuyabilirsiniz.

Sunucu Üzerinde Dizin Listeleme Özelliği ve Getirdiği Riskler
Sunucu Üzerinde Dizin Listeleme Özelliği ve Getirdiği Riskler

Web sunucusu üzerinde yanlış olarak yapılan ya da ön tanımlı olarak gelen konfigürasyonlar neticesinde dizin listeleme açık hale gelebilmekte ve çeşitli riskler doğurabilmektedir. Dizin listelemeyi kapatmak için detayları blog girdisinden okuyabilirsiniz.

Dizin Listeleme Nedir?

Dizin listeleme; index.php, default.asp ve benzeri index dosyalarının klasörlerde olmaması neticesinde web sunucuları tarafından dizin içeriklerinin listelenmesini sağlayan bir özelliktir. Örneğin dizin listeleme özelliğinin açık olduğu web uygulaması üzerindeki dizine yapılan bir istek neticesinde eğer ilgili dizinde herhangi bir index dosyası yoksa uygulamanın üzerinde koştuğu web sunucusu, dizin içeriğini listeleyecektir.

Dizin-listeleme-1

Resimde de görüldüğü üzere dizin listeleme özelliğinin açık olması, sanki işletim sistemi üzerinde çalıştırılan ‘dir’ ya da ‘ls’ komutunun benzeri bir çıktı üretmektedir.

Dizin Listeleme Sonucu Ne Gibi Bilgiler Sızar ve Hangi Riskleri Doğurur?

Dizin listeleme sonucunda hassas/kritik bilgilerin sızması mümkün olabilir. Örnek bir senaryo üzerinden ilerleyecek olursak: ilgili uygulamanın veritabanı bağlantı bilgilerinin tutulduğu config.php dosyası config klasöründe olsun ve bu dosyanın config.php.bak şeklinde yedeği de bu klasörde bulunuyor olsun. Saldırgan tarafından config klasörünün varlığı crawling (link keşfetme) ya da fuzzing işlemi sonucu tespit edilir ve dizin listeleme ile config.php dosyasının yedeği ele geçirilirse, ilgili uygulamanın bağlantı bilgileri elde edilecek, bu bağlantı bilgileri ile web uygulamasına ya da veritabanı sunucusuna zarar verilebilecektir.

Dizin Listelemeyi Nasıl Kapatabilirim?

Dizin listeleme özelliği açık olduğu halde dizinlerinizin listelenmesini istemiyorsanız, ilgili dizinlere içerisi boş veya sizin belirlediğiniz içeriğe sahip index dosyası yerleştirebilirsiniz. Ama test ya da geliştirme ortamından prodüksiyon ortamına geçiş yaparken ya da uygulamanıza yeni dizinler eklemeniz ve bu index dosyalarını oluşturmayı unutmanız ihtimalinde ise uygulamanızın güvenliğini riske atmış olacaksınız.

En kalıcı ve güvenli çözüm olarak, web sunucunuzu dizinlerin içeriğini listelemeyecek şekilde ayarlamak olacaktır.

Farklı Web Sunucuları İçin Dizin Listelemeyi Kapatma

Tomcat Sunucusu Üzerinde Dizin Listelemeyi Kapatma

Tomcat 5.0 sürümünden itibaren dizin listelemenin ön tanımlı değeri kapalı olarak gelmektedir. Fakat bir regresyon ya da konfigürasyon değişikliği neticesinde dizin listeleme açılmış ise bunu kapatmak mümkündür. Dizin listeleme ayarını 2 farklı seviyede değiştirebiliriz: Birincisi tüm web projelerimize etki edecek şekilde; ikincisi ise sadece belirlediğimiz bir web sitesine etki edecek şekildedir.

Tüm Web Projelerinde Dizin Listelemeyi Kapatma

Tomcat web sunucusu üzerinde dizin listelemeyi kapatmak için öncelikle Tomcat‘in kurulu olduğu dizinde conf/web.xml dosyasını açıyoruz.

Windows 10 üzerinde yaptığımız testte, ön tanımlı olarak kurulu olduğu dizin “C:\Program Files (x86)\Apache Software Foundation\Tomcat 9.0” olarak gelmiştir.

<servlet>
	<servlet-name>default</servlet-name>
	<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
	<init-param>
		<param-name>debug</param-name>
		<param-value>0</param-value>
	</init-param>
	<init-param>
		<param-name>listings</param-name>
		<param-value>false</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

<init-param> etiketinin içindeki <param-name> değerinin listings olan kısmını bulalım. Bu kısımda tahmin edebileceğiniz gibi <param-value> değeri, bizim için belirleyici kısım olma özelliğini taşıyor. Yazının başında da bahsettiğimiz gibi Tomcat 5.0 itibarıyla bu alan, ön tanımlı olarak false gelmektedir. Eğer bu alan sizde true ise ve dizin listeleme özelliğini kapatmak istiyorsanız bu alanı false olarak değiştirmeniz gerekiyor.

Aşağıdaki kısmı direkt kopyalayıp değiştirebilirsiniz:

<servlet>
	<servlet-name>default</servlet-name>
	<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
	<init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>

Web Projesi Bazında Dizin Listelemeyi Kapatma

Birinci yöntemle tüm web projelerimizde genel bir ayar yapıyorduk. Bu yöntemle ise sadece değiştirdiğimiz web sitesine etki edecek şekilde ayarlayacağız. Bunun için ilgili web projesinin içerisindeki web.xml dosyasını açıyoruz. Aşağıdaki kodu açtığımız dosyaya ekliyoruz:

<servlet>
    <servlet-name>DefaultServletOverride</servlet-name>
	<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet> 
<servlet-mapping>
    <servlet-name>DefaultServletOverride</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping><servlet>
    <servlet-name>DefaultServletOverride</servlet-name>
	<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet> 
<servlet-mapping>
    <servlet-name>DefaultServletOverride</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Yaptığımız işlemle default isimli servlet, override edilmiş oldu. Artık bu değişikliği yaptığımız web sitesi ilk yöntemde yaptığımız ayardan bağımsız işleyecektir.

Nginx Sunucusu Üzerinde Dizin Listelemeyi Kapatma

Nginx üzerinde dizin listeleme (directory listing) özelliği ngx_http_index_module tarafından yönetilir. Dizin listeleme, nginx konfigurasyon dosyası üzerinde varsayılan olarak kapalı gelmektedir. Fakat bir regresyon ya da konfigürasyon değişikliği neticesinde dizin listeleme açılmış ise bunu kapatmak mümkündür.

Dizin listeleme özelliğinin açık olmasını veya kapalı olmasını sağlayan nginx parametre adı autoindex olarak isimlendirilmiştir ve location segmenti ile birlikte kullanılır.

Nasıl Kapatabiliriz?

Konfigurasyon dosyası varsayılan olarak nginx.conf adını almaktadır. Bu dosyanın varsayılan olarak bulunabileceği dizin yolları /usr/local/nginx/conf, /etc/nginx yada /usr/local/etc/nginx şeklindedir.

Eğer ön tanımlı olarak gelen değer değiştirildiyse aşağıdaki yapıya benzer bir ayar görebilirsiniz:

server {
        listen   80;
        server_name  domain.com www.domain.com;
        access_log  /var/...........................;
        root   /path/to/root;
        location / {
                index  index.php index.html index.htm;
        }
        location /somedir {
               autoindex on;
        }
}

Bu kısımda belirleyici parametre yukarıda bahsettiğimiz gibi “autoindex on;” özelliğidir. Bu örnekte sadece “somedir” dizini altında listeleme yapılmaktadır. Eğer herhangi bir dizin adı yazılmazsa (Örneğin location / {autoindex on;}) tüm klasörlere etki eder. Dizin listelemeyi kapatmak için de autoindex parametre değerini off haline getirmeliyiz.

Son olarak değişikliklerin geçerli olması için aşağıdaki komutu çalıştırmamız gerekiyor:

service nginx restart

LiteSpeed Sunucusu Üzerinde Dizin Listelemeyi Kapatma

LiteSpeed web sunucusunda dizin listelemeyi kapatmak için, sunucu seviyesinde global olarak ya da web sitesi seviyesinde lokal olarak ayarlamalar yapılması gerekmektedir.

Dizin listelemeyi sunucu seviyesinde kapatmak için httpd_config.xml dosyasını manuel yolla güncelleyebilir ya da bunun için LiteSpeed sunucu yönetim panelini kullanabilirsiniz.

httpd_config.xml dosyası:

Dizin-listeleme-2

Ekran görüntüsündeki kod örneğinden de görüleceği üzere dizin listelemeyi sunucu seviyesinde kapatmak istiyorsanız, httpd_config.xml dosyasına:

<autoIndex>0</autoIndex>

şeklinde bir tanımlama yapmanız gerekmektedir.

vhconf.xml:

Eğer dizin listelemeyi sunucu seviyesinde değil de web sitesi seviyesinde açmak ya da kapatmak isterseniz, /VIRTUAL_HOST_ADI/conf/vhconf.xml yolunu izleyerek eriştiğiniz dosyaya ilgili tanımlamaları yapmanız gerekir.

Lighttpd Sunucusu Üzerinde Dizin Listelemeyi Kapatma

Lighttpd web sunucusunda dizin listelemenin ön tanımlı değeri kapalı olarak gelmektedir. Fakat bir regresyon ya da konfigürasyon değişikliği neticesinde dizin listeleme açılmış ise Lighttpd web sunucusunun dizin listeleme modülüne ait konfigürasyon dosyası olan dirlisting.conf dosyasından dizin listelemeyi kapatmak mümkündür.

mod_dirlistings konfigürasyon dosyasına ulaşmak için, /etc/lighttpd/conf.d/dirlisting.conf yolunu kullanabilirsiniz:

Dizin-listeleme-3

Directory Listing’i sunucunuzda kapatmak istiyorsanız, konfigürasyon dosyasındaki satırı aşağıdaki şekilde değiştirmelisiniz.

dir-listing.activate = “disable”

Sadece belirli bir dizinde dizin listelemeyi aktif etmek istiyorsanız, yine modül konfigürasyon dosyasında aşağıdaki gibi bir değişiklik yapmalısınız:

$HTTP[“url”] =~ “^/download($|/)” {
dir-listing.activate = “enable”
}

IIS Sunucusu Üzerinde Dizin Listelemeyi Kapatma

IIS web sunucusundaki dizin listeleme özelliği ön tanımlı olarak kapalı değerini almaktadır. Fakat bir regresyon ya da konfigürasyon değişikliği neticesinde dizin listeleme açılmış ise IIS web sunucusunun konfigürasyon arayüzünden dizin listelemeyi kapatmak mümkündür.

IIS7 ve Üzeri İçin

Dizin listelemeyi kapatmak için IIS Manager’ı açtıktan sonra Directory Browsing ayarlarına erişmeniz gerekir:

Dizin-listeleme-4

Ya da komut satırından appcmd set config /section:directoryBrowse /enabled:false komutunu çalıştırarak dizin listelemeyi devre dışı bırakabilirsiniz.

Apache Sunucusu Üzerinde Dizin Listelemeyi Kapatma

Apache web sunucusunda dizin listelemeyi kapatmak için ilgili uygulama üzerinde .htaccess dosyası oluşturulması ya da Apache web sunucusuna ait konfigürasyon detaylarının bulunduğu httpd.conf dosyasına aşağıdaki satırların eklenmesi ya da var olan satırların aşağıdaki gibi düzeltilmesi gerekmektedir:

<Directory /{YOUR DIRECTORY}>
Options FollowSymLinks
</Directory>

Kod örneğinden de anlaşılacağı üzere güvenli konfigürasyon yukarıdaki gibidir. Indexes ve MultiViews ifadelerinin kaldırılmasıyla dizin listeleme özelliği güvenli bir şekilde kapatılmış olacaktır.