CompTIA SY0-701: Uygulama ve Web Güvenliği — Çalışma kılavuzu
Şunun bir parçası: CompTIA Security+ SY0-701 — Çalışma kılavuzu. Doğrulanmış cevaplarla şurada pratik yapın: CompTIA sınav merkezi, veya şurada süreli deneme sınavları çözün: ExamRoll.io.
Modern uygulamalar, iş mantığı, hassas veriler ve güvenilmeyen kullanıcı girdisinin kesişim noktasında yer alır. Web ve mobil ön uçlar tüm internete maruz kaldığından, herhangi bir kurumdaki en büyük ve en sürekli istismar edilen saldırı yüzeylerinden birini temsil ederler. Bunları savunmak, kodun yazılma şekliyle başlayan ve çalışma zamanı korumaları, bütünlük doğrulaması ve sürekli testlere kadar uzanan katmanlı kontroller gerektirir.
Enjeksiyon Saldırıları
Enjeksiyon, arketipik web güvenlik açığı olmaya devam etmektedir. Bir uygulamanın, güvenilmeyen girdiyi bir yorumlayıcıya (bir SQL sorgusu, bir kabuk komutu, bir LDAP filtresi, bir XML ayrıştırıcısı veya bir şablon motoru) kodu veriden düzgün bir şekilde ayırmadan birleştirmesiyle ortaya çıkar. Bir SQL enjeksiyonunda (SQLi), bir saldırgan, veritabanının saldırgan kontrolündeki mantığı yürütmesi için bir sorguyu manipüle eder. PHP’de klasik bir zafiyetli desen şuna benzer:
$query = "SELECT * FROM users WHERE username = '" . $_GET['user'] . "'";
admin' OR '1'='1 ifadesini göndermek, sorguyu her satırı döndüren bir totolojiye dönüştürür. Daha gelişmiş varyantlar arasında union tabanlı veri çıkarma (' UNION SELECT credit_card FROM payments--), kör Boolean veya zaman tabanlı çıkarım (' AND SLEEP(5)--) ve DNS geri aramaları yoluyla bant dışı sızdırma bulunur. Kesin çözüm, sorgu şablonunu ve parametrelerini veritabanına ayrı yapılar olarak gönderen parametreli sorgular veya hazırlanmış ifadelerdir (prepared statements):
cursor.execute("SELECT * FROM users WHERE username = %s", (user_input,))
Komut enjeksiyonu aynı deseni takip eder ancak işletim sistemi kabuğunu hedefler. os.system("ping " + host) gibi bir kod, bir saldırganın 8.8.8.8; cat /etc/passwd göndererek keyfi komutlar çalıştırmasına olanak tanır. Düzeltme, kabuk çağrısından tamamen kaçınmayı, argüman dizilerini kabul eden API’ler kullanmayı (subprocess.run(["ping", host], shell=False)) ve bir kabuğa ulaşması gereken herhangi bir değere katı bir izin listesi (allow-list) doğrulaması uygulamayı gerektirir.
Siteler Arası Betik Çalıştırma (XSS) ve CSRF
Siteler Arası Betik Çalıştırma (Cross-Site Scripting - XSS), güvenilir bir uygulama tarafından oluşturulan sayfalara kötü amaçlı betiklerin enjekte edilmesidir ve kurbanın tarayıcısının, sitenin origin’i dahilinde saldırgan kodunu çalıştırmasına neden olur. Yansıtılmış (Reflected) XSS, payload’ları zafiyetli bir parametreden yansıtır; Depolanmış (Stored) XSS, payload’u veritabanında kalıcı hale getirir ve her görüntüleyiciye sunar; DOM tabanlı XSS ise tamamen, güvenilmeyen verileri innerHTML, document.write veya benzeri sink’lere yazan istemci tarafı JavaScript’te meydana gelir. Sonuçları, oturum ele geçirmeden (session hijacking) ve tuş kaydından (keylogging), zorunlu eylemler yoluyla hesabın tamamen ele geçirilmesine kadar uzanır.
Siteler Arası İstek Sahteciliği (Cross-Site Request Forgery - CSRF), farklı ama tamamlayıcı bir saldırıdır. Tarayıcının çerezleri otomatik olarak dahil etmesini kötüye kullanarak, kimliği doğrulanmış bir kullanıcıyı istenmeyen bir istek göndermesi için kandırır — örneğin, kötü amaçlı bir sitedeki gizli bir formun bank.com/transfer adresine POST isteği göndermesi gibi. Savunmalar arasında senkronizasyon belirteçleri (synchronizer tokens) (formlara gömülen ve sunucu tarafında doğrulanan oturum başına rastgele değerler), SameSite=Lax veya SameSite=Strict çerez (cookie) niteliği ve hassas eylemler için yeniden kimlik doğrulaması gerektirmek bulunur. XSS ve CSRF genellikle birbiriyle karıştırılır, ancak XSS kurbanın tarayıcısında kod çalıştırırken, CSRF ise sadece tarayıcının bir istek göndermesine neden olur; özellikle, başarılı bir XSS saldırısı çoğu CSRF savunmasını alt edebilir.
Güvenli Kodlama: Girdi Doğrulama ve Çıktı Kodlama
İki kontrol sıkça karıştırılır, ancak farklı sorunları çözerler. Girdi doğrulama, uygulama üzerinde işlem yapmadan önce verilerin beklenen yapıya (uzunluk, tür, karakter seti, aralık, format) uygun olmasını sağlar. Bu, mümkün olduğunda izin listeleri (allow-lists) kullanılarak (^[A-Za-z0-9_]{3,20}$ bir kullanıcı adı için) sunucuda yapılmalıdır. JavaScript kullanarak istemci tarafı doğrulama sadece bir kullanılabilirlik özelliğidir; herhangi bir HTTP proxy ile atlatılabilir ve asla güvenlik sınırı olmamalıdır.
Çıktı kodlama, verilerin aktığı her bağlamda güvenli bir şekilde oluşturulmasını sağlar. Tamamen geçerli bir girdi olan aynı dize, nereye yerleştirildiğine bağlı olarak farklı muamele gerektirebilir: HTML gövde (body) bağlamı HTML entity kodlaması (< → <), nitelik (attribute) bağlamı tırnak içine alınmış nitelik kodlaması, JavaScript bağlamı \xHH kaçış (escaping) işlemi ve URL’ler yüzde kodlaması (percent-encoding) gerektirir. O'Brien gibi bir kullanıcı adı meşru bir girdidir ancak HTML içine yerleştirildiğinde O'Brien olarak kodlanmalıdır. Girdi doğrulama, çıktı kodlamanın yerini alamaz ve kodlama da doğrulamanın yerini alamaz — bunlar, veri yaşam döngüsünün farklı noktalarında farklı sorunları ele alırlar.
Ek sağlamlaştırma önlemleri arasında betik kaynaklarını kısıtlamak için Content Security Policy (CSP) başlıkları, oturum çerezlerindeki HttpOnly ve Secure bayrakları ve her güven sınırında (trust boundary) parametreli API’ler bulunur.
WAF’lar ve Dosya Yükleme Korumaları
Bir web uygulama güvenlik duvarı (web application firewall), HTTP trafiğini denetler ve bilinen kötü amaçlı kalıplarla (SQLi imzaları, XSS payload’ları, dizin geçişi (path traversal) dizileri, protokol anormallikleri) eşleşen istekleri engeller. Bir ters proxy (reverse proxy) olarak dağıtıldığında (OWASP Core Rule Set ile ModSecurity, AWS WAF, Cloudflare, F5), bir güvenlik açığı keşfedildiğinde kod düzeltilmeden önce değerli bir sanal yama (virtual patching) sağlar. Ancak, bir WAF, güvenli kodlamanın yerini tutan bir çözüm değil, telafi edici bir kontroldür. Gelişmiş saldırganlar, kodlama hileleri, HTTP parametre kirliliği ve payload parçalanması yoluyla WAF’ları rutin olarak atlarlar.
Dosya yüklemeleri, güvenilmeyen içeriği sunucu tarafı depolama ve genellikle çalıştırma ile birleştirdikleri için özel bir dikkat gerektirir. Korumalar arasında, uzantıya veya Content-Type başlığına güvenmek yerine sihirli baytları (magic bytes) inceleyerek dosya türünü doğrulamak, yüklemeleri web kök dizininin (web root) dışında depolamak, özel olarak hazırlanmış dosya adları aracılığıyla dizin geçişini (directory traversal) önlemek için dosyaları sunucu tarafından oluşturulan tanımlayıcılarla yeniden adlandırmak, depolamadan önce antivirüs ile taramak ve aynı kaynak (same-origin) betiklerinin çalışmasını önlemek için kullanıcı tarafından yüklenen içeriği ayrı bir alan adından (domain) sunmak bulunur.
Uygulamalı Senaryo: SQL Injection ile Veritabanının Tamamının Ele Geçirilmesi
Bir perakende şirketinin ürün arama uç noktası, sanitizasyon (temizleme) yapılmadan doğrudan bir SQL sorgusuna eklenen bir category parametresini kabul ediyordu. Bir güvenlik araştırmacısı, ' UNION SELECT table_name,null,null FROM information_schema.tables-- girdisinin gönderilmesinin, yanıtta tüm veritabanı tablolarının bir listesini döndürdüğünü keşfetti. Ardından yapılan isteklerle customers tablosu çekildi ve bu tablodan isimler, e-posta adresleri ve bcrypt ile hash’lenmiş parolaları içeren 1,2 milyon kayıt elde edildi. Saldırgan ayrıca, SQL injection aracılığıyla çağrılarak web kök dizinine (web root) dosya yazabilen bir saklı yordam (stored procedure) keşfetti. Bu durum, bir webshell dağıtımına ve sunucunun tamamen ele geçirilmesine olanak sağladı. Bu güvenlik açığı üç yıldır mevcuttu ve daha önceki iki sızma testinde (penetration test) gözden kaçırılmıştı, çünkü test uzmanları arama uç noktasını değil, yalnızca giriş formunu test etmişlerdi. Alınacak ders: Injection testleri, sadece bariz kimlik doğrulama yollarını değil, her uç noktadaki her parametreyi kapsamalıdır.
← Olay Müdahalesi · Tüm alanlar · Cloud →
Bu soruları çözün → · ExamRoll.io’da süreli pratik →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
Sınavınızı geçin →