Wednesday, April 20, 2011

SQL Injection Üzerinden LFI


SQL Injection üzerinden LFI bug’ları yakalamak her zaman karşılaşılabilecek bir durum olmasa bile karşılaşıldığı zaman çok kullanışlı olabilen bir zafiyet türü. Söz konusu zafiyet, uygulamanın DBMS’te yaptığı sorgu sonucunda dönen kolonlara ait verileri include, require, include_once, require_once gibi fonksiyonlara parametre olarak verdiğinde ortaya çıkmakta.Eğer şanslıysanız, aşağıdaki gibi PHP’nin vereceği hata mesajlarından böyle eğlenceli bir bug’ı yakaladığınızı tespite debilirsiniz.


Şekil 1: include_once hata mesajı
Şekil 3′teki kaynak kodda görebileceğiniz üzere $menu_id değişkeni (bizim kontrolümüzde olan değişken) sorguya dahil edilmekte. Daha sonra $cp_boxes değişkeninde saklanan MySQL Resource’e ait “dashboard_id” isimli kolon Şekil4′te göreceğiniz üzere $dashboard_id değişkenine atanmakta ve include_once fonksiyonunun parametresinde kullanılmakta.

İlgili örnekte sorgudan dönen 5.kolon include_once fonksiyonuna atanmakta. include_once fonksiyonu 5.kolon’daki müdahele ettiğimiz değeri (örneğimizde bu değer 999999), dosya sisteminde bulamadığı için hata mesajı veriyor. NULL Byte enjekte ederek yerel dosya sistemindeki dosyaları okuyabilmemiz yada log dosyalarını zehirleyerek komut çalıştırabilmemiz mümkün. [1] Şekil 2’de göreceğiniz üzere bu açıklığı kolay bir şekilde exploit edebildik.

Şekil 2: Explotiation


Şekil 3′teki kaynak kodda görebileceğiniz üzere $menu_id değişkeni (bizim kontrolümüzde olan değişken) sorguya dahil edilmekte. Daha sonra $cp_boxes değişkeninde saklanan MySQL Resource’e ait “dashboard_id” isimli kolon Şekil4′te göreceğiniz üzere $dashboard_id değişkenine atanmakta ve include_once fonksiyonunun parametresinde kullanılmakta.

Şekil 3: SQL Injection içeren kod bölümü

Şekil 4: SQL Injection üzerinden LFI gerçekleşen kod bölümü


[1] - http://www.adeosecurity.com/guvenlik/gelismis-file-inclusion-saldirilari/

No comments:

Post a Comment