ModSecurity ile SQL Injection Açığını Engelleme

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 Nedir?

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:

 

— 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:

login.php

sql(“select userid from users where login='$_REQUEST[login]' and password='$_REQUEST[pass]' and level=$_REQUEST[level] ”)

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:

http://host/login.php?login=admin&pass=XXXXX&level=level+or+level=0

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:

SecRule REQUEST_FILENAME "/login.php" "phase:2, t:none, t:normalisePath, t:lowercase, t:urlDecodeUni, chain, deny, log, id:1011"
    SecRule ARGS:login|ARGS:pass|REQUEST_COOKIES:login|REQUEST_COOKIES:pass "'" "t:none, t:urlDecodeUni"

SecRule REQUEST_FILENAME "/login.php" "phase:2, t:none, t:normalisePath, t:lowercase, t:urlDecodeUni, chain, deny, log, id:1012"
    SecRule ARGS:level|REQUEST_COOKIES:level "!^[0-9]+$" "t:none"

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.

Yazı dizimizin bir sonraki bölümünde görüşmek üzere…

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir