OWASP Top 10: En Kritik Web Uygulama Güvenlik Riskleri

OWASP Top 10: En Kritik Web Uygulama Güvenlik Riskleri

Her Geliştiricinin OWASP Top 10'u Bilmesi Neden Önemli?

OWASP Top 10, web uygulama güvenlik riskleri için en yaygın referans alınan standarttır. Açık Web Uygulama Güvenliği Projesi (OWASP) tarafından yayınlanan bu liste, web uygulamalarına yönelik en kritik güvenlik tehditleri konusunda geniş bir uzlaşıyı temsil eder. İnternete dokunan yazılım geliştiriyorsanız, bu zafiyetleri anlamak isteğe bağlı değil—zorunludur.

Güncel liste (2021, 2025 güncellemesi devam ediyor) sadece uygulama hatalarına değil, tasarım kusurlarına ve mimari zayıflıklara doğru belirgin bir kayma gösteriyor.

OWASP Top 10 (2021)

#RiskDescriptionMoved From
A01Broken Access ControlUsers act outside intended permissions#5 → #1
A02Cryptographic FailuresSensitive data exposure through weak crypto#3 → #2
A03InjectionSQL, NoSQL, OS, LDAP injection#1 → #3
A04Insecure DesignMissing security architecture and design patternsNew
A05Security MisconfigurationDefault configs, open cloud storage, verbose errors#6 → #5
A06Vulnerable ComponentsUsing components with known vulnerabilities#9 → #6
A07Auth FailuresBroken authentication and session management#2 → #7
A08Software & Data IntegrityCode and infrastructure without integrity verificationNew
A09Security Logging FailuresInsufficient logging and monitoring#10 → #9
A10SSRFServer-Side Request ForgeryNew

Dikkat çekici değişiklikler: Enjeksiyon zafiyetleri on yıldan fazla süre birinci sırada kaldıktan sonra 3. sıraya geriledi. Bunun yerine Bozuk Erişim Kontrolü birinci sıraya yükseldi—test edilen uygulamaların %94'ünde erişim kontrolü sorunu tespit edildi. Ayrıca Güvensiz Tasarım ve SSRF gibi kategoriler listeye ilk kez girdi.

A01: Bozuk Erişim Kontrolü

1 numaralı risk. Test edilen uygulamaların %94'ünde bir tür erişim kontrolü sorunu bulundu.

Zafiyetli kod:

# INSECURE: No authorization check
@app.route('/api/users/<user_id>/profile')
def get_profile(user_id):
    # Any authenticated user can access ANY user's profile
    user = User.query.get(user_id)
    return jsonify(user.to_dict())

# INSECURE: Client-side role check only
@app.route('/api/admin/users')
def admin_users():
    # Only checking role in frontend JavaScript, not backend
    return jsonify([u.to_dict() for u in User.query.all()])

Düzeltilmiş kod:

# SECURE: Proper authorization
@app.route('/api/users/<user_id>/profile')
@login_required
def get_profile(user_id):
    # Users can only access their own profile
    if str(current_user.id) != user_id and not current_user.is_admin:
        abort(403)
    user = User.query.get_or_404(user_id)
    return jsonify(user.to_dict())

# SECURE: Server-side role verification
@app.route('/api/admin/users')
@login_required
@require_role('admin')
def admin_users():
    return jsonify([u.to_dict() for u in User.query.all()])

Yaygın erişim kontrolü sorunları:

  • IDOR (Güvensiz Doğrudan Nesne Referansı): URL'deki /api/orders/123 değerini /api/orders/124 yaparak başka bir kullanıcının siparişine erişmek
  • Yetki yükseltme: Normal kullanıcının yönetici uç noktalarına erişmesi
  • Fonksiyon düzeyinde erişim kontrolü eksikliği: API uç noktaları yetki kontrolü olmadan doğrudan erişilebilir
  • CORS yanlış yapılandırması: Yetkisiz kaynaklara izin veren origin yapılandırması

A02: Kriptografik Hatalar

Zafiyetli örüntüler:

