Hoşgeldin Misafir

SQLite sistemlerde UNION tabanlı SQL injection

Reisci

Reisci

Yerli Ve Milli Hacker
11 Mar 2020
6,569 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
SQL injection açığında uzmanlaşanların bilmesi gereken bir nokta ise başka veritabanı teknolojilerine(yazılımlarına) uygun farklı sorgular gerçekleştirmektir.

Ben bugün en sık yapılan atak vektörü olan UNION tabanlı SQL injection saldırısını anlatacağım ama farklı olarak SQLite veritabanı üzerinden gerçekleşecek işlem.

Aslında MySQL tabanlı sistemlerde yapılan SQL injection'dan pek bir farkı yok.

Geçelim saldırıya;

Sistem bize bir input veriyor ve verdiğimiz input veritabanında sorguya alınıp çıktı olarak gösteriliyor.
Aklımda az çok sorgu canlanıyor. Büyük ihtimalle sorguda WHERE elemanı içerisindeyiz.

cna6y1w.png


Biz şimdi buraya tek tırnak atarsak çıktı bize hata olarak dönüyor. Yani tek tırnak SQL sözdizimini bozduğundan hata dönüyor kısacası SQL sorgusunda değişikler yapabiliriz.

12ivq2m.png


Direkt olarak ORDER BY ile sorgumuzdaki kolon sayısını tespit edelim ki UNION birleştirici operatörüne doğru kolon sayısını verebilelim.
10 kolon yokmuş sistemde. Eğer olsaydı 10. kolona göre sıralama işlemi gerçekleşecekti çünkü ORDER BY sorgu elemanı bu işe yarar.

1eue6ej.png


5 kolon varmış. Birer birer artırarak kaç kolon olduğunu tespit edebiliriz. Hata almadığımız en son sayı bizim kolon sayımızdır. Deneyerek 6 kolon olduğunu tespit ettik.

Not: Burada her bir sayı sırasıyla ifade ettiği kolona denk gelir. Yani order by 3 dersek sorguda 3. sırada bulunan kolonu temsil eder ve o kolona göre listelemeyi gerçekleştirir.

ob8sq7o.png


Şimdi UNION ile yeni sorgumuzla eski sorgumuzu birleştirelim.

Yeni Sorgu: SELECT 1,2,3,4,5,6--
SQLite içerisinde yorum satırı -- ile olur. -- vererek eğer varsa sondaki sorgu elemanlarını görmezden gel diyoruz sisteme. yani yorum içerisine alıyoruz.

Not: buradaki her bir sayı kolon sayısına hitaben verilmiştir hepsine null da verebiliriz ancak sorgudaki hangi kolondaki verinin sayfada gösterildiğini anlamak için rakam veriyoruz.

o74g0fs.png


Sorgudaki çoğu kolondaki değer sayfada gösteriliyormuş şimdi örneğin 2'yi seçiyorum ve oraya istediğim veriyi okumak için tbl_name yazıyorum
Not: SQLite içerisinde MySQL gibi içerisinde default olarak gelen diğer veritabanlarının bilgilerini de tutan bir schema var - sqlite_master
Schema içindeki tbl_name adlı tablo ise SQLite içerisindeki tabloları gösterir.

Sorgu: ' UNION SELECT 1,tbl_name,3,4,5,6 FROM sqlite_master--

ckkou6x.png


Şimdi gelelim buradaki "users" tablosunun kolonlarını bulmaya bunun için sqlite_master içindeki sql tablosu sayesinde kolon isimlerini karışıkta olsa görebilmekteyiz.

Sorgu: ' UNION SELECT 1,sql,3,4,5,6 FROM sqlite_master--
Not: direkt bu adımı yaparakta sistemdeki tablolara ve kolonlarına erişebilirdik ama ben bir nebze de olsa sql injection mantığını anlamanızı istedim.

m9s6pyn.png


Şimdi gelelim kolonları çekmeye
Burası düz kolon çekme normalden farkı yok.

Sorgu: aaaa' UNION SELECT 1,login,password,4,5,6 FROM users--+-

i3umdz0.png


Not: Önceki sorgudan gelen verileri görmemek için en başa random bir şekilde o sorgudan çıktısı mümkün olmayan bir değer yolluyorum. aaaaa bu yüzden geldi yani.