MySQL veritabanlarının kullanımı özellikle bireysel amaçlı web uygulamalarında oldukça yaygındır. Bireysel uygulamalarda veritabanı güvenliği geri planda kalmakta ve basit yapılandırmalar bile göz ardı edilebilmektedir. Bu durum saldırganların işini büyük ölçüde kolaylaştırmaktadır.
Bu makalede Linux işletim sistemi üzerinde kurulu olan MySQL 5.1 ve önceki sürümlerinde bulunan 'mysql_history' açıklığı anlatılmaktadır. Ayrıca bu açıklığın nasıl kapatılacağı makalenin son bölümünde yer almaktadır.
1. 'mysql_history' Açıklığının KullanımıBu makalede Linux işletim sistemi üzerinde kurulu olan MySQL 5.1 ve önceki sürümlerinde bulunan 'mysql_history' açıklığı anlatılmaktadır. Ayrıca bu açıklığın nasıl kapatılacağı makalenin son bölümünde yer almaktadır.
MySQL veritabanı yönetim sisteminin 5.1 ve önceki sürümlerinde, kullanıcılar tarafından çalıştırılan komutlar 'mysql_history' dosyasında kayıtlı tutulur. MySQL artık 4.1 ve 5.0 sürümlerini desteklememektedir. Bu makalenin yazıldığı tarihte MySQL 5.1 için en güncel sürüm numarası 5.1.73'tür.[1] MySQL 5.1.73 ve yeni sürümlerinde 'mysql_history' açıklığı bulunmamaktadır. Bu açıklık Linux işletim sistemlerindeki 'bash_history' (komut geçmişinin tutulması) yapısından kaynaklanmaktadır. Windows işletim sistemlerinde farklı bir yapı kullanıldığı için bu açıklık bulunmamaktadır.
'mysql_history' sayesinde veritabanı kullanıcısı yukarı-aşağı yön tuşlarıyla geçmişte kullandığı komutları rahatlıkla tekrar getirebilir. İşletim sistemi kapatılıp tekrar açıldığında bu kayıtlar silinmez ve bu kayıtların tamamı, içinde parola bulunsa dahi açık metin halinde saklanır.
Senaryoda kullanılan veritabanı MySQL 5.1.69 sürümündedir. Bu veritabanı Ubuntu 10.11 işletim sistemine sahip makine üzerine kurulmuştur. Veritabanı ön tanımlı yapılandırma ayarlarıyla kurulup hiçbir değişiklik yapılmamıştır.
Ubuntu işletim sistemi kullanıcısı olan 'test' üzerinden veritabanı hesabıyla MySQL'e giriş yapıldıktan sonra Şekil 1'de gösterilen komutlar çalıştırılmıştır.
Şekil 1. Veritabanı Kullanıcısı Tarafından Çalıştırılan Komutlar
İşletim sistemindeki 'test' kullanıcısının parolasını ele geçirebilen veya 'root' hakkına erişebilen bir saldırgan, veritabanı hesabını bilmeden bu kullanıcının çalıştırdığı tüm komutları görebilir. Bunun için Şekil 2'de gösterilen 'cat ~/.mysql_history' komutunu çalıştırması yeterlidir. Bu dosya her kullanıcı için '/home/user_name' klasörü içinde bulunur. Dosya isminin başındaki nokta işaretinden de anlaşılabileceği gibi gizli olarak saklanır ve 'ls -a' komutu ile bu gizli dosya gösterilebilir.
Şekil 2. 'mysql_history' Dosyasının İçeriğinin Görüntülenmesi
Saldırgan veritabanı tabloları, prosedürleri ve diğer nesneleri hakkında bilgi edinebilir. Ayrıca çalıştırılan komutlar içinde veritabanı kullanıcılarına ait parola bilgileri varsa, saldırgan bu bilgileri kullanarak veritabanına erişim sağlayabilir. Bu açıklıktan elde edilen veritabanı hesabıyla erişim Şekil 3'te gösterilmiştir.
Şekil 3. mysql_history Dosyasından Elde Edilen Kullanıcıyla Veritabanına Erişim
Bu açıklık 3 farklı şekilde kapatılabilir:
İlk yöntem Ubuntu üzerindeki 'mysql_history' çevresel değişkenini yapılandırmaktır. Bunun için 'export MYSQL_HISTFILE=/dev/null' komutu çalıştırılmalı ve bu değişken kontrol edilmelidir. Bu yapılandırmadan sonra veritabanında çalıştırılan komutlar kaydedilmeyecektir. Daha önce kaydedilen komutların silinmesi için 'mysql_history' dosyası silinmelidir.
İkinci yöntem 'mysql_history' dosyası '/dev/null' yapısına yönlendirecek bir link oluşturarak, komutların görüntülenmesi engellenir.[2][3] '/dev' dizini altındaki 'null' dosyası özel bir yapıya sahiptir. Bu yapıya gönderilen çıktılar silinir. Linux işletim sistemlerinde, istenmeyen çıktılar 'kara delik' olarak adlandırılan '/dev/null' yapısına yönlendirilir. Bu sayede komutların fazla veya olumsuz çıktılardan korunması sağlanır. Ancak eski kayıtlar silinmesi için 'mysql_history' dosyası silinmelidir.
Açıklığın kapatmak için anlatılan ilk 2 yöntem farklı yollar kullanan benzer çözümlerdir. Anlatılan ilk 2 yöntem için gerekli komutlar Şekil 4'te gösterilmiştir.
Şekil 4. Açıklığın Önlemi
Gerekli yapılandırmalar uygulandıktan sonra 'cat ~/.mysql_history' komutunun çalışmadığı Şekil 5'te görülmüştür.
Şekil 5. 'mysql_history' Dosyasının Açılamaması
Bu açıklığın kapatılması için son yöntem, kullanılan veritabanının en güncel yamaları uygulanarak, sürümünün yükseltilmesidir.
Türkhackteam.net