SQL Injection Oracle

Burp Suit Academy içeresinde bulunan Lab: SQL injection attack, listing the database contents on Oracle senaryosu üzerinde çözümü anlatacağım.

Genelde zafiyetli makineler ya da CTF’lerde MySQL yapılarını görürüz ve sıklıkla MySQL dilinin yazım türü ile ilerleriz. Burada ki amacım ise farklı veritabanların dillerini kullanabilmek ya da karşılaşdığımız zaman metotlara hakim olabilmektir.

Senaryonun bize verdiği özet şu şekildedir: Product category filter bölümünde SQL injection zafiyeti bulunmaktadır. UNION atak ile yanıtlar alabilmemizi sağlamaktadır. Bundan dolayı atak tipimiz Union attack olacaktır.

SQL Injection saldırısını iyice kavramak için veritabanı bilginiz gereklidir. Bunun için iki yazım bulunmaktadır. SQL Injection da sıklıkla kullandığımız operatör ve ifadeler için https://www.asimmisirli.com/sql-injection-veritabanini-anlamak/ yararlanabilirsiniz.

Ya da veritabanı giriş dersi için bu adresden faydalanabilirsiniz. https://www.asimmisirli.com/mysql-ile-veritabani-yonetimi-101/

Kullanışlı Cheat Sheet üzerinden faydalanabilirsiniz. https://portswigger.net/web-security/sql-injection/cheat-sheet

SQL Injection Saldırı Adımları

  • Sütun(column) sayısını bulmak
  • Sütun(column) tiplerini(type) tespit etmek
  • Veritabanı versiyonu tespit etmek
  • Var olan veritabanı için tabloların isimlerini görüntülemek
  • Tablo içeresinde ki sütunları görüntülemek
  • Hedeflenen sütunları görüntülemek

Saldırı vektörlerimizin sırası önemlidir. Tüm sıraya göre ilerleme gerçekleştireceğiz. Saldırı için yaygın proxy araçlarından Burp Suite CE kullanacağım.

Hata Tespiti

https://aca01fcc1e41ab8ac07e91fc000a009c.web-security-academy.net/filter?category=Pets'

Kategori pets alanına sonuna ‘ ifadesi koyduğumuzda Internal Server Error alıyoruz. Aslında bu ifadeyi koymasak bile özet zafiyet olduğunu söylüyordu.

Burp Suite İle İsteği Yakalamak

Tarayıcı üzerinde proxy ayarlarını yapmalısınız. Benim ayarlarım 127.0.0.1:8080 şeklindedir. Yada FoxyProxy aracını yapılandırıp kullanabilirsiniz. Tüm ayarlarınız aktif ise Burp Suite üzerinde Proxy alanında Intercept is on yapmalısınız. Yani aktif etmelisiniz. İşlem sonrasi pets kategorisine istek atmanız yeterli olacaktır.

İstek yakalandıktan sonra Send To Repeater alanına gönderilmelidir. Ardından Intercept is off yapabiliriz. Aşağıda ki görselde ki gibi Repeater alanına gelmesi gerekir.

 

**Her istek gönderilmeden önce URL Encoded yapılması gereklidir. Yazdığımız metini seçip CTRL + U kısayolu ile bunu yapabiliriz. Yoksa işlemlerimiz başarılı olmayacaktır.

SQL Injection Sütun(column) Sayısını Tespit Etmek

Sütun(column) sayısını bulmak için ORDER BY ifadesini kullanacağız. Kısaca ORDER BY verilen sütuna göre sıralama yapar. Küçükten büyüğe ya da büyükten küçüğe şekilde işlemine devame eder. Saldırganlar olmayan sütuna geldiğinde ORDER BY hiç bir şekilde sıralama yapamayacağından dolayı hata döndürecektir. Alınan hatadan dolayı sütun sayısı tespit edilecektir.

' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--

Evet ORDER BY 3– ifadesinde Internal Server Error aldık. Yani 2 sütun olduğunu görüyoruz.

SQL Injection Sütun(column) Tiplerini(type) Tespit Etmek

Aslında burada deneme yanılma yöntemi devreye giriyor. İki adet sütunumuz var sırasıyla: string, NULL veya NULL,String ya da String,String ifadeleri gönderilir.

' UNION SELECT 'a',NULL FROM dual-- 
' UNION SELECT NULL,'a' FROM dual--
' UNION SELECT 'a','a' FROM dual--

Tüm komutlarımızın gönderildiğinde yanıt(response) olarak 200 mesajlarını aldık. Buradan anlayabiliriz ki iki sütunda string  destekliyor.

SQL Injection Veritabanı versiyonu tespit etmek

Oracle veritabanı için yazım dili şu şekildedir: SELECT banner FROM v$version , iki sütunumuzun herhangi birine yazarak versiyonu öğrenebiliriz.

' UNION SELECT banner,NULL FROM v$version--

 

SQL Injection Veritabanı İçin Tabloların İsimlerini Görüntülemek

MySQL üzerinde tablo isimleri nasıl information_schema.tables üzerinde tutuluyorsa Oracle veritabanın da  all_tables  içeresinde tüm tablolar tutulur. Ayrıca burada alacağımız sütun ise column_name sütunudur.

Detaylı bilgi https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2105.htm#REFRN20286 adresinden alınabilir.

' UNION SELECT  table_name,NULL FROM all_tables--

Arama kısmına USERS ifadesinde karşıma USERS_FLBVFC ifadesi çıkmaktadır. Bu isim değeri sizde değişebilir.

SQL Injection Tabloda ki sütunları Göstermek

Oracle üzerinde tablo içeresinde ki sütunları görmek için, SELECT * FROM all_tab_columns WHERE table_name = ‘TABLE-NAME-HERE’  yazımı bu şekildedir. Bu yazımı bulduğumuz USERS_FLBVFC tablo ismi için düzenleyip isteğini gönderelim.

' UNION SELECT column_name,NULL FROM all_tab_columns WHERE table_name = 'USERS_FLBVFC'--

USERS_FLBVFC tablosu üzerinden USERNAME_EMNYTG ve PASSWORD_JNIXDF sütunlarını okuyarak bilgileri elde edebiliriz.

' UNION SELECT USERNAME_EMNYTG,PASSWORD_JNIXDF FROM USERS_FLBVFC--

Leave a Reply

Your email address will not be published.