İnsanlar veritabanı çalışma yapısını bilmeden SQL Injection saldırılarını ezbere bir şekilde öğreniyor. İleri ki aşamalara geçtiği zamanda tıkanıp kalıyor. Saldırı öncesi kesinlikle veritabanı üzerinde önemli fonksiyonları ve koşulları bilmemiz gerekir. MySQL Veritabanı eğitimi için daha önce yazdığım yazıya buradan ulaşabilirsiniz. https://www.asimmisirli.com/mysql-ile-veritabani-yonetimi-101/
Burada ki yazımda basit komutlarını bildiğinizi varsayarak SQL Injection ataklarında kullanılan union, order by , string birleştirme ifadesi, yorum ifadeleri ve veritabanı için bazı fonksiyonlardan bahsedeceğim.
Senaryo Bilgisi
İlgili anlatıma geçmeden önce veritabanı ve tablolarımıza bakalım; customers veritabanı içeresinde iki adet tablo bulunmaktadır. Bunlar; Users ve AdminUsers tablolarıdır. Users tablosu 3 satır 3 sütundan oluşur. AdminUsers tablosu 2 satir 2 sütundan oluşur.
MySQL ORDER BY
Veritabanlarında ORDER BY anahtarı sonuçları sıralama yapmak için kullanılır. Sonuçlar ascending ya da descending sıralamalarıdır. ASC, sıralaması küçükten büyüğe ya da a harfinden z harfine sıralama şeklidir. DESC ise tam tersidir. ORDER BY kullandığımızda default olarak ASC sıralama gelir.
ORDER BY KULLANIMI
Userid değerlerini büyükten küçüğe göre sıralama yapacak olursak aşağıda ki komut kullanılır.
SELECT * FROM Users ORDER BY Userid DESC;
Saldırgan için Order By Ne İfade ediyor ?
Users tablosu içeresinde 3 sütun bulunmaktadır. Saldırgan 1 ile başlayıp tüm kolonları hata alana kadar denemektedir. Eğer filtreleme de sistem tarafından yok ise saldırgan ekran çıktısında 4. sütunun olmadığını görecektir.
Örnek vermek gerekirse ekran görüntüsüne bakalım. Saldırganın sırayla 1,2,3 sütunlarına göre ORDER BY komutunu başarılı bir şekilde çalıştırır. Sıra 4. sütuna gelince ORDER BY ile sıralamak yapmak istediğinde hata mesajını alır. Hata mesajı ile sütun sayılarını belirlemiş olur. Bunun sayesinde zafiyetli sistem üzerinde 3 tablo olduğunu bulabiliriz. Daha sonrası sömürü işlemleri için UNION operatöründen faydalanacaktır.
MySQL Union Operatörü
Tüm veritabanlarında bulunan operatörü MySQL ile örneklemesini gerçekleştireceğiz. Union operatörü bizlere iç içe veritabanı sorguları yazmamı sağlamaktadır. Bu sorgular öncesinde Union için bazı kurallar vardır. Bunlarda şunlardır;
- Yapılacak sorgularda sütun sayıları eşit olmalıdır.
- Sütunlar benzer veri tiplerinde olmalıdır.
Örnek Union Yazımı
MySQL Union Kullanımı ile iç içe örnek sorgu için Users ve AdminUsers tablolarından Username ve Password sütunlarını çekelim.
SELECT Username,Password FROM Users UNION SELECT Username,Password FROM AdminUsers;
Saldırgan İçin Union
Hedef sistem üzerinde 3 adet sütun olduğunu tespit ettikten sonra ilk yapılacak iş aktif bilgi toplamaktır.
- Sütunların tiplerini belirlermek
- Veritabanı versiyonu tespit etmek
- Tek sütun string ise string birleştirme operatörü kullanmak
- informaion schema’ya ulaşmak gibi bir çok adım sayılabilir.
https://portswigger.net/web-security/sql-injection/cheat-sheet burada çok güzel kopya kağıdı bulunuyor. Buradan faydalanarak ilgili denemeleri yapabiliriz.
Senaryo Bilgisi 2:
Saldırgan 3.sütunun string olduğunu geri sütunların int olduğunu tespit ediyor. Elinde ki tek sütunla ilerleme yapacaktır.
Kullandığım veritabanına uygun versiyon tespiti edebilmek için version() parametresini kullanacağım. Tabiki hedef sistemlerde veritabanlarını bilmediğimiz için kopya kağıdında bulunan değerlerini denememiz gerekir.
SELECT * from Users UNION Select NULL,NULL,version();
MySQL Concat kullanımı
Veritabanlarında çoklu sütunları tek bir sütun içeresinde birleştirebileceğimiz fonksiyonlar bulunur. MySQL için bu Concat fonksiyonudur.
SELECT CONCAT (Username," ",Userid) From Users;
MySQL Yorum Satırı
— ifadesi ile kendisinden gelen sonra komutları yorum satırı olarak işaretler.
SELECT CONCAT(Username," ",Password) FROM AdminUsers;-- UNION SELECT Username,Password FROM Users;
Veritabanı İçerikleri
Tüm tablo bilgilerin tutulduğu information_schema.tables vardır. Buradan yararlanarak ilerliyoruz.
SELECT * FROM information_schema.tables;
AdminUsers tablosu için sütun bilgilerini öğrenilir.
SELECT * FROM information_schema.columns WHERE table_name = 'AdminUsers';
SELECT Username,Password FROM AdminUsers;
İfadesi ile de tüm sütunları okuma işlemi yapıyoruz. SQL Injection saldırısında bu yöntemler ile web tarafından ilerliyoruz. Aslında tek yapmamız gerekenler SQL ifadelerine hakim olabilmektir.