Yavuz Kuk
  • Ben kimim?
  • Linux Privilege Escalation (Linux Yetki Yükseltme)
  • 🚩Zafiyetler
    • API Testing
    • Authentication Vulnerabilities
    • Command Injection
    • File Upload
    • HTTP Host Header Attack
    • XSS (Cross Site Scripting)
    • LFI (Local File Inclusion)
    • Race Condition
    • JWT Bypass
    • Web Cache Poisoning
    • SOP ve CORS
  • 🚩Araçlar
    • Beef
    • FFUF
    • Gobuster
    • Hashcat
    • Hydra
    • John the Ripper
    • Nmap
    • Zphisher
    • Wpscan
  • 🚩Network
    • İnternet nedir?
    • IPv 4/6 nedir?
    • DHCP nedir?
    • Firewall nedir?
    • DNS nedir?
    • OSI modeli nedir?
    • TCP/IP modeli nedir?
    • NAT nedir?
    • Web Cache nedir?
  • 🚩Protokoller
    • SMB (Server Message Block)
    • Telnet
  • 🚩Diğer
    • CVSS nedir?
Powered by GitBook
On this page
  • API Recon
  • Lab: Exploiting an API endpoint using documentation
  • Lab: Finding and exploiting an unused API endpoint
  • Gizli parametrelerin bulunması
  • Lab: Exploiting a mass assignment vulnerability
  1. Zafiyetler

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:

GET /users HTTP 1.1
Host: example.com
# HTTP isteği
# /users routerı bize kullanıcıları döndürür


# HTTP response
[
  {
    "name": "Yavuz Kuk",
    "email": "yavuz-kuk@hotmail.com"
  },
  {
    "name": "Gülde Sağlık",
    "email": "gulde-saglık@hotmail.com"
  },
  {
    "name": "Faruk Terzi",
    "email": "farukterzi@gmail.com"
  },
  {
    "name": "Reyyan Saydırman",
    "email": "reyyan-saydirman@gmail.com"
  },
  {
    "name": "Selvi Dere",
    "email": "selvidere@hotmail.com"
  }
]

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.

/api
/swagger/index.html
/openapi.json

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.

https://LAB-ID.web-security-academy.net/api/user/carlos
https://0ae200bb04be50a4801e9ef6008c004a.web-security-academy.net/api/user/carlos

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.

GET /api/products/1/  # hata
GET /api/products/    # hata
GET /api/products/2/price # id değeri 2 olan kullanıcının fiyat değeri
GET /api              # hata

Farklı endpointler denedikten sonra faydalı bir şey bulamıyoruz. Bu sefer HTTP metodunu değiştirip çıktıları karşılaştırabiliriz.

PATCH /api/products/1/price HTTP/2
# istek

# cevap
HTTP/2 400 Bad Request
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 93

{"type":"ClientError","code":400,"error":"Only 'application/json' Content-Type is supported"}

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.

# PATCH /api/users/123

{
    "username": "yavuzkuk",
    "email": "yavuzkuk@example.com",
}
# GET /api/users/123

{
    "id": 123,
    "name": "Yavuz Kuk",
    "email": "yavuzkuk@example.com",
    "isAdmin": "false"
}

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.

PreviousLinux Privilege Escalation (Linux Yetki Yükseltme)NextAuthentication Vulnerabilities

Last updated 6 months ago

Adres çubuğuna adresini yazıp entera bastığımızde üstteki istek gönderiliyor. İşaretli olarak gözüktüğü üzere bu bir GET isteği. Bu istek bize carlos kullanıcısı hakkında bilgi getirecektir. Bu metodu DELETE ile değiştirerek isteği gönderiyoruz ve DETELE metoduna sahip router ile iletişime geçiyoruz ve carlos kullanıcısını silmiş oluyoruz.

🚩
Lab: Exploiting an API endpoint using documentation
https://LAB-ID.web-security-academy.net/api/user/carlos
Lab: Finding and exploiting an unused API endpoint
Lab: Exploiting a mass assignment vulnerability