Gelişen teknoloji ile uygulamalar platformdan bağımsız bir yapıya geçiş yapmaktadır. Bu bağımsızlığın sağlanabilmesi için ise tüm platformların iletişim kurabileceği servisler oluşturulur. Bu servislere günümüzde “Web Servisler” adı verilir.
Web servisler birer API (Application Programming Interface) olarak ayağa kaldırılır, her servisin farklı bir sorumluluğu ve bağımlılığı bulunmaktadır. İstemcinin, yani servisler ile iletişime geçen uygulamaların bu API’lere bağlanabilmesi için ise SOAP veya REST API kullanılabilir.
“REST API” servislerini kullanan uygulamalara sızma testi gerçekleştirilirken bu servislerin nasıl çalıştığını anlayabilmek gerekir. REST API servislerinin kurum içerisinde bir dokümantasyonu olsa dahi sızma testi esnasında bir dokümantasyon elde etmek zordur. Bu nedenle REST API servislerinde sızma testi gerçekleştirilirken ilgili servisler üzerinde belirli fuzzing işlemleri yapılarak uygulama istemcisinin istek atmadığı uç noktaları veya istek üzerinde göndermediği parametreleri keşfetmek gerekir.
REST API Uç Nokta Adlandırma
REST API servislerinin uç noktaları(endpoint) URL’in “path” değerine karşılık gelmektedir. URL söz dizimi aşağıdaki resimde verilmiştir.
Bir istemci bir web servise erişebilmek için bu “path” yani uç nokta (endpoint) bilgisini bilmek zorundadır. Web servisler bu uç noktalara göre işlemler yapmaktadır. Uç nokta isimlendirmelerinde resmi bir kural bulunmamaktadır. Geliştirici ekibin adlandırma kuralları (naming convention) ilgili uç noktalara isim verilmesinde önemli rol oynamaktadır.
Aşağıda aynı işlemi gerçekleştiren bir uç nokta için verilebilecek farklı adlandırmalar listelenmektedir.
Yukarıdaki tabloda adlandırma kurallarının bazılarının örnekleri verilmiştir fakat RESTful servislerde bir objenin “CRUD” işlemleri için aynı uç noktanın kullanıldığı unutulmamalıdır. RESTful servislerinin örnek isimlendirmeleri aşağıdaki tabloda verilmiştir.
Sızma testi gerçekleştirilen uygulamanın REST veya RESTful servis olması göz önünde bulundurularak keşif gerçekleştirilmelidir.
REST API Uç Nokta Keşfi
REST API servislerinde sızma testi gerçekleştirilirken uygulama üzerinde görüntülenmeyen fakat farklı hizmetler için tanımlanmış uç noktaların keşfedilmesi ve teste tabi tutulması gerekmektedir.
Örnek olarak bir e-ticaret sitesi düşünülebilir. E-ticaret web sitesinin istemcisinde kullanıcının görebileceği ve istek atabileceği servislerin bulunması gayet doğaldır. İstemci üzerinde bir ürünün resim bilgisinin alınabileceği bir servis olabilir fakat bir ürünün resim bilgisinin güncellenmesi için geliştirilen bir uç nokta bilgisinin uygulama istemcisi üzerinde tutulması pek olası bir senaryo değildir. Bu nedenle sızma testi uzmanının ürünün resmini getiren uç noktadan yola çıkarak ürünün resmini güncelleyebileceği bir uç nokta aramalıdır.
Uç nokta keşfi yapılırken geliştirici ekibin adlandırma kuralları titiz bir şekilde analiz edilmelidir. Geliştirici ekip ürün bilgisini getirmek için “getProduct/{id}“ uç noktasını kullanıyor ise ürün bilgisini güncellemek için “updateProduct/{id}” ve benzeri adlandırmalara sahip uç nokta kullanma olasılığı yüksektir. Veya “product/{id}” uç noktasını kullanan bir servis ise “product/{id}/update” uç noktasını kullanabiliyor olabilir. Bu ihtimallerin dışında ilgili servis ürün bilgilerini güncellemek için HTTP metoduna göre işlem yapıyor olabilir. PUT veya POST metodu ile aynı uç noktaya gönderilen bir istek ile ürün bilgileri güncellenebilir.
API uç noktaları keşfedilirken yukarıda bahsedilen bilgiler dahilinde işlemler yapılmalıdır. Uygulama ürün resim bilgisini “product/{id}/image” uç noktası ile istemciye bildiriyor ise, keşif yapılırken “product/{id}/” uç noktasına fuzzing gerçekleştirilmelidir.
Uygulama ürün bilgisini “getProduct/{id}” şeklinde istemciye bildiriyor ise uygulamanın analizi yapılmalı ve kullanılan anahtar kelimeler not alınmalıdır:
- getProduct
- setProduct
- updateProduct
- insertProduct
- deleteProduct
şeklinde adlandırmaların kullanıldığı bir uygulamada anahtar kelimeler ikiye ayrılmalıdır. İşlem bilgisini belirten anahtar kelimeler:
- get
- set
- update
- insert
- delete
Nesne bilgisini belirten anahtar kelimeler:
- product
- user
- profile
- account
Uç noktaya fuzzing gerçekleştirilirken bu anahtar kelimelerin kombinasyonu kullanılmalıdır:
REST API Durum Kodları
REST API uç noktalarını keşfederken dönen yanıtta bulunan HTTP durum kodları büyük önem taşımaktadır. Bazı HTTP durum kodları aşağıdaki tabloda verilmiştir.
Yukarıdaki tabloda belirtilen durum kodlarının belirli açıklamaları olsa dahi geliştiriciler bu durum kodlarını amaçları dışında kullanabilmektedir.
Aşağıdaki ekran görüntüsünde uygulamada tanımlı olmayan bir uç nokta için gerçekleştirilen istek ve yanıt verilmiştir.
Sunucunun vermesi gereken yanıt “404” olmasına rağmen 200 yanıtını vermiştir.
Yukarıdaki ekran görüntüsünde ise ilgili uç nokta için “GET” metodunun tanımlı olmadığı bilgisini “404 Not Found” yanıtı ile bildirmektedir.
Keşif işlemleri sırasında dönen yanıt analiz edilmeli ve sunucunun hangi durumlarda hangi yanıtları verdiği belirlenmelidir ve fuzzing yapılırken bu bilgiler kullanılmalıdır.
REST API Parametre Keşfi
Uç noktalar belirlendikten sonra ilgili uç noktaların kullandığı parametrelerin analiz edilmesi sızma testlerinde önemli rol oynar. Örneğin kullanıcı kaydeden bir uç noktaya “isAdmin” veya “admin” parametreleri gönderilerek eklenen kullanıcının yüksek yetkili haklar ile eklenmesi sağlanabilir.
Parametre keşfi yapılırken tüm uygulama boyunca kullanılan parametreler analiz edilmelidir.
Aşağıda kullanıcı bilgilerini listeleyen bir uç noktaya gerçekleştirilen istek ve dönen yanıt verilmiştir.
Yukarıdaki ekran görüntüsünde kullanıcının sistemde kayıtlı olan tüm bilgileri görüntülenmektedir. Aynı servis üzerinde kullanıcı eklemek için gerçekleştirilen istek ve dönen yanıt aşağıdaki ekran görüntüsünde verilmiştir.
İstemciden sunucuya gönderilen istekte “role” değeri bulunmamaktadır. Web servis “role” değerini varsayılan olarak “guest” değeri ile doldurmaktadır. İstekte “role” değeri gönderilir ise sunucudaki bu varsayılan işlem bypass edilebilir ve yüksek haklar ile bir kullanıcı elde edilebilir.
Her web servis yukarıdaki örnekte olduğu gibi kullanıcının tüm özelliklerini istemciye göstermez. Bu tarz durumlarda uç nokta keşfi yaparken kullanılan analizler kullanılmalıdır. Geliştirici ekibin adlandırma kuralları analiz edilerek görünmeyen parametreler manipüle edilebilir.
Serhat ÇİÇEK tarafından hazırlanmıştır.