# INSECURE: MD5 for password hashing
import hashlib
password_hash = hashlib.md5(password.encode()).hexdigest()

# INSECURE: Hardcoded secret key
SECRET_KEY = "my-super-secret-key-123"

# INSECURE: HTTP for sensitive data
API_URL = "http://api.example.com/payments"

Düzeltilmiş kod:

# SECURE: bcrypt with salt
from bcrypt import hashpw, gensalt, checkpw
password_hash = hashpw(password.encode(), gensalt(rounds=12))

# SECURE: Environment variable for secrets
import os
SECRET_KEY = os.environ["SECRET_KEY"]

# SECURE: HTTPS enforced
API_URL = "https://api.example.com/payments"

Parola hash'leme konusunda MD5 ve SHA-1 kesinlikle kullanılmamalıdır—bu algoritmalar hız için optimize edilmiştir, oysa parola hash'leme kasıtlı olarak yavaş olmalıdır. bcrypt, scrypt veya Argon2 tercih edilmelidir. Gizli anahtarlar asla kaynak kodunda tutulmamalı, ortam değişkenleri veya sır yönetim araçları kullanılmalıdır.

A03: Enjeksiyon

Enjeksiyon 1. sıradan 3. sıraya geriledi ancak hâlâ tehlikeli. Modern çatılar büyük ölçüde koruma sağlıyor, fakat ham sorgular hâlâ üretim kodlarında karşımıza çıkıyor.

SQL Enjeksiyon örneği:

# INSECURE: String concatenation in SQL
@app.route('/api/search')
def search():
    query = request.args.get('q')
    # Attacker sends: q='; DROP TABLE users; --
    results = db.execute(
        f"SELECT * FROM products WHERE name LIKE '%{query}%'"
    )
    return jsonify(results)

# SECURE: Parameterized query
@app.route('/api/search')
def search():
    query = request.args.get('q', '')
    results = db.execute(
        "SELECT * FROM products WHERE name LIKE :query",
        {"query": f"%{query}%"}
    )
    return jsonify(results)

NoSQL Enjeksiyon (MongoDB):

// INSECURE: Direct user input in query
app.post('/api/login', (req, res) => {
  // Attacker sends: {"username": {"$gt": ""}, "password": {"$gt": ""}}
  User.findOne({
    username: req.body.username,
    password: req.body.password
  });
});

// SECURE: Input validation + sanitization
app.post('/api/login', (req, res) => {
  const username = String(req.body.username);
  const password = String(req.body.password);
  User.findOne({ username })
    .then(user => bcrypt.compare(password, user.passwordHash));
});

Temel kural basittir: kullanıcı girdisine asla güvenme. ORM ve parametrelendirilmiş sorgular kullanmak, enjeksiyon saldırılarının büyük çoğunluğunu engeller. Ancak dinamik sorgu oluşturmanın gerekli olduğu durumlarda bile girdi doğrulaması ve parametrelendirme zorunludur.

A04: Güvensiz Tasarım

2021'de listeye yeni eklendi. Bu, uygulama hatalarıyla ilgili değil—tasarım aşamasında tehdit modellemesi ve güvenlik örüntülerinin eksikliğiyle ilgili.

Örnek: Bir e-ticaret sitesi, 4 haneli bir kodla sınırsız parola sıfırlama denemesine izin veriyor. IP başına hız sınırlama olsa bile, bir botnet'e sahip saldırgan herhangi bir hesabı kaba kuvvetle ele geçirebilir.

Güvenli tasarım ilkeleri:

  • Mimari aşamasında tehdit modellemesi (STRIDE, PASTA)
  • Güvenli tasarım örüntüleri kütüphanesi (referans mimariler)
  • "Asfaltlı yol" yaklaşımı: Güvenli yolu geliştiriciler için kolay yap
  • Fonksiyonel testlerin yanında kötüye kullanım senaryosu testleri

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

Common Misconfigurations:

