Makale 9: QA için Güvenlik Testi — Yeni Başlayanlardan Uzmanlara
QA için Güvenlik Testi: Yeni Başlayanlardan Uzmanlara
Güvenlik hatalarını adım adım bulmayı öğrenin — güvenlik deneyimi gerekli değil!
🎯 Bu Makale Kimin İçin?
Bu makale şunlar için hazırlandı:
- ✅ Yeni başlayanlar — güvenlik testi hakkında hiçbir şey bilmeyenler
- ✅ QA mühendisleri — güvenlik becerileri eklemek isteyenler
- ✅ Geliştiriciler — güvenlik testine ilgi duyanlar
- ✅ Öğrenciler — web güvenliği öğrenenler
Ön bilgi gerekmiyor! Her şeyi basit benzetmelerle sıfırdan 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
İlerleme: %100 + Bonus ✨
🏠 Güvenlik Testi Nedir? (Basit Açıklama)
Uygulamanızın bir ev olduğunu düşünün:
| Evin Parçası | Uygulamada | Tehdit |
|---|---|---|
| 🚪 Ön kapı | Giriş formu (login) | Şifre kırma |
| 🪟 Pencereler | API endpoint’leri | Yetkisiz erişim |
| 🔐 Kasa | Veritabanı | Veri hırsızlığı |
| 📮 Posta kutusu | Giriş formları | Kötü amaçlı kod enjeksiyonu |
| 🎥 Kameralar | Log kayıtları | Saldırganları takip etme |
Güvenlik testi = evin tüm “kapı ve pencerelerini” kontrol ederek saldırganın giremeyeceğinden emin olmak! 🏠🔒
📚 Yeni Başlayanlar İçin Güvenlik Testi
Adım 1: Temel Terimleri Anlayın
| Terim | Basit Açıklama | Günlük Hayattan Örnek |
|---|---|---|
| Zafiyet | İstismar edilebilecek zayıf nokta | Kilitlenmemiş kapı |
| Exploit | Zafiyeti kullanma yöntemi | Kilitlenmemiş kapıdan girmek |
| Kimlik Doğrulama | ”Kim olduğunuz” kontrolü | Kimlik göstermek |
| Yetkilendirme | ”Ne yapabileceğiniz” kontrolü | Bina geçiş kartı |
| Şifreleme | Veriyi okunamaz koda çevirme | Gizli dil |
| HTTPS | Güvenli bağlantı | Veriler için zırhlı araç |
| SQL Injection | Giriş yoluyla DB komutları enjekte etme | Belge sahteciliği |
| XSS | Sayfaya script enjekte etme | İlanların değiştirilmesi |
Adım 2: TÜM Güvenlik Testçilerinin Kontrol Ettiği Üç Şey
1. 🔐 KİMLİK DOĞRULAMA - Şifre olmadan giriş yapabilir miyim?
2. 🎫 YETKİLENDİRME - Yapmamam gereken şeyleri yapabilir miyim?
3. 📝 VERİ GİRİŞİ - Garip girişlerle sistemi kırabilir miyim?
Adım 3: İlk Güvenlik Testiniz! 🎯
Bunu herhangi bir test sitesinde deneyin (İZİN olmadan ASLA gerçek sitelerde denemeyin!):
Alıştırma: Erişim Kontrolü Testi
1. İki hesap oluşturun (Kullanıcı A ve Kullanıcı B)
2. Kullanıcı A olarak giriş yapın
3. ID içeren bir URL bulun (örn: /profile/123 veya /order/456)
4. ID'yi başka bir numaraya değiştirmeyi deneyin
5. Kullanıcı B'nin verilerini görüyorsanız — zafiyet buldunuz! 🐛
🔟 OWASP Top 10 — Basitçe Açıklanmış
OWASP (Open Web Application Security Project), en tehlikeli 10 güvenlik açığının listesini oluşturdu. İşte basit açıklamalar:
| # | İsim | 5 Yaşındakilere Açıklama | Ev Benzetmesi |
|---|---|---|---|
| A01 | Bozuk Erişim Kontrolü | ”Başkasının odasına girdim!” | Bir oda anahtarı tüm odaları açıyor |
| A02 | Kriptografik Hatalar | ”Sırlar şifresiz saklanıyor” | Buzdolabına yapıştırılmış şifre notu |
| A03 | Enjeksiyonlar | ”Metin kutusunda kötü komutlar” | Postada “tüm parayı ver” notu |
| A04 | Güvensiz Tasarım | ”Ev kilitsiz inşa edilmiş” | Mimar kapıları unutmuş |
| A05 | Yanlış Yapılandırma | ”Anahtarı paspasın altında bıraktılar” | Varsayılan “admin” şifresi |
| A06 | Güncel Olmayan Bileşenler | ”Eski kırık kilit” | YouTube’da nasıl açılacağı videosu olan 1950 kilidi |
| A07 | Kimlik Sorunları | ”Kimliği kontrol etmediler” | Soru sormadan herkesi içeri aldılar |
| A08 | Bütünlük İhlali | ”Birisi ürünleri değiştirdi” | Teslimattan gelen zehirli yemek |
| A09 | Loglama Eksikliği | ”Güvenlik kamerası yok” | Hırsız geldi ve fark edilmeden gitti |
| A10 | İstek Sahteciliği (SSRF) | “Hizmetçiyi kötü şey yapmaya kandırdılar” | Patrondan sahte emir |
📚 Daha fazla öğrenmek ister misiniz? Laboratuvarlar, gerçek dünya örnekleri ve pratik alıştırmalar içeren Makale 10: OWASP Top 10 Derinlemesine İnceleme’ye göz atın!
QA Mühendisleri Neden Güvenlik Testini Bilmeli
Günümüz dünyasında güvenlik herkesin sorumluluğundadır. Bir QA mühendisi olarak, zaten hata bulmada ustasınız — güvenlik açıkları ciddi sonuçları olan özel bir hata kategorisidir.
Neden önemli:
- 🔓 Veri ihlalleri şirketlere milyonlara mal oluyor
- 💼 Güvenlik becerileri piyasa değerinizi %30-50 artırır
- 🎯 Birçok şirket QA’dan temel güvenlik kontrolleri bekliyor
- 🏆 Güvenlik hatası bulmak = yüksek etkili katkılar
Bölüm 1: OWASP Top 10 - Detaylı
1. Bozuk Erişim Kontrolü (A01:2021)
Basitçe ne demek: Bir otel düşünün; 101 numaralı odanızın anahtarı aniden TÜM odaları açıyor. İşte bu bozuk erişim kontrolü! 🏨
Teknik olarak ne: Kullanıcılar erişememeleri gereken kaynaklara erişebilir veya yapmamaları gereken eylemleri gerçekleştirebilir.
Kendiniz deneyin (güvenli alıştırma):
1. Test sitesine gidin ve içinde sayı olan bir URL bulun:
https://example.com/profile/123
2. Sayıyı değiştirmeyi deneyin:
https://example.com/profile/124
https://example.com/profile/1
3. Başkasının verilerini görüyorsanız — bu IDOR zafiyeti! 🐛
Nasıl test edilir:
✓ URL'lerdeki ID'leri değiştirerek diğer kullanıcıların verilerine erişmeye çalışın
✓ Yatay yetki yükseltme testi yapın (kullanıcı A → kullanıcı B'nin verileri)
✓ Dikey yetki yükseltme testi yapın (kullanıcı → admin işlemleri)
✓ İstekleri değiştirerek erişim kontrollerini atlayıp atlamayacağınızı kontrol edin
Örnek test senaryoları:
# Test: Kullanıcı başka bir kullanıcının profiline erişebilir mi?
# Orijinal URL: /api/users/123/profile
# Değiştir: /api/users/456/profile
# Test: Normal kullanıcı admin endpoint'lerine erişebilir mi?
# Dene: /api/admin/users (normal kullanıcı olarak)
# Test: IDOR (Insecure Direct Object Reference)
def test_idor_vulnerability():
# Kullanıcı A olarak giriş yap
response = client.get("/api/orders/1001") # Kullanıcı A'nın siparişi
assert response.status_code == 200
# Kullanıcı B'nin siparişine erişmeye çalış
response = client.get("/api/orders/1002") # Kullanıcı B'nin siparişi
assert response.status_code == 403 # Yasak olmalı!
2. Kriptografik Hatalar (A02:2021)
Basitçe ne demek: Bu, kasanın şifresini kasaya yapıştırılmış bir notta saklamak gibi. Veri var ama koruma yok! 📝
Teknik olarak ne: Hassas verilerin uygun şifreleme ile korunamaması.
Nasıl test edilir:
✓ Hassas verilerin HTTPS üzerinden iletilip iletilmediğini kontrol edin
✓ Şifrelerin hash'lendiğini doğrulayın (düz metin olarak saklanmadığını)
✓ URL'lerde, loglarda veya hata mesajlarında hassas veri olup olmadığını kontrol edin
✓ Eski/zayıf şifreleme algoritmalarının kullanılıp kullanılmadığını test edin
Kontrol listesi:
| Alan | Ne Kontrol Edilmeli |
|---|---|
| HTTPS | Tüm sayfalar HTTPS kullanıyor, karışık içerik yok |
| Şifreler | bcrypt/Argon2 ile hash’lenmiş, asla loglanmıyor |
| API Anahtarları | İstemci tarafı kodunda açığa çıkmıyor |
| Çerezler | Secure & HttpOnly bayrakları ayarlı |
| Başlıklar | HSTS etkin |
3. Enjeksiyon (A03:2021)
Nedir: Güvenilmeyen veriler bir komut veya sorgunun parçası olarak bir yorumlayıcıya gönderilir.
Enjeksiyon türleri:
- SQL Injection - Veritabanı sorguları
- XSS - Tarayıcı scriptleri
- Command Injection - İşletim sistemi komutları
- LDAP Injection - Dizin servisleri
SQL Injection Test Senaryoları:
-- Test için temel SQL injection payload'ları:
' OR '1'='1
' OR '1'='1' --
'; DROP TABLE users; --
' UNION SELECT username, password FROM users --
-- Arama alanlarında, giriş formlarında, URL parametrelerinde
Pratikte test:
# Giriş formunu SQL injection için test et
def test_sql_injection_login():
payloads = [
"' OR '1'='1",
"admin'--",
"' OR 1=1--",
"1; DROP TABLE users",
]
for payload in payloads:
response = client.post("/login", data={
"username": payload,
"password": "anything"
})
# Injection ile giriş YAPMAMALI
assert "Hoşgeldiniz" not in response.text
assert response.status_code != 200
4. Güvensiz Tasarım (A04:2021)
Nedir: Tasarım aşamasında eksik veya etkisiz güvenlik kontrolleri.
Nasıl test edilir:
✓ İş mantığını güvenlik açıkları için inceleyin
✓ Hassas işlemlerde hız sınırlamasını test edin
✓ Eksik güvenlik gereksinimlerini kontrol edin
✓ Tehdit modellemesinin yapılıp yapılmadığını doğrulayın
Örnek senaryolar:
Senaryo: Doğrulama olmadan şifre sıfırlama
Herhangi bir e-posta için şifre sıfırlama istediğimde
Sıfırlama bağlantısını aldığımda
E-posta erişimi olmadan şifre sıfırlayamamalıyım
Senaryo: Sınırsız giriş denemeleri
Giriş formu mevcut olduğunda
100 yanlış şifre denediğimde
Hesap kilitlenmeli veya hız sınırlanmalı
5. Güvenlik Yanlış Yapılandırması (A05:2021)
Nedir: Güvensiz varsayılan yapılandırmalar, eksik kurulumlar veya ayrıntılı hata mesajları.
Nasıl test edilir:
✓ Varsayılan kimlik bilgilerini kontrol edin
✓ Gereksiz etkin özellikleri arayın
✓ Hata mesajlarının bilgi sızdırmadığını doğrulayın
✓ Güvenlik başlıklarını kontrol edin
Güvenlik Başlıkları Kontrol Listesi:
# Gerekli güvenlik başlıkları
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
curl ile test:
# Güvenlik başlıklarını kontrol et
curl -I https://yoursite.com | grep -E "(Strict|X-Content|X-Frame|Content-Security|X-XSS)"
6. Savunmasız ve Eski Bileşenler (A06:2021)
Nedir: Bilinen güvenlik açıkları olan kütüphaneler, framework’ler veya bileşenler kullanmak.
Nasıl test edilir:
# NPM projeleri
npm audit
# Python projeleri
pip-audit
safety check
# Belirli CVE'leri kontrol et
# Snyk, OWASP Dependency-Check veya GitHub Dependabot kullanın
7. Kimlik Doğrulama ve Tanımlama Hataları (A07:2021)
Nedir: Saldırganların kullanıcı hesaplarını ele geçirmesine izin veren zayıf kimlik doğrulama mekanizmaları.
Nasıl test edilir:
✓ Zayıf şifre politikalarını test edin
✓ Oturum yönetimini kontrol edin (zaman aşımı, geçersiz kılma)
✓ MFA uygulamasını doğrulayın
✓ "Beni hatırla" işlevini test edin
✓ Şifre sıfırlama akışını kontrol edin
Test senaryoları:
def test_weak_password_allowed():
# Zayıf şifrelere izin vermemeli
weak_passwords = ["123456", "password", "qwerty", "abc123"]
for pwd in weak_passwords:
response = client.post("/register", data={
"username": "testuser",
"password": pwd
})
assert "Şifre çok zayıf" in response.text
def test_session_fixation():
# Girişten önce oturumu al
session_before = client.cookies.get('session_id')
# Giriş yap
client.post("/login", data={"username": "user", "password": "pass"})
# Oturum girişten sonra değişmeli
session_after = client.cookies.get('session_id')
assert session_before != session_after
8. Yazılım ve Veri Bütünlüğü Hataları (A08:2021)
Nedir: Bütünlük ihlallerine karşı koruma sağlamayan kod ve altyapı.
Nasıl test edilir:
✓ Yazılım güncellemelerinin güvenilir kaynaklardan geldiğini doğrulayın
✓ CI/CD pipeline güvenliğini kontrol edin
✓ Güvensiz deserializasyonu test edin
✓ Güncellemelerdeki dijital imzaları doğrulayın
9. Güvenlik Loglama ve İzleme Hataları (A09:2021)
Nedir: Saldırıların tespit edilmemesine izin veren yetersiz loglama ve izleme.
Nasıl test edilir:
✓ Başarısız giriş denemelerinin loglandığını doğrulayın
✓ Güvenlik olaylarının uyarılandığını kontrol edin
✓ Log bütünlüğünü test edin (kurcalama yok)
✓ PII'nin loglanmadığını doğrulayın
Ne loglanmalı:
| Olay | Öncelik |
|---|---|
| Başarısız giriş denemeleri | Yüksek |
| Erişim kontrolü hataları | Yüksek |
| Girdi doğrulama hataları | Orta |
| Admin işlemleri | Yüksek |
| Şifre değişiklikleri | Orta |
10. Sunucu Tarafı İstek Sahteciliği (SSRF) (A10:2021)
Nedir: Uygulama, kullanıcı tarafından sağlanan URL’yi doğrulamadan uzak kaynak getirir.
Nasıl test edilir:
# URL giriş alanlarında SSRF testi
ssrf_payloads = [
"http://localhost/admin",
"http://127.0.0.1:22",
"http://169.254.169.254/latest/meta-data/", # AWS metadata
"file:///etc/passwd",
"http://internal-server.local/",
]
def test_ssrf_prevention():
for payload in ssrf_payloads:
response = client.post("/fetch-url", data={"url": payload})
assert response.status_code == 400
assert "Geçersiz URL" in response.text
Bölüm 2: Temel Güvenlik Testi Teknikleri
2.1 Girdi Doğrulama Testi
Altın Kural: Kullanıcı girdisine asla güvenmeyin!
# Kapsamlı girdi doğrulama test paketi
class TestInputValidation:
# XSS Payload'ları
xss_payloads = [
"<script>alert('XSS')</script>",
"<img src=x onerror=alert('XSS')>",
"javascript:alert('XSS')",
"<svg onload=alert('XSS')>",
"'-alert('XSS')-'",
"<body onload=alert('XSS')>",
]
# SQL Injection Payload'ları
sqli_payloads = [
"' OR '1'='1",
"1; DROP TABLE users--",
"' UNION SELECT * FROM users--",
"1' AND '1'='1",
]
# Path Traversal Payload'ları
path_payloads = [
"../../../etc/passwd",
"....//....//....//etc/passwd",
"%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd",
]
def test_xss_in_all_inputs(self, all_input_fields):
for field in all_input_fields:
for payload in self.xss_payloads:
response = submit_form(field, payload)
assert payload not in response.text
assert html.escape(payload) in response.text or \
"Geçersiz girdi" in response.text
2.2 Kimlik Doğrulama Testi
class TestAuthentication:
def test_brute_force_protection(self):
"""Hesap kilitlemenin çalıştığını test et"""
for i in range(10):
response = login("admin", f"wrong_password_{i}")
# Hesap kilitlenmiş olmalı
response = login("admin", "correct_password")
assert "Hesap kilitlendi" in response.text
def test_password_complexity(self):
"""Şifre gereksinimlerini test et"""
weak_passwords = [
("short", "Çok kısa"),
("alllowercase", "Büyük harf gerekli"),
("ALLUPPERCASE", "Küçük harf gerekli"),
("NoNumbers!", "Rakam gerekli"),
("NoSpecial123", "Özel karakter gerekli"),
]
for password, expected_error in weak_passwords:
response = register(password=password)
assert expected_error in response.text
def test_session_expiration(self):
"""Oturumların süresinin dolduğunu test et"""
token = login_and_get_token()
# Oturum zaman aşımını bekle (veya zamanı mock'la)
time.sleep(SESSION_TIMEOUT + 1)
response = access_protected_resource(token)
assert response.status_code == 401
2.3 Yetkilendirme Testi (Erişim Kontrolü)
class TestAuthorization:
def test_horizontal_privilege_escalation(self):
"""Kullanıcı A, Kullanıcı B'nin verilerine erişememeli"""
# Kullanıcı A olarak giriş yap
token_a = login("user_a", "password_a")
# Kullanıcı A'nın siparişini al
response = get_order(token_a, order_id=100) # Kullanıcı A'nın siparişi
assert response.status_code == 200
# Kullanıcı B'nin siparişine erişmeye çalış
response = get_order(token_a, order_id=200) # Kullanıcı B'nin siparişi
assert response.status_code == 403
def test_vertical_privilege_escalation(self):
"""Normal kullanıcı admin işlevlerine erişememeli"""
user_token = login("regular_user", "password")
admin_endpoints = [
"/api/admin/users",
"/api/admin/settings",
"/api/admin/logs",
]
for endpoint in admin_endpoints:
response = client.get(endpoint, headers={"Authorization": user_token})
assert response.status_code == 403
def test_idor_in_api(self):
"""Insecure Direct Object References testi"""
user_token = login("user1", "password")
# Kendi profiline erişebilmeli
response = client.get("/api/users/1/profile",
headers={"Authorization": user_token})
assert response.status_code == 200
# Başkasının profiline erişememeli
response = client.get("/api/users/2/profile",
headers={"Authorization": user_token})
assert response.status_code == 403
2.4 API Güvenlik Testi
class TestAPISecurity:
def test_rate_limiting(self):
"""API hız sınırlaması olmalı"""
responses = []
for i in range(100):
response = client.get("/api/search?q=test")
responses.append(response.status_code)
# Limitten sonra 429 (Too Many Requests) görmeliyiz
assert 429 in responses
def test_api_versioning(self):
"""Eski API sürümleri deprecated olmalı"""
response = client.get("/api/v1/users") # Eski sürüm
assert response.status_code == 410 # Gone
def test_sensitive_data_exposure(self):
"""API hassas alanları açığa çıkarmamalı"""
response = client.get("/api/users/1")
user_data = response.json()
sensitive_fields = ["password", "ssn", "credit_card", "api_key"]
for field in sensitive_fields:
assert field not in user_data
def test_mass_assignment(self):
"""Kullanıcılar admin alanlarını ayarlayamamalı"""
response = client.put("/api/users/1", json={
"name": "John",
"role": "admin", # Göz ardı edilmeli
"is_verified": True # Göz ardı edilmeli
})
user = get_user(1)
assert user["role"] != "admin"
assert user["is_verified"] != True
Bölüm 3: Güvenlik Testi Araçları
3.1 Tarayıcı Geliştirici Araçları
Ne bulabilirsiniz:
- localStorage/sessionStorage’daki hassas veriler
- JavaScript dosyalarındaki API anahtarları
- Güvensiz çerezler (eksik Secure/HttpOnly bayrakları)
- Karışık içerik uyarıları
- CSP ihlalleri
// Tarayıcı depolamasındaki hassas verileri kontrol et
console.log("LocalStorage:", localStorage);
console.log("SessionStorage:", sessionStorage);
console.log("Cookies:", document.cookie);
// window nesnesindeki açığa çıkmış API anahtarlarını kontrol et
Object.keys(window).filter(k =>
k.toLowerCase().includes('key') ||
k.toLowerCase().includes('token') ||
k.toLowerCase().includes('secret')
);
3.2 Burp Suite (Temel Araç)
QA için temel özellikler:
- Proxy - İstekleri yakala ve değiştir
- Repeater - İstekleri tekrar oynat ve değiştir
- Intruder - Payload’larla otomatik test
- Scanner - Otomatik zafiyet tespiti
Temel iş akışı:
1. Tarayıcıyı Burp proxy kullanacak şekilde yapılandırın (127.0.0.1:8080)
2. Uygulamayı normal şekilde gezinin
3. Proxy > HTTP history'de istekleri inceleyin
4. İlginç istekleri Repeater'a gönderin
5. Zafiyetleri test etmek için değiştirin ve tekrar gönderin
3.3 OWASP ZAP (Ücretsiz Alternatif)
# CI/CD için headless modda ZAP çalıştır
docker run -t owasp/zap2docker-stable zap-baseline.py \
-t https://yoursite.com \
-r report.html
3.4 Komut Satırı Araçları
# Nikto - Web sunucu tarayıcısı
nikto -h https://yoursite.com
# SQLMap - SQL injection testi
sqlmap -u "https://yoursite.com/search?q=test" --batch
# Nmap - Ağ taraması
nmap -sV -sC yoursite.com
# SSLyze - SSL/TLS testi
sslyze yoursite.com
# Güvenlik başlıklarını kontrol et
curl -I https://yoursite.com | grep -iE "strict|x-frame|x-content|csp|x-xss"
3.5 CI/CD’de Otomatik Güvenlik Testi
# GitHub Actions örneği
name: Security Tests
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# Bağımlılık taraması
- name: Run npm audit
run: npm audit --audit-level=high
# SAST (Statik Analiz)
- name: Run Semgrep
uses: returntocorp/semgrep-action@v1
# DAST (Dinamik Analiz)
- name: Run OWASP ZAP
uses: zaproxy/action-baseline@v0.7.0
with:
target: 'https://staging.yoursite.com'
# Gizli bilgi taraması
- name: Run Gitleaks
uses: gitleaks/gitleaks-action@v2
Bölüm 4: Güvenlik Testi Kontrol Listesi
Yayın Öncesi Güvenlik Kontrol Listesi
## Kimlik Doğrulama ve Oturum Yönetimi
- [ ] Güçlü şifre politikası uygulanıyor
- [ ] Başarısız denemelerden sonra hesap kilitleme
- [ ] Oturum zaman aşımı uygulandı
- [ ] Çıkışta oturum geçersiz kılma
- [ ] Güvenli oturum token'ı oluşturma
- [ ] Hassas hesaplar için MFA mevcut
## Yetkilendirme
- [ ] Rol tabanlı erişim kontrolü çalışıyor
- [ ] Yatay yetki yükseltme yok
- [ ] Dikey yetki yükseltme yok
- [ ] API endpoint'leri düzgün korunuyor
- [ ] Admin işlevleri kısıtlı
## Girdi Doğrulama
- [ ] Tüm girdiler sunucu tarafında doğrulanıyor
- [ ] SQL injection test edildi ve engellendi
- [ ] XSS test edildi ve engellendi
- [ ] Dosya yükleme kısıtlamaları mevcut
- [ ] Path traversal engellendi
## Veri Koruma
- [ ] Her yerde HTTPS (karışık içerik yok)
- [ ] Hassas veriler durumda şifreli
- [ ] URL'lerde hassas veri yok
- [ ] Şifreler düzgün hash'leniyor
- [ ] PII loglanmıyor
## Güvenlik Başlıkları
- [ ] HSTS etkin
- [ ] X-Content-Type-Options: nosniff
- [ ] X-Frame-Options: DENY
- [ ] Content-Security-Policy ayarlı
- [ ] Referrer-Policy yapılandırıldı
## Hata İşleme
- [ ] Kullanıcılara genel hata mesajları
- [ ] Üretimde stack trace yok
- [ ] Hatalarda hassas bilgi yok
## Bağımlılıklar
- [ ] Bilinen zafiyet yok
- [ ] Bağımlılıklar güncel
- [ ] Lisans uyumluluğu kontrol edildi
Bölüm 5: Gerçek Dünya Güvenlik Hatası Örnekleri
Örnek 1: E-ticarette IDOR
Hata: Tahmin edilebilir URL'ler aracılığıyla sipariş detayları açığa çıkıyor
Şiddet: Yüksek
URL: /api/orders/12345
Yeniden üretme adımları:
1. Kullanıcı A olarak giriş yapın
2. Siparişinizi görüntüleyin: /api/orders/100
3. URL'yi değiştirin: /api/orders/101 (başka kullanıcının siparişi)
4. Gözlemleyin: Diğer kullanıcının sipariş detayları görünüyor
Etki: Herhangi bir kimliği doğrulanmış kullanıcı herhangi bir siparişi görüntüleyebilir,
kişisel verileri, adresleri, ödeme bilgilerini açığa çıkarır
Düzeltme: Siparişin kimliği doğrulanmış kullanıcıya ait olduğunu doğrulayın
Örnek 2: Aramada SQL Injection
Hata: Ürün aramasında SQL Injection
Şiddet: Kritik
URL: /search?q=
Yeniden üretme adımları:
1. Arama sayfasına gidin
2. Girin: ' OR '1'='1' --
3. Gözlemleyin: Tüm ürünler döndürüldü (SQL çalıştırıldı)
4. Girin: ' UNION SELECT username, password FROM users --
5. Gözlemleyin: Kullanıcı kimlik bilgileri açığa çıktı
Etki: Tam veritabanı erişimi, veri ihlali
Düzeltme: Parametreli sorgular kullanın
Örnek 3: Kullanıcı Profilinde XSS
Hata: Profil bio alanında Stored XSS
Şiddet: Yüksek
Konum: Kullanıcı profili bio
Yeniden üretme adımları:
1. Profil ayarlarına gidin
2. Bio girin: <script>alert(document.cookie)</script>
3. Profili kaydedin
4. Profili görüntüleyin (herhangi bir kullanıcı olarak)
5. Gözlemleyin: JavaScript çalışıyor
Etki: Oturum ele geçirme, hesap ele geçirme
Düzeltme: Çıktıyı temizleyin, CSP uygulayın
Bölüm 6: Güvenlik Testi Mülakat Soruları
Yaygın Sorular ve Cevaplar
S: Kimlik doğrulama ve yetkilendirme arasındaki fark nedir?
Kimlik Doğrulama: KİM olduğunuzu doğrulama (kimlik)
- Kullanıcı adı/şifre, MFA, biyometri
Yetkilendirme: NE yapabileceğinizi doğrulama (izinler)
- Rol kontrolleri, erişim kontrol listeleri
S: SQL Injection’ı ve nasıl önleneceğini açıklayın.
SQL Injection: Kullanıcı girdisi aracılığıyla kötü amaçlı SQL ekleme
Önleme:
1. Parametreli sorgular kullanın (prepared statements)
2. ORM framework'leri kullanın
3. Girdi doğrulama ve temizleme
4. Veritabanı için en az yetki
Örnek (Python):
# Kötü (savunmasız)
query = f"SELECT * FROM users WHERE id = {user_id}"
# İyi (parametreli)
query = "SELECT * FROM users WHERE id = ?"
cursor.execute(query, (user_id,))
S: XSS nedir ve türleri nelerdir?
XSS (Cross-Site Scripting): Kötü amaçlı scriptler enjekte etme
Türler:
1. Stored XSS - Script veritabanında saklanır
2. Reflected XSS - Script URL'de, geri yansıtılır
3. DOM XSS - Script doğrudan DOM'u manipüle eder
Önleme:
- Çıktı kodlama
- Content Security Policy (CSP)
- Girdi doğrulama
- HttpOnly çerezler
S: Bozuk erişim kontrolünü nasıl test edersiniz?
1. IDOR testi - URL/API'lerde ID'leri değiştirin
2. Yatay yükseltme testi - Diğer kullanıcıların verilerine erişim
3. Dikey yükseltme testi - Admin işlevlerine erişim
4. Eksik işlev düzeyi erişim kontrolü testi
5. JWT/token manipülasyonu testi
6. Path traversal testi
Bölüm 7: Güvenlik Testi Becerilerinizi Geliştirme
Öğrenme Yolu
Seviye 1: Temeller (Hafta 1-2)
├── OWASP Top 10
├── Temel web güvenlik kavramları
├── Güvenlik için tarayıcı DevTools
└── HTTP/HTTPS temelleri
Seviye 2: Araçlar (Hafta 3-4)
├── Burp Suite temelleri
├── OWASP ZAP
├── Komut satırı araçları
└── Tarayıcı eklentileri
Seviye 3: Pratik (Hafta 5-8)
├── OWASP WebGoat
├── Damn Vulnerable Web Application (DVWA)
├── HackTheBox
├── PortSwigger Web Security Academy
└── Bug bounty programları (önce sadece okuma)
Seviye 4: Entegrasyon (Hafta 9-12)
├── CI/CD'de güvenlik
├── Tehdit modelleme
├── Güvenlik gereksinimleri
└── Güvenlik otomasyonu
Ücretsiz Kaynaklar
| Kaynak | Tür | Bağlantı |
|---|---|---|
| OWASP WebGoat | Pratik | https://owasp.org/www-project-webgoat/ |
| PortSwigger Academy | Öğrenme | https://portswigger.net/web-security |
| HackTheBox | CTF | https://www.hackthebox.com/ |
| TryHackMe | Öğrenme | https://tryhackme.com/ |
| OWASP Testing Guide | Rehber | https://owasp.org/www-project-testing/ |
Özet
QA mühendisi olarak güvenlik testini beceri setinize eklemek:
✅ Değerinizi artırır - Güvenlik becerileri yüksek talep görüyor
✅ Ürün kalitesini artırır - Hackerlardan önce hataları bulun
✅ Kullanıcıları korur - Veri ihlallerini ve kimlik hırsızlığını önleyin
✅ Kariyerinizi ilerletir - Güvenlik rollerine kapılar açar
Temel çıkarımlar:
- OWASP Top 10’u ezberleyin
- Savunmasız uygulamalarla pratik yapın
- Test planlarınıza güvenlik kontrollerini ekleyin
- Burp Suite ve ZAP gibi araçları kullanın
- CI/CD’de güvenlik testlerini otomatikleştirin
Sırada Ne Var?
Öğrenme yolculuğunuza devam edin:
- 🔒 Sertifika alın: CompTIA Security+, CEH, OSCP
- 🐛 Bug bounty programlarına katılın: HackerOne, Bugcrowd
- 📚 Okuyun: “The Web Application Hacker’s Handbook”
- 🛠️ Her gün CTF zorluklarıyla pratik yapın
Unutmayın: Güvenlik tek seferlik bir aktivite değildir. Her test aktivitesinin parçası olması gereken bir zihniyettir!
Mutlu (etik) hackleme! 🔐