CVE-2023-38890 – Online Shopping Portal 3.1 Uzaktan Kod Yürütme
Wed Jan 21 2026 · 3 min read
Category: Security Research
Bu zafiyet SourceCodester Online Shopping Portal sürüm 3.1'i etkilemektedir.
SQL enjeksiyonu ve kısıtlanmamış dosya yükleme yoluyla uzaktan kimlik doğrulaması olmadan kod yürütülmesine (RCE) neden olur.
1. Keşif ve Tespit: Giriş Noktası (SQL Enjeksiyonu)
Hedefim yönetim paneliydi. Bir "Black Hat" bakış açısıyla, ilk adımım her zaman kimlik doğrulama mekanizmasını zorlamak ve zayıflık aramaktır.
Keşif Süreci
/admin/index.php adresine gittim ve standart bir giriş formuyla karşılaştım. Şifre tahmin etmekle vakit kaybetmek yerine, username alanına özel karakterler girerek SQL Enjeksiyonu (SQLi) testi yaptım.
-
Deneme 1:
admin'-> Sonuç: Hata veya geçersiz giriş. -
Deneme 2:
' OR 1=1---> Sonuç: Başarılı Giriş.
' OR 1=1-- payload'ını girerek veritabanını kandırdım. Sorgu mantığını "Kullanıcı adı boş olsun VEYA 1 eşittir 1 olsun" şeklinde değiştirdim. 1=1 her zaman doğru olduğu için, veritabanı admin tablosundaki ilk kaydı döndürdü ve şifre girmeden yönetici olarak içeri girdim.
Kök Neden Analizi (Root Cause)
admin/index.php kaynak kodunu incelediğimde zafiyetin nedeni barizdi:
$username=$_POST['username'];
$ret=mysqli_query($con,"SELECT * FROM admin WHERE username='$username' and password='$password'");

Neden Zafiyetli: Geliştirici, kullanıcıdan gelen $username verisini doğrudan SQL sorgusuna yapıştırmış. Hiçbir temizleme (sanitization) yok, özel karakterler kaçış dizisine alınmamış ve en önemlisi Hazırlanmış İfadeler (Prepared Statements) kullanılmamış. Bu, ders kitaplarına konu olacak türden bir SQL Enjeksiyonudur.
2. Yetki Yükseltme: RCE Avı (Kısıtlamasız Dosya Yükleme)
Yönetici erişimini elde ettikten sonra hedefim sadece erişim değil, sunucuyu tamamen kontrol etmekti (Uzaktan Kod Çalıştırma - RCE). Uygulamanın dosya sistemiyle etkileşime giren özelliklerini aramaya başladım.
Keşif Süreci
"Ürün Ekle" (Insert Product) sayfasını (admin/insert-product.php) buldum. Bu form, yöneticilerin ürün resimleri yüklemesine izin veriyordu. Bu, zararlı dosya yüklemek için mükemmel bir hedeftir.
Geçerli bir resim (JPG/PNG) yerine, içinde basit bir PHP betiği olan shell.php adında bir dosya yüklemeyi denedim.
-
Sonuç: Uygulama dosyayı hiçbir hata vermeden kabul etti.
-
Doğrulama: Yükleme dizinini (
productimages/{id}/) kontrol ettim ve.phpdosyamın sunucuda saklandığını ve çalıştırılabilir olduğunu gördüm.
Kök Neden Analizi
admin/insert-product.php dosyasındaki yükleme işlemi kodları kritik derecede hatalıydı:
move_uploaded_file($_FILES["productimage1"]["tmp_name"],"productimages/$productid/".$_FILES["productimage1"]["name"]);

