API Testing
Bu yazıda API güvenliğini ele alacağız. API güvenliği kısmına geçmeden önce API'nin ne olduğuna bakalım.
Öncelikle API(Application Programming Interface) Türkçe olarak Uygulama Programlama Arayüzü olarak geçer. Basit olarak iki yazılım arasında çeşitli kurallar ve protokoller kontrolünde birbiriyle iletişime geçmesi diye tanımlanabilir.
API'ler genellikle bir veritabanı ile iletişim kurar ve kullanıcıya belirli veriler sağlar. Bu yapı içinde bulunan router denilen kısımlara HTTP istekleri göndererek API oluşturulurken tanımlanan veriler bize döndürülür.
Örnek bir API ve cevabı şu şekilde olabilir:
API Kulanımının Avantajları Nelerdir?
İstenilen platform üzerinden istek atılarak verilere ulaşılabilme kolaylığı
İş yükünün azalması
Verimlilik
API Recon
API saldırılarımızı yapmadan önce sistemde kullanılan endpointleri bulmamız gerekiyor. Kullanılan endpointleri bulmak bizim saldırı alanımız genişletir ve daha iyi sonuçlar alabiliriz.
API'lerin nasıl kullanılacağını içeren çeşitli dokümanlar bulunur. Eğer herkese açık bir API kullanıyorsanız bu dokümana kolay bir şekilde ulaşabilirsiniz. Bu doküman içinde hangi endpointlerin olduğu ve nasıl kullanıldığı gibi bilgiler yer alır.
Genelde iki tür doküman bulunur insanları okuyup anlayabileceği ve makinelerin anlayabileceği doküman tipleri vardır. Herkese açık olmayan bir API dokümanını bulmak için çeşitli dizinlere istek göndermek denenebilir. API dokümanı bulunduktan sonra sistem kullanılan routerlar üzerinde çeşitli işlemler gerçekleştirebiliriz.
Bu örneğimizde API dokümanını bularak carlos kullanıcısını silmemiz bizden isteniyor. Giriş bilgileri olarak wiener:peter bilgileri bize verilmiş durumda.
Az önce de belirttiğim gibi herkese açık olmayan API dokümanları ulaşılabilir olmamalı. Bu dokümanlar sistemde kullanılan endpointlerin keşfedilmesi için büyük bir kaynaktır.
Bu yüzden endpointleri keşfetmek için API ile ilgili olan dizinleri bulmaya deneyelim. Var olan url adresinin sonuna /api
eklediğimde dokümana ulaşıyorum.
3 tane farklı endpoint gözüküyor. Bizden istenen şey carlos kullanıcısını silmek olduğu için 2. endpoint bizim işimize yarayacaktır. Silme işlemini yapmadan önce 1. isteğe bakalım, bir GET isteği göndererek belirli bir kullanıcı hakkında bilgi edinebiliyoruz.
Tarayıcımızda yukarıdaki linke gittiğimizde carlos kullanıcısının detaylarına ulaşmayı bekliyoruz ama karşımıza Unauthorized
uyarısı çıkıyor. Giriş yapmadan böyle bir işlem yapamadığımızı anlıyoruz. Bize verilen wiener:peter giriş bilgileriyle sisteme giriş yapalım ve tekrardan bu işlemi deneyelim.
Anladık ki API ile işlem yapmak için sisteme giriş yapmış olmamız lazım. Giriş yaptıktan sonra DELETE metodu ile birlikte /api/user/carlos
router değerine istek göndermemiz gerekiyor. API ortamlarını test etmek için Postman vb. yazılımlar kullanılır. Bu konu için daha basit olması için Burp Suite ile araya girip gönderilen istek üzerinde çeşitli düzeltmeler yapıp isteğimiz istek haline getireceğiz.
Öncelikle Intercept'i aktif hale getirip gönderilen isteği yakalamamız gerekiyor.
Bir API endpointi bulduktan sonra çeşitli HTTP metodları kullanarak endpointin vereceği cevabı gözden geçirebiliriz. Çeşitli girdiler vererek cevaplar gözlenir, Content-Type
değeri manipüle ederek gözlem yapılır.
Bu örneğimizde bizden istenen şey kullanılan API'yi manipüle ederek paramızın yetmediği bir ürünü almamız bizden isteniyor. Giriş bilgileri olarak wiener:peter bilgileriyle giriş yapabiliriz. Hesabımıza girdiğimizde paramızın olmadığını görüyoruz.
Sistemde kullanılan API ve routerları bulmak için öncelikle diğer örnekte gördüğümüz dokümanın ulaşılabilir olup olmadığını kontrol etmemiz gerekiyor. Var olan urlin sonuna /api eklediğimizde ulaşılabilir bir API dokümanın olmadığını anlıyoruz.
Zaten soruda da bize gizli API endpointlerini bulup işlemi yapmamız istendiği yazıyor. Gizli API endpointi bulmak için bu süreçte Intercept açık bir şekilde işlemlere devam ediyorum. Bizden istenen ürünün detay sayfasına ulaşırken gönderilen paketler arasından dikkatimi çeken bir istek bulunuyor.
Bu istekte bir endpointe GET metodu ile bir istekte bulunulmuş. Ürünler arasından büyük ihtimalle id değeri 1 olan ürünün fiyatı istenilmiş. Bu isteği repeatera gönderip istek üzerinde çeşitli denemeler yapabiliriz.
Farklı endpointler denedikten sonra faydalı bir şey bulamıyoruz. Bu sefer HTTP metodunu değiştirip çıktıları karşılaştırabiliriz.
PATCH metodu dışında diğer cevaplar hata döndürüyor. PATH metoduyla bize dönen cevaba baktığımızda Content-Type
değeri sadece "application/json" değerini kabul ediyor. İsteğimize Content-Type header değerini ve rastgele bir JSON veri ekleyip gönderelim.
İsteği gönderdikten sonra bize dönen hata da price değerinin var olmadığından hata veriyor. JSON veri içinde göndereceğimiz price değeri bizim id değeri 1 olan ürünümüzün yeni fiyatı olacaktır.
PATCH metodu ile yeni bir istek gönderdik ve fiyatımız değişmiş olması lazım. Kontrol için metodumuzu GET yapıp body de bulunan verileri siliyoruz ve fiyatı öğreniyoruz.
Fiyatımızı da düşürdükten sonra ürünü sepetimize ekleyip satın alabiliyoruz ve soruyu çözüyoruz.
Gizli parametrelerin bulunması
Bir endpoint bulduktan sonra zorunlu parametrelerin dışında opsiyonel olan ve kullanıcıya belirtilmeyen parametreler bizim işimize yarayabilir. Örnek vermek gerekirse /api/user/update endpointini buldunuz ve bu endpoint email ve şifre parametrelerini alıyor gözüküyor.
Aynı endpoint bize GET isteği çeşitli gizli parametreleri açığa çıkarmak konusunda yardımcı olabilir.
Yukarıdaki GET isteğiyle birlikte bizim bilmediğimiz parametreleri ortaya çıkarmış olduk. Eğer PATH metoduna isAdmin değeri ekleyip çeşitli farklı değerler ile deneme yanılma yöntemiyle parametrenin nasıl etkilediğini bulabiliriz.
Bu örneğimizde diğer örnekte olduğu gibi var olmayan paramız ile pahalı bir ürünü almaya çalışacağız. Öncelikle API endpointleri bulmamız gerekiyor. Intercept açıkken bütün işlemleri gerçekleştiriyoruz. Sisteme wiener:peter ile giriş yaptık, deri ceketi sepetimize ekledik ve sepete gitmek istediğimizde arka tarafta API endpointine bir istek gönderiyoruz.
Gördüğümüz üzere GET isteği gönderdiğimizde bize çeşitli JSON verileri dönüyor. Bu JSON veri üzerinde chosen_discount değeri 0 olarak gözüküyor, bu uygulanacak olan indirimin yüzdesidir. GET metodu ile API endpointin alabileceği değerleri görmüş olduk. Şimdi sepeti onaylayalım ve gönderilen isteği tekrar kontrol edelim.
Sepeti onayladığımızda arka tarafta POST metodu ile birlikte bu istek gönderiliyor. Az önce gördük ki chosen_discount adında bir parametrenin olduğunu görmüştük. Bu parametreyi ayarlarıp indirim oranını 100 yapabiliriz ve ürünü bedavaya alabiliyor olacağız.
İndirim oranını 100 yaptıktan sonra başarıyla soruyu çözebiliyoruz.
Last updated