403 Bypass Yöntemleri

Bu konumuzda, gerek internette normal olarak gezinirken gerekse de sızma testleri gerçekleştirirken sıkça karşılaştığımız bir durum olan “403 Forbidden” hatasından ve bu hatayı nasıl atlatabileceğimizden bahsedeceğiz.

1. 403 Hatası Nedir ve Neden Karşımıza Çıkar?
2. 403 Bypass Nedir?
3. 403 Bypass Metotları Nasıl Ortaya Çıkar?
4. 403 Bypass Yöntemleri
4.1. HTTP İstek Metodunun Değiştirilmesi
4.2. HTTP Protokolü Sürümünün İndirgenmesi
4.3. Path Traversal Yöntemleri
4.4. Giden İsteğe Başlık Eklemek
5. Otomatizasyon
6. Sonuç

1. 403 Hatası Nedir ve Neden Karşımıza Çıkar?

403 Forbidden hatası, web tarayıcınızda açmaya çalıştığınız bir web sayfasının ya da bir uç noktanın size erişim izni vermediği, yani o sayfayı görüntüleme yetkinizin olmadığı durumlarda ortaya çıkar. Bu hatanın genellikle iki sebebi vardır. Ya gerçekten de yetkinizin olmadığı bir yere erişmeye çalışıyorsunuzdur ya da web sitesinin sahipleri izinleri yanlış ayarlamıştır.

2. 403 Bypass Nedir?

403 bypass kavramı, basitçe, HTTP 403 Forbidden hatasını atlatmak manasına gelir. Bu yöntem ile yetkimizin olmadığı yerlere sanki yetkimiz varmışçasına erişebiliriz. 403 Forbidden kısıtlamasını aşmak ve korunan kaynaklara yetkisiz giriş elde etmek için erişim kontrol mekanizmalarındaki zayıflıklardan yararlanabiliriz ve böylelikle 403 hatasına takılmadan normalde yetkimizin olmadığı sayfaları görüntüleyebiliriz.

3. 403 Bypass Metotları Nasıl Ortaya Çıkar?

403 bypass, hedef sitedeki güvenlik zafiyetleri ve yanlış yapılandırmalar sonucunda gerçekleştirilebilir. Bu zafiyetler, güvenli kodlama prensiplerinin uygulanmaması ya da eksik uygulanması, güncelliğini yitirmiş yazılım bileşenlerinin kullanımı ve kullanıcı izinlerinin yanlış yapılandırılması gibi çeşitli faktörlerden kaynaklanabilir. Saldırganlar bu zayıflıklardan faydalanarak yetkilendirme sürecini manipüle edebilir ve böylece kısıtlı içeriğe erişim sağlayabilir. Ek olarak, kullanıcı girdilerinin tam bir denetimden geçirilmeden işlenmesi de 403 bypass saldırısına sebep olabilmektedir. Özetle 403 bypass saldırısı bünyesinde birçok atak türünü barındırır.
Yukarıda anlatılanlara bir sonraki başlığımızda daha ayrıntılı olarak değineceğiz ancak şimdi basit olarak kısa bir senaryo üzerinden gidelim ve buraya kadar anlattıklarımızı örnekle pekiştirelim.
Örneğin; web uygulamamızda belirli bir içeriği çağırmak ve görüntülemek için URL'deki bir parametreyi (bu bir dosya adı olabilir) kullanan bir web uygulamasını ele alalım. Ayrıca ek olarak, uygulamamızın belirli kaynaklara sadece yetkilendirilmiş kullanıcıların erişebilmesine izin verdiğini düşünelim. Bu basit durumu Python koduna dökelim:
Python:
user_input = request.GET.get('file_name') #Kullanıcısı girdisi.
file_path = '/var/www/files/' + user_input #Ana dosya yolu + kullanıcı girdisi.

if is_authorized(file_path): #Dosya yoluna erişmeye izinli mi?
    display_file(file_path)
else: #Eğer izinli değilse erişim engellenir.
    raise ForbiddenError("Access Denied")
