Merhaba! Önceki dersimizde REST API'lerin en kritik zafiyetlerinden biri olan Kırık Nesne Seviyesinde Yetkilendirme'yi (BOLA) ele aldık. Basit ID manipülasyonlarından karmaşık iş mantığı hatalarına uzanan farklı BOLA senaryolarını inceledik ve bu zafiyetleri kod seviyesinde nasıl tespit edeceğimizi öğrendik. Bir zafiyet sınıfını bulma yeteneği, kod denetiminin temel bir parçasıdır.
Bu dersimizde ise bir adım öteye geçerek, tekil bir bulgudan daha büyük bir resme nasıl ulaşacağımızı keşfedeceğiz. Konumuz, bir uzmanı iyi bir denetçiden ayıran en önemli yetkinliklerden biri olan Varyant Analizi (Variant Analysis). Bu dersin amacı, belirli bir zafiyet bulgusundan yola çıkarak, zafiyetin temel nedenini ve tekrar edilebilir desenini soyutlamaktır. Artık "ne bulduğumuza" değil, "neden bulduğumuza" ve "başka nerelerde bulabileceğimize" odaklanacağız. Bu, talep ettiğin "uzman gözünü" geliştirme yolculuğunda kritik bir adımdır; zira bu yetenek, bir hatayı düzeltmek yerine bir hata sınıfını ortadan kaldırmanızı sağlar.
Varyant Analizi: Semptomdan Kök Nedene
Varyant analizi, en basit tanımıyla, bulunan bir zafiyetin (semptomun) altında yatan temel mantık hatasını (kök nedeni) anlamak ve bu kök nedeni kullanarak aynı hatanın farklı görünümlerini (varyantlarını) kod tabanının tamamında aramaktır.
Bir doktorun sadece öksürüğü kesmek yerine altta yatan enfeksiyonu teşhis etmesi gibi, uzman bir güvenlik araştırmacısı da tek bir XSS zafiyetini yamamak yerine, o zafiyete neden olan hatalı şablon (template) fonksiyonunu veya yetersiz çıktı kodlama (output encoding) mekanizmasını bulur. Kök neden anlaşıldığında, o kod tabanındaki tüm potansiyel XSS'leri bulmak bir anda mümkün hale gelir.
Bu süreci kavramsal olarak Kök-Neden Analizi'ne benzetebiliriz.