☐ Default credentials on admin panels (admin/admin)
☐ Unnecessary HTTP methods enabled (PUT, DELETE, TRACE)
☐ Directory listing enabled on web server
☐ Stack traces exposed in error responses
☐ Cloud storage buckets publicly accessible (S3, GCS)
☐ CORS set to Access-Control-Allow-Origin: *
☐ Debug mode enabled in production
☐ Default security headers missing

Yanlış yapılandırma sorunları defalarca büyük veri ihlallerine yol açmıştır. Herkese açık S3 bucket'ları milyonlarca kullanıcının verilerini ifşa etmiş, üretim ortamında açık kalan debug modları iç yapıyı saldırganlara sergilemiş, varsayılan admin kimlik bilgileri kritik sistemlere yetkisiz erişim sağlamıştır.

Her uygulamanın ayarlaması gereken güvenlik başlıkları:

# Nginx security headers
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header X-XSS-Protection "0" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

A06: Zafiyetli ve Güncelliğini Yitirmiş Bileşenler

Kod tabanlarının %78'i üçüncü taraf bağımlılıklarında en az bir zafiyet içeriyor. Otomatik tarama vazgeçilmezdir:

# npm audit — check Node.js dependencies
npm audit
npm audit fix

# pip-audit — check Python dependencies
pip install pip-audit
pip-audit

# Snyk — multi-language vulnerability scanner
snyk test
snyk monitor  # continuous monitoring

# GitHub Dependabot — automatic PRs for vulnerable dependencies
# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"

Log4Shell zafiyeti (Log4j) bu riskin ne kadar yıkıcı olabileceğinin çarpıcı bir örneğiydi: yaygın kullanılan tek bir kütüphanedeki zafiyet milyonlarca Java uygulamasını etkiledi. Bağımlılıkları düzenli olarak taramak, güncellemek ve SBOM (Yazılım Malzeme Listesi) tutmak artık isteğe bağlı değildir.

A07-A10: Diğer Riskler

A07 - Kimlik Doğrulama Hataları: Zayıf parolalar, MFA eksikliği, kimlik bilgisi doldurma saldırıları. Özel uygulamalar yerine kanıtlanmış kütüphaneler (Passport.js, Django auth, NextAuth) kullanın.

A08 - Yazılım ve Veri Bütünlüğü: Doğrulanmamış CI/CD iş hatları, imzasız güncellemeler, serileştirme çözme (deserialization) saldırıları. Kod ve verilerin bütünlüğünü her zaman imzalar ve sağlama toplamları ile doğrulayın.

A09 - Güvenlik Günlükleme Hataları: Bir ihlali algılayamıyorsanız, müdahale de edemezsiniz. Kimlik doğrulama olaylarını, erişim kontrolü hatalarını, girdi doğrulama hatalarını ve uygulama hatalarını günlükleyin.

A10 - SSRF (Sunucu Taraflı İstek Sahteciliği): Sunucu, saldırgan adına isteklerde bulunur. Bulut metadata uç noktaları (169.254.169.254) başlıca hedeflerdir. Tüm URL'leri doğrulayın ve temizleyin, izin listeleri kullanın.

OWASP'ı Geliştirme Sürecinize Entegre Etmek

Secure Development Lifecycle (SDL):

 Requirements → Threat Modeling (A04: Insecure Design)
      │
   Design → Security Architecture Review
      │
 Development → SAST scanning, secure coding standards
      │
  Testing → DAST scanning, penetration testing
      │
 Deployment → Security hardening, dependency scanning
      │
 Operations → WAF, monitoring, incident response
      │
   Review → Lessons learned, update threat model

OWASP Top 10, tamamlanacak bir kontrol listesi değil—uygulama güvenliği hakkında düşünmek için bir çerçevedir. Bu riskleri geliştirme kültürüne içselleştiren kuruluşlar, daha dayanıklı yazılımlar üretir. Güvenlik, geliştirme sürecinin sonuna eklenen bir katman değil, başından itibaren tasarımın parçası olmalıdır.

Kaynaklar: OWASP Top 10 (2021), OWASP Testing Guide, OWASP Cheat Sheet Series