Yukarıdaki kod parçasında, GET isteğinden elde edilen “file_name” parametresi vasıtasıyla kullanıcı girdisini alır. Ardından file_name değeri doğrudan temel dosya yolu (/var/www/files/) ile birleştirilerek “file_path” oluşturulur. Eğitimli bir göz burada path traversal zafiyetinin oluşabileceğini anında fark edebilir çünkü kullanıcı girdisinin alındığı file_name ve bu bilgilerin tutulduğu “user_input” değişkeni herhangi bir filtrelemeden geçirilmemiştir.
Varsayılan olarak web uygulaması file_name'in alfanümerik karakterlerden oluşmasını bekliyor, "../" veya "../.." gibi directory traversal ifadelerini beklemiyor ve yetkisiz bir erişim olduğunda else durumundaki “Access Denied” yazısını döndürüyor. Ancak, kullanıcı girdilerine dair herhangi bir önlem olmadığı için saldırgan kişi kimlik doğrulamasına gerek duymaksızın "../../../etc/passwd" gibi manipüle edilmiş bir file_name değeriyle zararlı bir istek oluşturabilir.
Sonuç olarak file_path değeri kullanıcı girdisinin de dahil edilmesiyle '/var/www/files/../../../etc/passwd' şeklini alır. Uygulama, “is_authorized()” fonksiyonunu kullanarak kullanıcının belirtilen file_path'e erişim yetkisine sahip olup olmadığını kontrol edebilir ancak bu tür path traversal girişiminin tespiti mümkün olmayabilir. Böylelikle saldırgan kişi erişim kontrolünü başarıyla atlatmış ve normalde erişemeyeceği web sayfalarına ve sunucudaki dosyalara erişmiş olur.

4. 403 Bypass Yöntemleri

403 bypass yöntemleri bünyesinde birçok saldırı türünü barındırır. Şimdi kullanılabilecek yöntemlere göz atacağız.

4.1. HTTP İstek Metodunun Değiştirilmesi

Sıklıkla GET ve POST metotları ile karşılaşsak da aslında birçok HTTP istek metodu vardır. Bu metotlara şu şekildedir:

GET
HEAD
POST
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
Örneğin; GET isteği gönderiyorsanız aynı isteği HEAD isteği şeklinde değiştirerek gönderebilirsiniz. Yukarıda liste halinde verdiğim metotları wordlist haline getirerek hızlıca otomatize hale getirip denemeler gerçekleştirebilirsiniz.
1.png

4.2. HTTP Protokolü Sürümünün İndirgenmesi (Downgrade)​

Web uygulamaları HTTP istekleri gönderirken protokol versiyonları değişkenlik gösterebilmektedir. Bu doğrultuda protokol versiyonunu downgrade etmek, yani daha düşük bir versiyon ile istek göndermek, 403 bypass sağlayabilir. Kullanabileceğiniz HTTP protokol sürümlerini aşağıda sizlerle paylaşıyorum.
/0.9
/1.0
/1.1
/2
Örneğin HTTP/1.1 sürümü ile yapılan bir isteğin sonucunda 403 hatasını alıyorsanız aynı isteği HTTP/1.0 ile yapmayı deneyin.
2.png

4.3. Path Traversal Yöntemleri​