Bizim amacımız, bu diyagramdaki ana kılçıkları, yani bir zafiyetin DNA'sını oluşturan kod desenlerini soyutlamaktır.
Soyutlama Sanatı: Bir SQL Enjeksiyonu Örneği
Bu soyutlama sürecini somut bir örnek üzerinden inceleyelim. Mehmet İnce'nin eski bir CMS olan Schlix CMS üzerinde yaptığı kaynak kod analizini kullanarak, bir SQL enjeksiyonu şüphesinden soyut bir zafiyet desenine nasıl ulaştığını göreceğiz.
Schlix CMS Kaynak Kod Analizi ve 0day Zafiyet Araştırmacılığı
Bu video, bir SQL enjeksiyonu zafiyetinin kök nedenini bulma sürecini pratik olarak gösteriyor. Konuşmacı, bir koruma mekanizmasının nasıl atlatılabileceğini keşfederek zafiyetin temel desenini ortaya çıkarıyor.
Lütfen videoda bu bölümü izleyin. Konuşmacının get_user fonksiyonunda bir sanitize_string metodunun kullanıldığını fark etmesine dikkat edin. Ardından, bu sanitize_string fonksiyonunun içine girerek, asıl mantığı nasıl deşifre ettiğini gözlemleyin: fonksiyon, girdinin bir array olup olmadığını kontrol ediyor ve array değilse escape işlemi yapıyor. Bu, zafiyetin kök nedenidir.
İzlediğiniz bölümde yaşanan analiz sürecini adımlara ayıralım:
- Semptom (İlk Şüphe): Veritabanı sorgusu, kullanıcıdan gelen
usernameparametresi ile doğrudan birleştirilerek oluşturuluyor. Bu, SQL enjeksiyonu için klasik bir göstergedir. - Savunma Mekanizmasının Analizi: Geliştirici, sorguya eklemeden önce
sanitize_stringadında bir fonksiyon kullanarak girdiyi "temizlemeye" çalışıyor. Bu fonksiyonunmysql_real_escape_stringgibi bir mekanizma kullanarak tek tırnak (') gibi özel karakterleri etkisiz hale getirdiği varsayılabilir. - Kök Nedenin Keşfi (Soyutlama): Mehmet İnce, varsayımla yetinmeyip
sanitize_stringfonksiyonunun kaynak kodunu inceliyor ve orada kritik bir mantık hatası buluyor:if (!is_array($value)) { // Değer bir dizi DEĞİLSE temizleme işlemini yap. ... } // Değer bir dizi İSE hiçbir şey yapma! - Soyut Zafiyet Deseni: Artık sorun, "login fonksiyonunda SQLi var" basitliğinde değildir. Soyutlanmış ve yeniden kullanılabilir desen şudur: "Sistem genelindeki
sanitize_stringfonksiyonu, kendisine parametre olarak bir dizi (array) gönderildiğinde tamamen etkisiz kalmaktadır."
Bu, muazzam bir keşiftir. Çünkü artık tek bir login fonksiyonuna odaklanmak yerine, kod tabanında sanitize_string fonksiyonunun kullanıldığı her yeri bulup, bu noktalara username[]=... gibi bir HTTP parametresiyle dizi göndererek SQL enjeksiyonu denemesi yapabilirsiniz. Tek bir zafiyet, bir anda onlarca potansiyel zafiyete dönüşebilir. Videoda, bu spesifik yolun daha sonraki bir trim() fonksiyonu tarafından engellendiğini görüyoruz, ancak soyutlama ve varyant arama süreci mükemmel bir şekilde sergileniyor. Kök neden hala oradadır ve gelecekteki bir kod değişikliğiyle aktif hale gelebilir.
Deseni Genişletmek: Yapılandırma Dosyası Üzerinden RCE
Şimdi, bir uzman denetçinin deneyimini kullanarak nasıl daha üst düzey soyutlamalar yaptığını görelim. Aynı videoda, konuşmacı alakasız bir kod parçasına bakarken aniden potansiyel bir RCE (Uzaktan Kod Çalıştırma) deseni fark ediyor.
Schlix CMS Kaynak Kod Analizi ve 0day Zafiyet Araştırmacılığı
Bu bölümde, sadece bir fonksiyon isminden yola çıkarak potansiyel bir RCE zafiyetinin nasıl soyutlandığı ve bu soyutlamanın kod tabanında nasıl avlandığı gösterilmektedir.
Lütfen bu bölümü izleyin. Konuşmacının save_config adında bir fonksiyon gördüğü anda aklında nasıl bir zafiyet deseninin canlandığına dikkat edin. Bu desen şudur: "Kullanıcı girdisi, çalıştırılabilir bir yapılandırma dosyasına yazılırsa RCE oluşur." Bu hipotezle, save_config fonksiyonunu tetikleyen arayüzü (Site Manager ayarları) nasıl bulduğunu ve farklı alanlara PHP kodu enjekte etmeye çalıştığını gözlemleyin.
Bu süreçteki soyutlama adımları daha da etkileyicidir:
- Deneyime Dayalı Soyutlama:
save_configfonksiyonunu görür görmez, tecrübeli bir araştırmacının zihninde şu soyut desen oluşur: "Kullanıcıdan alınan veriyi.php,.phtmlgibi yorumlanan bir yapılandırma dosyasına yazan herhangi bir mekanizma, kod enjeksiyonu ve RCE için birincil hedeftir." - Varyant Avı: Bu soyut desenle birlikte görevi, bu desene uyan somut bir örnek bulmaktır. "Bu
save_configfonksiyonunu kodun neresi çağırıyor? Hangi kullanıcı girdileri bu fonksiyona ulaşıyor?" sorularını sorarak kodda ve arayüzde gezinmeye başlar. - Desen Doğrulama: Sonunda "Site Manager" ayarlar sayfasını bulur. Bu sayfa,
config.phpdosyasını günceller. Farklı form alanlarına (<tek tırnak>,system('...')vb.) payloadlar enjekte ederek hangi girdinin, hangi doğrulama veya temizlemeden geçerek dosyaya yazıldığını test eder.
Bu, bir zafiyeti "bulmak" ile "avlamak" arasındaki farkı gösterir. Önce soyut av deseni oluşturulur, sonra bu desene uyan avlar kod ormanında aranır.
En Üst Seviye: Projeler Arası Varyant Analizi
Varyant analizinin zirvesi, bir projede öğrendiğiniz soyut bir deseni, yıllar sonra tamamen farklı bir projede tanıyabilmektir. Bu, "uzman gözünün" tam tanımıdır.
Aynı videonun son kısmı, bu kavramı mükemmel bir şekilde örnekliyor.
Schlix CMS Kaynak Kod Analizi ve 0day Zafiyet Araştırmacılığı
Bu kısa bölüm, varyant analizinin en güçlü yönünü gösterir: bir zafiyet desenini yıllar ve projeler boyunca tanıyabilme yeteneği.
Lütfen bu bölümü izleyin. Konuşmacının, Schlix CMS'teki save_config RCE zafiyetini gördüğünde, 2014 yılında Concrete5 adlı başka bir CMS'te bulduğu birebir aynı zafiyet desenini nasıl hatırladığına dikkat edin.
Bu örnekte gördüğümüz gibi:
- Zafiyet: Konfigürasyon ayarları üzerinden PHP dosyasına kod enjekte ederek RCE elde etmek.
- Proje A (2014): Concrete5 CMS
- Proje B (2022): Schlix CMS
Uygulamalar, fonksiyon isimleri, yazıldığı yıllar farklı olsa da, altta yatan soyut mantık hatası aynıdır. Bu deseni hafızanıza kazıdığınızda, gelecekte karşılaşacağınız herhangi bir "config kaydetme" fonksiyonuna artık şüpheyle yaklaşırsınız.
Bugün, CodeQL gibi statik analiz platformları tam olarak bu mantıkla çalışır. Güvenlik araştırmacıları, soyut zafiyet desenlerini (örneğin, "güvenilmeyen bir HTTP başlığı, bir SQL sorgusuna temizlenmeden ulaşıyor") özel bir sorgu dilinde yazarlar. Araç da bu deseni milyonlarca satır kod üzerinde arayarak tüm potansiyel varyantları saniyeler içinde bulur.

Sonuç
Bu derste, ileri seviye kod denetiminin temel taşlarından biri olan varyant analizinin ne olduğunu ve nasıl uygulandığını öğrendik. Artık sadece zafiyetleri değil, zafiyetlere neden olan desenleri düşünmeye başlıyoruz.
Anahtar Çıkarımlar:
- Varyant Analizi, semptomdan kök nedene inmektir. Tek bir hatayı değil, o hatayı doğuran temel deseni hedefler.
- Soyutlama, bir zafiyeti en basit mantıksal kusuruna indirgeme işlemidir. "Bu XSS" yerine, "Doğrulanmamış
paramdeğeri,rawfiltresi olmadan şablona basılıyor" demek gibi. - Soyut desenler yeniden kullanılabilir. Aynı deseni, aynı kod tabanının farklı yerlerinde (SQLi örneği) veya tamamen farklı projelerde ve yıllar sonra bile (RCE örneği) bulabilirsiniz.
- Bu yetenek, reaktif bir şekilde hata ayıklamaktan, proaktif bir şekilde hata sınıflarını avlamaya geçiş yapmanızı sağlar.
Bir sonraki dersimizde bu modülü tamamlayacağız ve öğrendiklerimizi birleştireceğiz. "Bulguları Birleştirme: Varyant Analizi ve İstismar Zinciri" konusunun ikinci bölümünde, soyutladığımız bu desenleri kullanarak bir kod tabanındaki tüm potansiyel varyantları sistematik olarak nasıl bulacağımızı ve doğrulayacağımızı ele alacağız. Ayrıca, birden fazla düşük etkili bulguyu birleştirerek nasıl yüksek etkili istismar zincirleri (exploit chains) oluşturabileceğimizi inceleyeceğiz.