300 likes | 583 Vues
Resmin Diğer Yüzü: Saldırılar ve Önlemler. Mesut TİMUR Web Güvenliği Topluluğu Pro-G Bilişim Güvenliği mesut@h-labs.org. 23 ARALIK 2008. İçerik. Grafik Manipülasyonu XSS IE - MIME Belirleme Algoritması LFI Savunma SecureImage Son. 2. Grafik Manipülasyonu Nedir ?.
E N D
Resmin Diğer Yüzü: Saldırılar ve Önlemler Mesut TİMUR Web Güvenliği Topluluğu Pro-G Bilişim Güvenliğimesut@h-labs.org 23 ARALIK 2008
İçerik • Grafik Manipülasyonu • XSS • IE - MIME Belirleme Algoritması • LFI • Savunma • SecureImage • Son 2
Grafik Manipülasyonu Nedir ? Bir çok yazılım, kullanıcılardan resim kabul etmektedir: Forumlar Fotoğraf Galerileri Upload Sistemleri Kullanıcıdan (dışarıdan) alınan her türlü girdinin kontrolleri eksiksiz biçimde yapılmalıdır.
Doğrulama Aşaması Böyle bir yazılım tasarlıyorsak, neleri kontrol etmemiz gerekir ? Uzantı kontrolü En genel doğrulama tipi. Sadece grafik dosyası uzantılarının kabülü Yeterli değil. Boyut kontrolü 0 B 'dan büyük mü ? 5 MB'dan düşük mü ? İçerik Kontrolü Gerçekten resim mi ?
Doğrulama Olmazsa ? Alınan dosyalar webden erişilebilir bir klasör altına koyuluyorsa : Uzantı Kontrolü Siteler Arası Betik Çalıştırma (XSS) Yerel Dosya Ekleme (LFI) PHP/ASP/x Shell Flash Politikası Atakları İçerik Kontrolü Uzantı kontrolü yapılmamasından doğan tüm zafiyetler
Doğrulama Olmazsa ? Alınan dosyalar webden erişilebilir bir klasör altına koyulmuyorsa : Boyut Kontrolü Band genişliğinden hizmet aksatma Web sunucu harddiskini doldurmak Çok pratik ataklar olmamalarına rağmen dağıtık gelen bir saldırı hedef sistem üzerinde çok etkili olabilir.
Siteler Arası Betik Çalıştırması (XSS) Cross-Site Scripting olarak bilinir Kullanıcıların oturum bilgileri çalınabilir Port tarama yaptırılabilir. Phishing saldırıları yapılabilir. İnternet tarayıcısına hakimiyet (bazı kısıtlamalar ile) Kurban kullanıcı sonraki ataklar için vekil edilebilir.
Siteler Arası Betik Çalıştırması (XSS) Yeni bir grafik dosyası oluşturulur Dosya notepad ya da başka bir metin editörü ile açılır İlgili saldırının kabuk kodu girilir. Dosya kayıt edilir, ve web uygulamasına yollanır.
Siteler Arası Betik Çalıştırması (XSS) Kötü niyetli hazırlanmış JavaScipt kodları, attack.jpg'e kaydedilir. http://localhost/attack.jpg
Siteler Arası Betik Çalıştırması (XSS) Web uygulaması, ilgili grafik dosyasını erişilebilir bir yere yükler. Grafik dosyasının URL'ine kurban kullanıcının IE ile bir şekilde tıklaması sağlanır. Kurban kullanıcının linke tıklamasıyla, grafik dosyası içindeki JavaScript kodları çalışır ve saldırı gerçekleşir.
Siteler Arası Betik Çalıştırması (XSS) Artık ilgili alan adının haklarıyla rastgele betik çalıştırılabilir.
Samy is My Hero Samy çok yalnız ve arkadaşsızdı, fakat JavaScript bilgisi iyiydi. Bir XSS solucanı kodladı. MySpace.com 'da bir adet XSS zafiyeti ile, 24 saatte 1.000.000'un uzerinde arkadaş edindi. Portal solucanı temizlemek için, web sunucularını bir süre kapatmak zorunda kaldı.
Web Tarayıcının Yargılanması Söz konusu atak sadece IE üzerinde çalışmaktadır. Zafiyetin sadece IE üzerinde geçerli olma sebebi, IE'nin MIME İçerik Tipi belirleme algoritmasındaki bir tasarım probleminden kaynaklanmaktadır. Mozilla Firefox bu zafiyetten etkilenmemektedir.
MIME İçerik Tipi (Content-Type) Nedir ? HTTP Protokolünde, sunucu tarafından gönderilen verinin istemci yazılım tarafından değerlendirilmesi için veriye eklenen başlık bilgisidir. Verinin içerik tipini belirler. text/plain --> Düz Yazı image/jpg --> Jpeg Resim
Web Tarayıcının Yargılanması - II IE web sunucudan gelen MIME içerik tipine güvenmeyip, kendisi farklı bir algoritma ile gelen dosyanın tipine karar vermektedir. Bu algoritma kabaca gelen dosyanın ilk 200 byte'ını okuyup, bilinen MIME içerik tipleri ile eşleşip, eşleşmediğini kontrol etmektir. Eğer MIME içerik tipi belirlenirse, IE gelen dosyayı tespit ettiği biçimde yorumlar.
Ve XSS Gerçekleşir Aslında GIF,JPEG,PNG ya da başka bir uzantı ile gelen ve resim dosyası olması gereken dosyanın içeriği kötü niyetli JavaScript kodları olunca IE saldırganın işini kolaylaştırır ve ilgili JavaScript kodlarını çalıştırır. Bu noktada saldırgan, kurban kullanıcının internet tarayıcısında rastgele betik çalıştırma hakkı(bazı kısıtlamalarla) kazanmıştır.
Dosya Ekleme PHP dilindeki, dosya ekleme zafiyetleri bulunamaktadır. Bundan faydalınarak kod enjeksiyonu atakları yapılabilmektedir. http://www.example.org/index.php?page=archive page Paramatresi include, require gibi gösterilen dosyayı koda ekleyen PHP fonksiyonlara gönderilir. Eğer page parametresi hiçbir kontrolden geçirilmiyorsa, saldırgan istediği dosyayı index.php dosyasının kodlarına ekler ve çalıştırabilir.
Dosya Ekleme - II File Inclusion olarak bilinir Sunucu üzerinde, web sunucu yazılımının haklarıyla rastgele komut çalıştırılabilir. Geliştirilen güvenlik önlemleri sebebiyle bir çok durumda, farklı web sitelerinden dosya eklenememektedir. Bundan dolayı, aynı sistem üzerinden dosya eklemeye izin veren zafiyetlere, Lokal Dosya Ekleme zafiyetleri denir.
Dosya Ekleme - III Ama kötü durum şudur ki; genellikle web sunucu üzerinde , sisteme hakimiyet sağlayacağınız kodların bulunduğu bir sayfa yoktur. Ama sisteme resim yükleme hakkınız varsa, istediğiniz kodlarla doldurulmuş bir dosyayı yükleme ihtimaliniz doğar. Kötü niyetli hazırlanmış PHP kabuk kodları bir resim dosyasına doldurulur ve sunucuya yüklenir.
Dosya Ekleme - IV http://www.example.org/index.php?page=images/BadImage.jpeg? Bu şekilde index.php dosyasına, kötü niyetli PHP kabuk kodları eklenebilir. Sonrasında :
Peki Savunma ! Yapılması gereken, her zaman olduğu gibi dışarıdan girdi olarak alınan hiçbir şeye güvenmemektir. Resim dosyası da pekala bir girdidir ve dışarıdan alınmadan, çeşitli kontrollerden geçirilmesi zorunludur. Doğru şekilde kontrol edilmemiş her girdi, problem yaratma potansiyelini barındırmaktadır.
Genel Kontroller Sunumun başında bahsettiğimiz kontroller, 3 ana başlıkta toplanabilir : Uzantı kontrolü Boyut kontrolü İçerik kontrolü Uzantı ve boyut kontrolü, basit bir karşılaştırma işlemi ile gerçekleştirilebilir, asıl sorun içerik kontrolünün ne şekilde gerçekleştirileceğidir.
Gerçekten Resim Mi ? Resimin, gerçekten resim olduğundan emin olunur. Bu noktada çeşitli fikirler olabilir, lakin benim önereceğim bilinen herhangi bir API ile grafik dosyasının açılmaya çalışılmasıdır EXIF gibi veri saklanacak alanlar temizlenir. Hem EXIF'te saklanacak PHP kabuk kodları için, hem de kullanılacak API'nin yazılım marka ve model bilgilerinin sızmasını engellemek için gereklidir.
Kontrol Metodolojisi – PHP İmp. Dosya openImage fonksiyonu ile açılmaya çalışılır. Eğer açılamazsa dosya geçerli değildir. Bu aşamada , dosyanın salt istemci taraflı dil kodlarından oluşmadığına emin olabiliriz. Dosya başka bir tipe çevrilir ( X --> Y) Tersine çevrim işlemi yapılır ( Y--> X) Bu aşamada dosyanın içindeki tüm zararlı kodların temizlendiğine emin olabiliriz. Çevirme işlemlerinden sonra EXIF alanında kullanılan GD kütüphanesinin banner'ı kalır, potansiyel GD zafiyetlerinde hedef olmamak için temizlemek gerekir.
SecureImage ve Kod Örneği Bu işlemleri bünyesinde yapan ufak bir kütüphane SecureImage http://code.google.com/p/secureimage <?php include("SecureImage.php"); $image=new SecureImage('image.jpg'); if($image->CheckIt()) echo "Yeaah Dude! You can trust it"; else echo "Bad image file!"; ?>
NSecureImage ve JSecureImage SecureImage kütüphanesinin .NET ve Java portları yayınlandı : NSecureImage, Kerem Küsmezer http://www.codeplex.com/owaspturkey/Release/ProjectReleases.aspx?ReleaseId=18008 JSecureImage, Bedirhan Urgun http://code.google.com/p/jsecureimage/downloads/list
Sorularınız & Teşekkürler & Son http://www.webguvenligi.org http://www.h-labs.org