Neden Zafiyetli:
-
Uzantı Kontrolü Yok: Kod, dosya uzantısının güvenli olup olmadığını (örn.
.jpg,.png) kontrol etmiyor..php,.exegibi dosyaları körü körüne kabul ediyor. -
MIME Türü Kontrolü Yok: Dosyanın gerçek içeriğini doğrulamıyor.
-
Yeniden Adlandırma Yok: Dosyayı kullanıcının verdiği orijinal isimle kaydediyor (
$_FILES["..."]["name"]). Bu, saldırganın dosya yolunu kolayca tahmin etmesini sağlıyor.
3. Silahlandırma: Exploit Geliştirme
Tespit ettiğim bu iki zafiyeti birleştirerek tam otomatik bir saldırı aracı (exploit.py) geliştirdim.
Exploit Mantığı
-
Oturum Başlatma:
requests.session()kullanarak çerezleri (cookies) koruyorum, böylece bir tarayıcıyı simüle ediyorum. -
Kimlik Doğrulama Atlatma:
/admin/adresineusernamealanında' OR 1=1-- apayload'ı ile bir POST isteği gönderiyorum. Bu, yetkili bir yönetici oturumu açmamı sağlıyor. -
Payload Oluşturma: Tespit edilmemek ve çakışmaları önlemek için rastgele bir ürün adı ve shell dosya adı üretiyorum. Payload basit bir PHP web shell'idir:
<?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?> -
Zararlı Yükleme:
insert-product.phpsayfasınamultipart/form-dataformatında bir POST isteği hazırlıyorum. Gerekli ürün bilgilerini dolduruyorum veproductimage1alanına PHP shell dosyamı ekliyorum. -
Yol Tespiti: Yükleme işleminden sonra, sunucunun shell dosyasını tam olarak nereye kaydettiğini bulmak için yeni oluşturduğum ürünü aratıyorum.
-
Çalıştırma: Son olarak, yüklenen shell'in URL'ini ekrana yazdırıyorum. Bu URL'e
?cmd=whoamiparametresiyle gidildiğinde sunucuda komut çalıştırılmış oluyor.
4. İyileştirme: Nasıl Kapatılır?
Bu uygulamayı güvenli hale getirmek için kodun önemli ölçüde yeniden düzenlenmesi gerekir.
SQL Enjeksiyonunu Düzeltme
Hazırlanmış İfadeler (Prepared Statements) kullanılmalıdır. Bu, veritabanının kullanıcı girdisini kod olarak değil, sadece veri olarak işlemesini sağlar.
Güvenli Kod Örneği (admin/index.php):
$stmt = $con->prepare("SELECT id, username, password FROM admin WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
// Giriş başarılı
}
Dosya Yükleme Zafiyetini Düzeltme
Sıkı bir doğrulama ve dosya yeniden adlandırma işlemi uygulanmalıdır.
Güvenli Kod Örneği (admin/insert-product.php):
$allowed_extensions = array("jpg", "jpeg", "png", "gif");
$filename = $_FILES["productimage1"]["name"];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
// 1. Uzantı Kontrolü
if (!in_array($ext, $allowed_extensions)) {
die("Geçersiz dosya türü.");
}
// 2. MIME Türü (İçerik) Kontrolü
$check = getimagesize($_FILES["productimage1"]["tmp_name"]);
if ($check === false) {
die("Dosya bir resim değil.");
}
// 3. Yeniden Adlandırma (Üzerine yazmayı ve çalıştırmayı önleme)
$new_filename = md5(time() . $filename) . '.' . $ext;
move_uploaded_file($_FILES["productimage1"]["tmp_name"], "productimages/$productid/" . $new_filename);
CVE ID: CVE-2023-38890
İlk Yayın Tarihi: 17 Haziran 2021
Araştırmacı: Tağmaç "Tagoletta"
Canonical reference: https://www.exploit-db.com/exploits/50029
Github Repository: https://github.com/Tagoletta/CVE-2023-38890
Sıkça Sorulan Sorular
CVE-2023-38890 nedir?
Online Shopping Portal 3.1 üzerinde, kimlik doğrulaması gerektirmeden SQL Enjeksiyonundan Uzaktan Kod Yürütmeye ulaşan, Tağmaç 'Tagoletta' tarafından keşfedilmiş bir zero-day zafiyetidir.
SQL enjeksiyonu nasıl RCE'ye ulaşır?
Enjeksiyon, web'den erişilebilir dizine zararlı bir dosya yazmayı mümkün kılar; bırakılan webshell sunucuda işletim sistemi komut çalıştırma sağlar.
CVE-2023-38890'dan kimler etkilenir?
Ağa açık her Online Shopping Portal 3.1 kurulumu; çünkü sömürü geçerli bir hesap gerektirmez.
CVE-2023-38890 nasıl azaltılır?
Tüm sorguları parametreleştirin, veritabanı FILE ayrıcalıklarını kaldırın, web kökü yazma izinlerini kısıtlayın ve girdi doğrulama ile birlikte bir WAF devreye alın.
CVE-2023-38890 için PoC exploit writeup'ı nerede?
Tam proof-of-concept exploit kodu ve adım adım writeup bu sitede yayınlanmıştır — SQL enjeksiyonunu bir webshell'e zincirleyip RCE elde eden, çalışmaya hazır PoC için eşlik eden exploit sayfasına bakın.