Nginx `$request_uri` Path Traversal Bypass: Teknik İnceleme

Nginx `$request_uri` Path Traversal Bypass: Teknik İnceleme

Nginx `$request_uri` Path Traversal Bypass: Teknik İnceleme

Giriş

Web sunucuları, istemci isteklerini işlemek ve dosya yollarını yönetmek için kritik bir rol oynar. Nginx, yüksek performansı ve yapılandırma esnekliği ile bilinir, ancak yapılandırma hataları veya zayıf güvenlik önlemleri, potansiyel güvenlik açıklarına yol açabilir. Bu makalede, Nginx'in $request_uri değişkeni üzerinden gerçekleştirilebilecek path traversal bypass (yol geçişi atlaması) saldırısını teknik detaylarla inceleyeceğiz.

Path Traversal Nedir?

Path traversal, bir saldırganın dosya sistemindeki hassas veya yetkisiz dosyalara erişim sağlamak için URL'deki dizin değiştirme karakterlerini kullanmasıdır. Bu tür bir saldırıda, saldırgan URL'yi manipüle ederek uygulamanın öngörmediği dosyalara erişmeye çalışır. Genellikle ../ dizin değiştirme karakterleri kullanılarak gerçekleştirilir. Örneğin, bir saldırgan http://example.com/files/../../../etc/passwd gibi bir URL kullanarak sunucudaki önemli dosyalara erişim sağlamaya çalışabilir.

Nginx ve $request_uri

Nginx'te, $request_uri değişkeni istemciden gelen tam URI'yi (yol ve sorgu parametreleri dahil) içerir. Bu değişken, URL'deki tüm verileri içerdiğinden, path traversal saldırılarında önemli bir rol oynar. Nginx, bu URI'yi location bloklarında dosya yolları ile eşleştirmek için kullanır.

Path Traversal Bypass Açıkları

Path traversal bypass açığı, URL'lerdeki özel karakterlerin (örneğin, %2e%2e%2f gibi URL encode edilmiş ../) yanlış bir şekilde işlenmesi veya normalleştirilmesi nedeniyle ortaya çıkar. Bu tür bir açık, aşağıdaki durumlarla ilişkilendirilebilir:

  • Yanlış URL Kodlama Yönetimi: Nginx yapılandırması, URL kodlamalarını yanlış işleyebilir. Özellikle URL encode edilmiş path traversal karakterleri, doğru bir şekilde işlenmediğinde bu tür açığa neden olabilir. Örneğin, %2e%2e%2f (URL encode edilmiş ../) karakterlerinin doğru bir şekilde işlenmemesi, dosya yolunda istenmeyen değişikliklere yol açabilir.
  • Yetersiz Güvenlik Kuralları: Nginx konfigürasyonunda, path traversal saldırılarına karşı yeterli güvenlik önlemleri alınmıyorsa, bazı dosyalara yetkisiz erişim sağlanabilir. Özellikle location bloklarında ve rewrite kurallarında yeterli filtreleme ve doğrulama yapılmıyorsa, bu tür bir zafiyet ortaya çıkabilir.
  • Yüksek Düzeyde URL Normalizasyonu: Nginx, URL'leri normalleştirirken bazı karakterleri veya dizinleri göz ardı edebilir. Bu da path traversal karakterlerinin etkisiz hale gelmemesine neden olabilir. Örneğin, URL'lerdeki ../ karakterlerinin normalizasyon sırasında doğru şekilde işlenmemesi bu tür bir açık yaratabilir.

Örnek Senaryo: Path Traversal Bypass

Aşağıda, Nginx yapılandırması ve path traversal bypass açığının nasıl ortaya çıkabileceğine dair teknik bir örnek sunulmuştur:

server {
    listen 80;
    server_name example.com;

    location /files/ {
        alias /var/www/files/;
        try_files $uri =404;
    }
}

Bu konfigürasyon, /files/ dizinindeki dosyaları sunmak için try_files direktifini kullanır. Ancak, eğer istek URL'si path traversal karakterleri içeriyorsa, try_files direktifi bu karakterleri işleyemeyebilir ve yanlış dosyalara erişim sağlanabilir.

Aşağıdaki URL, path traversal karakterleri içerir:

http://example.com/files/../../../etc/passwd

Bu tür bir istek, Nginx'in yapılandırmasına bağlı olarak /etc/passwd dosyasına erişim sağlayabilir. Bu, hassas sistem bilgilerini ifşa edebilir ve ciddi güvenlik risklerine yol açabilir.

Path Traversal Bypass'ı Önlemek İçin Teknik İpuçları

  • Güvenli URL Kodlaması: Nginx yapılandırmanızda, URL kodlamalarını dikkatli bir şekilde işleyin. URL encode edilmiş path traversal karakterlerini (örneğin, %2e%2e%2f) doğru şekilde normalleştirin veya engelleyin. Aşağıda URL kodlamasıyla ilgili örnek bir güvenlik ayarı verilmiştir:
server {
    listen 80;
    server_name example.com;

    location /files/ {
        alias /var/www/files/;
        rewrite ^/files/(\.\./)+ // permanent;
        try_files $uri =404;
    }
}
  • Yüksek Düzeyde Normalizasyon: URL'lerin normalleştirilmesi sürecinde path traversal karakterlerini etkili bir şekilde işleyin. Normalizasyon sırasında tüm potansiyel path traversal karakterlerini doğru şekilde filtreleyin. Bu, isteklerinizi daha güvenli hale getirecektir.
  • Güvenlik Duvarı Kuralları: Nginx konfigürasyonunda güvenlik duvarı kuralları uygulayın. location bloklarını yalnızca izin verilen dosyalara erişim sağlayacak şekilde yapılandırın. Dosya yollarının doğruluğunu kontrol edin ve yalnızca gerekli dizinlere erişime izin verin.
server {
    listen 80;
    server_name example.com;

    location /files/ {
        alias /var/www/files/;
        if ($request_uri ~* "\.\./") {
            return 403;
        }
        try_files $uri =404;
    }
}
  • Dosya Yolu Kontrolü: Kullanıcı tarafından sağlanan dosya yollarını doğrulayın ve yalnızca belirli dizinlere erişime izin verin. Dosya yollarında path traversal karakterlerini kontrol edin ve bu karakterlere karşı dikkatli olun. Aşağıda dosya yolu doğrulama ile ilgili bir örnek verilmiştir:
server {
    listen 80;
    server_name example.com;

    location /files/ {
        alias /var/www/files/;
        set $safe_path $request_uri;
        if ($safe_path ~* "\.\./") {
            return 403;
        }
        try_files $safe_path =404;
    }
}
  • Güncel Yazılımlar: Nginx ve diğer yazılımların güncel olduğundan emin olun. Güvenlik açıklarını kapatmak için düzenli olarak güncellemeler yapın. Güvenlik yamaları, bilinen açıkların kapatılmasına yardımcı olabilir.

Sonuç

Nginx'teki $request_uri path traversal bypass açığı, yapılandırma hataları ve yetersiz güvenlik önlemleri nedeniyle ciddi güvenlik risklerine neden olabilir. Bu makalede, path traversal bypass açığının nasıl oluştuğunu ve nasıl önlenebileceğini teknik detaylarla ele aldık. Güvenlik önlemlerini doğru bir şekilde uygulamak ve Nginx yapılandırmasını dikkatlice incelemek, bu tür açıkları önlemek için kritik öneme sahiptir.

Yorumlar