Konuyu Açan
#0
⚠️ YASAL ÇERÇEVE VE KULLANIM KOŞULLARIBu rehber, Static Application Security Testing (SAST) metodolojilerini öğretmek amacıyla hazırlanmıştır. Kaynak kod analizi, yalnızca geliştiricisi olduğunuz, mülkiyeti size ait olan veya yazılı denetim izniniz (Whitebox Pentest sözleşmesi) bulunan projelerde uygulanmalıdır.
Başkasına ait kapalı kaynak kodlu yazılımları izinsiz olarak "Decompile" etmek, fikri mülkiyet haklarını ihlal edebilir. Burada anlatılanlar, kendi yazdığınız veya açık kaynak kodlu projelerinizi (örneğin kendi Xenforo eklentilerinizi) güvenli hale getirmek içindir.
Giriş: Güvenliği Kaynağında Sağlamak (Shift Left)
Geleneksel güvenlikte uygulama biter, sonra test edilir. Modern yaklaşımda ise (DevSecOps), güvenlik kod yazılırken başlar. Buna "Sola Kaydırma" (Shift Left) denir.Kaynak kod analizi ile, bir hacker sitenizi keşfetmeden önce açıkları geliştirme aşamasında bulup kapatırsınız. Hedefimiz OWASP Top 10 listesindeki en kritik açıkları kod satırlarında avlamaktır.
1. Araç Seti: Kodunuzu Kim Tarayacak?
Milyonlarca satır kodu gözle okumak imkansızdır. Otomasyon araçları (SAST Tools) bize şüpheli kod bloklarını gösterir.- SonarQube: Endüstri standardıdır. Kod kalitesini ve güvenlik açıklarını tarar. Kendi sunucunuza kurabilirsiniz.
- Semgrep: Çok hızlı ve hafiftir. Özel kurallar yazarak spesifik kalıpları (örneğin; "MD5 kullanılan her yeri bul") aratabilirsiniz.
- CodeQL: GitHub'ın kullandığı güçlü motor. Kodu bir veritabanına dönüştürür ve zafiyetleri sorgu diliyle aramanızı sağlar.
2. Kritik Zafiyet Avı: Tespit ve Yamama
Xenforo (PHP) ve genel web mimarisi üzerinden en sık yapılan 3 hatayı ve çözümlerini inceleyelim.A. SQL Injection (A03: Injection)
Hacker'ların veritabanını çaldığı klasik yöntem.- Zafiyetli Kod (Tespit):Geliştirici, kullanıcıdan gelen veriyi doğrudan SQL sorgusuna yapıştırmıştır.
PHP1234
// YANLIŞ: Kullanıcı girdisi doğrudan sorguya ekleniyor $username = $_POST['user']; $query = "SELECT * FROM users WHERE username = '" . $username . "'"; $db->query($query);
- Analiz: Kod tarayıcı burada "String Concatenation in SQL" uyarısı verir.
- Güvenli Yama (Hardening):Asla veriyi sorguyla birleştirmeyin. Prepared Statements (Parametreli Sorgular) kullanın.
PHP1234
// DOĞRU: Veri ve komut ayrıştırılıyor $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :user'); $stmt->execute(['user' => $_POST['user']]); $user = $stmt->fetch();
B. Cross-Site Scripting - XSS (A03: Injection)
Kullanıcıların tarayıcısında zararlı JavaScript çalıştırma saldırısı.- Zafiyetli Kod (Tespit):Kullanıcıdan alınan veri, temizlenmeden ekrana basılıyor.
PHP12
// YANLIŞ: Girdi filtrelenmeden çıktı olarak veriliyor echo "Merhaba, " . $_GET['name'];
- Analiz: Tarayıcı "Unescaped Output" veya "Reflected XSS" uyarısı verir.
- Güvenli Yama (Hardening):Tüm çıktıları kodlayın (Encoding). Tarayıcıya "bu bir kod değil, sadece yazı" demeniz gerekir.
CODE12
// DOĞRU: HTML Entity Encoding uygulanıyor echo "Merhaba, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
C. Broken Access Control (A01: Erişim Denetimi Hataları)
OWASP'ın yeni 1 numarası. Kullanıcının yetkisi olmayan bir veriye erişmesi (IDOR).- Zafiyetli Kod (Tespit):Sadece ID numarasına bakıp veriyi getiriyor, o ID'nin kime ait olduğuna bakmıyor.
CODE1234
// YANLIŞ: Herkes ID değiştirip başkasının mesajını okuyabilir $message_id = $_GET['id']; $msg = get_message_by_id($message_id); echo $msg['content'];
Güvenli Yama (Hardening):Veriyi çekmeden önce "Bu verinin sahibi şu anki oturum açmış kullanıcı mı?" kontrolü yapılmalıdır.
CODE
123456789// DOĞRU: Sahiplik kontrolü
$message_id = $_GET['id'];
$msg = get_message_by_id($message_id);
if ($msg['user_id'] == $current_user_id) {
echo $msg['content'];
} else {
die("Erişim Reddedildi / 403 Forbidden");
}3. Hassas Veri Sızıntısı (Hardcoded Secrets)
Geliştiricilerin sık yaptığı bir hata, API anahtarlarını, şifreleri veya veritabanı bağlantı bilgilerini kodun içine gömmektir.- Tarama Yöntemi: TruffleHog veya GitGuardian gibi araçlar, kod geçmişinizde (git history) unutulmuş şifreleri tarar.
- Kural: Kodun içinde asla şifre olmamalıdır. Bu bilgiler .env dosyalarından veya sunucunun çevre değişkenlerinden (Environment Variables) çekilmelidir.
4. Güvenli Kodlama Prensibi: "Input Validation"
Tüm bu açıkların ortak noktası, kullanıcıdan gelen veriye güvenmektir.- Whitelisting (Beyaz Liste): Sadece izin verilen karakterleri kabul edin. (Örn: Kullanıcı adı sadece harf ve rakam olabilir).
- Blacklisting (Kara Liste): Yasaklamaya çalışmak (örn: <script> yazısını silmek) genellikle başarısız olur çünkü saldırganlar bunu atlatmanın binbir yolunu bulur. Her zaman Beyaz Liste kullanın.