PHP’nin yaygın olarak kullanılan PDO (PHP veri nesneleri) kütüphanesinde kritik bir güvenlik açığı, saldırganların geliştiriciler hazır ifadeleri doğru bir şekilde uyguladıklarında bile kötü amaçlı SQL komutları enjekte etmelerini sağlayan keşfedilmiştir.
Downunderctf yakalama mücadelesinin analizi ile ortaya çıkan güvenlik kusuru, PDO’nun SQL ayrıştırıcısındaki zayıflıklardan yararlanıyor ve dünya çapında milyonlarca web uygulamasını etkiliyor.
Güvenlik Açığı’na Teknik Genel Bakış
Güvenlik açığı, PDO’nun yerel veritabanı hazırlanmış ifadeleri kullanmak yerine hazırlanan ifadeleri taklit etme konusunda varsayılan davranışından kaynaklanmaktadır.
PDO, bağlı parametreleri işlemek için kendi SQL ayrıştırıcısını uygular, ancak bu ayrıştırıcı, kullanıcı girişini bu şekilde ele alınmamaları gereken bağlamlarda bağlı parametreler olarak yanlış yorumlayabilir.
Saldırı tekniği, kullanıcı girişinin doğrudan hazırlanmış ifadelerde, özellikle parametreler olarak bağlanamayan sütun ve tablo adları için göründüğü senaryolardan yararlanmayı içerir. Görünüşte güvenli bir kod örneğini düşünün:
prepare("SELECT $col FROM fruit WHERE name = ?");
$stmt->execute([$_GET['name']]);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
Saldırganlar, null bayt ve soru işaretleri içeren özel hazırlanmış yükleri enjekte ederek bunu kullanabilirler.
Bir yük gibi?#\ 0 kullanıldığında, PDO’nun ayrıştırıcısı soru işaretini yanlış bir şekilde sınırlı bir parametre olarak tanımlar ve SQL enjeksiyonuna yol açar.
Saldırı, PDO’nun ayrıştırma mantığını dikkatlice oluşturulmuş yükler aracılığıyla manipüle ederek çalışır.
Örneğin, http: // localhost: 8000/? Name = x fr (#& col =?#%00’dan veritabanı şeması bilgilerini başarıyla çıkarabilir.
Güvenlik açığı farklı veritabanı sistemlerini farklı şekilde etkiler. Geliştiriciler PDO :: attr_emula_prepares açıkça devre dışı bırakmadıkça MySQL varsayılan olarak savunmasızdır.
PostgreSQL, emülasyon etkinleştirildiğinde savunmasız hale gelirken, SQLITE null bayt kullanımı nedeniyle korunur.
Eski PHP versiyonları daha da büyük riskler sunar. PHP 8.3 ve önceki sürümler tüm veritabanı lehçeleri için tek bir SQL ayrıştırıcısı kullandı, bu da onları bu saldırılara karşı önemli ölçüde daha savunmasız hale getirdi.
Güvenlik araştırmacıları birkaç savunma önlemi önermektedir. Geliştiriciler, mümkün olduğunda PDO :: attr_emula_prepares devre dışı bırakmalı ve en son PHP sürümünü (8.4 veya daha yeni) çalıştırdıklarından emin olmalıdır. Ayrıca, uygulamalar SQL sorgularında boş baytların görünmesini önlemelidir.
Keşif, bu kombinasyon önemli güvenlik riskleri oluşturduğundan, sorgu emülasyonu kullanılırken asla manuel olarak oluşturulan SQL fragmanlarını PDO bağları ile karıştırmanın önemini vurgulamaktadır.
Bu güvenlik açığı, kapsamlı güvenlik testi için kritik ihtiyacın ve görünüşte güvenli kod uygulamalarında gizlenen potansiyel tehlikelerin altını çizmektedir.
Get Free Ultimate SOC Requirements Checklist Before you build, buy, or switch your SOC for 2025 - Download Now