Path traversal saldırısı, saldırganların kendilerine izin verilen kapsamın dışındaki dosya ve dizinlere yetkisiz erişim elde etmek için kullandığı bir yöntemdir. Daha öncelerde örnek bir senaryo üzerinden de gösterdiğimiz üzere, kullanıcı girdilerinin yetersiz ve eksik doğrulamasından kaynaklanır. Saldırganlar, "../" gibi dizileri veya bunların URL- encoded eşdeğerlerini kullanarak kısıtlanması gereken dizinlere gidebilir, 403 hatasını etkili bir şekilde atlayabilir ve hassas bilgilere erişebilirler.
3.png
Örneğin; “/admin” dizinine ulaşmaya çalışıyorsunuz ancak burası yasaklı diyelim. O zaman yukarıdaki görselde de örnek verildiği üzere dizin korumasını atlatan manipüle edici yöntemler kullanılabilir.
Ek bir yöntem olarak da ulaşılmak istenen adresin harfleri üzerinde oynama yapılabilir. Örneğin /admin dizinine ulaşmaya çalışıyorsanız bu dizini “/aDmin” şeklinde değiştirerek deneyebilirsiniz.
4.png
Bu yöntemleri kullanırken arka planda nasıl bir yapı var ve bu yapılar neden çalışıyor kısaca değinmekte fayda var. Örneğin; bir PHP sayfasında aşağıdaki gibi bir kod bloğunun olduğunu düşünelim:
PHP:
$input= str_replace('../', '', $_GET['input']);
Bu kod bloğunda, input değeri olarak “../” ifadesi bulunuyorsa o değer boş string değeri ile değiştirilmektedir. Başta güvenli gibi gözükse de aslında bu yetersiz bir güvenlik önlemidir. Çünkü recursive bir koruma sağlamadığı için bu yöntem “....//....//” şeklindeki ifadelerde gördüğü her “../” değerlerini silecek ve işlemini tamamlayacaktır ancak geriye kalan ifade “../../” olacağı için saldırgan hedefini gerçekleştirmiş olacaktır. Bu tür durumlarda sunucu tarafının olaylara verdiği cevap tahlil edilerek karşı tarafta nasıl bir önlem alındığı ve nasıl bir kod yazımı olduğu tahmin edilebilir ve gelecek saldırılar da ona göre şekillendirilebilir.

4.4. Giden İsteğe Başlık Eklemek​

Bir sunucu bir HTTP isteği aldığında, isteği nasıl işleyeceğini belirlemek için istekteki başlıklara bakar. Böylelikle sunucu başlıkta verilen bilgilere dayanarak erişim kontrollerini uygulayabilir. Bu bilgiden yola çıkarak başlıkları manipüle ederek sunucuyu, normalde reddedilecek olan bir erişimi izin verme konusunda ikna edebiliriz. Burada püf nokta isteğin sanki localhost tarafından geliyormuş gibi gözükmesidir, yani isteğin yapan yetkin bir kişiymiş gibi sunucu aldatılmaya çalışılır. Aşağıda bu amaçla kullanılabilecek IP adresi listesini sizlerle paylaştım:
10.0.0.0
10.0.0.1
127.0.0.1
127.0.0.1:443
127.0.0.1:80
localhost
172.16.0.0
Bu amaçla kullanabileceğimiz HTTP başlıkları şu şekildedir:
X-Originating-IP:
X-Forwarded-For:
X-Forwarded:
Forwarded-For:
X-Remote-IP:
X-Remote-Addr:
X-ProxyUser-Ip:
X-Original-URL:
Client-IP:
True-Client-IP:
Cluster-Client-IP:
X-ProxyUser-Ip:
Başlıklar ve IP adresleri bir wordlist haline getirilerek otomasyon sağlanabilir. Her bir başlık için tüm IP adreslerinin denenmesi de bu doğrultuda faydalı olacaktır.
5.png

5. Otomatik 403 Bypass Araçları​

Bu yöntemleri otomatize etmek adına birtakım araç ve yöntemler kullanabiliriz. Öncelikle araçlardan bahsedelim. “403bypasser” isimli araç ile yukarıda bahsettiğimiz yöntemleri otomatize edebilirsiniz.
Ayrıca Burp Suite aracına ait 403 Bypassereklentisi ile taramalarınızı yaparken bir yandan da 403 bypass’ı kontrol edebilirsiniz:

6. Sonuç​

403 bypass her ne kadar gerçekleştirimi kolay bir yöntem olmasa da zaman zaman karşımıza çıkabiliyor. Bu doğrultuda yapılacak güvenlik taramalarında bu açıklığın da taranmasında fayda vardır. Özellikle otomatize araçların yetmediği yerlerde gerekirse Burp Intruder vasıtasıyla kendi wordlistleriniz ile yapacağınız denemeler de birtakım sonuçlar getirebilir.

Okuduğunuz için teşekkürler. Başka yazılarda görüşmek üzere.
 
Üst