ModSecurity ile SQL Injection Açığını Engelleme – Sibergah
ANA SAYFA » UYGULAMA GÜVENLİĞİ » GÜVENLİK SİSTEMLERİ » ModSecurity ile SQL Injection Açığını Engelleme
YAZAN: M. MEKİN PESEN ⋅ 23/02/2016 ⋅
ModSecurity ile web güvenlik açıklarının engellenmesi hakkındaki yazı dizimizin bu bölümünde ModSecurity kullanarak SQL injection saldırlarının nasıl engellenebileceği üzerinde duracağız. SQL injection web uygulamalarında sık karşılaşılan ve en tehlikeli güvenlik açıklarından biridir. SQL injection zafiyetinin, deneyimli bir saldırgan tarafından istismar edilerek uygulamanın, sitenin, sunucunun, veri tabanının ve hatta tüm IT ortamının ele geçirilmesine kadar uzanan oldukça bereketli ve geniş bir saldırı yüzeyi vardır.
SQL Injection, herhangi bir SQL veri tabanı türüyle ilişkili olan web uygulamalarına dışarıdan gönderilen dinamik SQL sorgularına ek SQL ifadeleri iliştirmek ve veri tabanın farklı davranmasını veya hata vermesini sağlayacak fazladan parametre ve karakter enjekte etmektir. SQL Injection, web uygulamasında kullanılan kodlama dilinden veya veri tabanından bağımsız olarak veri tabanı ilişkisine sahip her türlü uygulamada bulunabilir. Buradaki sorun aslında veri tabanında değil, uygulama tarafındadır ve bu yüzden bunun geliştiricinin ilgili alanında olması gerekir.
Bu yazıda OWASP ModSecurity CRS kural setleri ile High-Tech Bridge (ağırlıklı olarak) ve SpiderLabs Blog kaynakları referans olarak alınmıştır. Ayrıca bu yazıda SQL ve SQL Injection hakkındaki detaylara girmeyeceğimizden ötürü sizleri bir önceki yazıda olduğu gibi yine internetteki diğer yararlı kaynaklara havale ediyoruz:
Web Uygulama Güvenliği #101: https://www.exploit-db.com/docs/19136.pdf
— BÖLÜM 2: ModSecurity ile SQL Injection Açığını Engelleme —
XSS önleme yazısında da bahsettiğimiz gibi ModSecurity CRS, “modsecurity_crs_41_sql_injection_attacks.conf” kural seti ile klasik SQL Injection sömürü vektörlerinin çoğunu engelleyebiliyor. Bununla birlikte bu kural setinin engellemediği SQL Injection durumları da olabiliyor. Bunun için alttaki zafiyetli koda bir göz atalım:
Bu zafiyetli kodda klasik 3 HTML parametresinde SQL Injection güvenlik açığı bulunuyor. Bu örnekte ModSecurity CRS filtrelemesini baypas edebilmek için üçüncü HTML parametresi olan “level”i istismar etmektir. Böylece kimlik doğrulama mekanizması aşılmış olacaktır. Bunun için de alttaki HTTP request’i kullanılabilir:
Bununla birlikte eğer zafiyeti biliyorsanız, ModSecurity CRS filtreleri içinde olmasına gerek kalmadan spesifik bir kural ile üçüncü parametrenin istismar edilmesini engelleyebilirsiniz. Bunun için de alttaki kurallardan yararlabilirsiniz:
Yukarıdaki sette yer alan ilk kuralda “login” ve “pass” ile cookie parametrelerindeki tek ve çift tırnak engellenirken, ikinci kuralda da “level” parametresi için rakam olmayan değerler otomatik engelleniyor. Görüldüğü üzere zafiyet tam olarak bilindiği sürece ModSecurity CRS’in hazır kurallarına bağlı kalmadan özelleştirilmiş kurallar oluşturulabiliyor. Böylece false-positive’leri de azaltmak kolaylaşıyor.