15 Şubat 2015

Web Uygulama Denetimi - Bölüm-12: Web Betik Dillerine Yönelik Enjeksiyon Saldırıları (Code Injection)

Web uygulamalarının belkemiğini oluşturan web betikleri aracılığıyla arka sistemlere komut enjeksiyonu mümkün olmakla birlikte bu dillerin kendilerine yönelik de dinamik çalıştırılan kod enjeksiyonu mümkündür (normalde Java dilinin böyle bir özelliği bulunmamaktadır, ancak özel geliştirilmiş JSP platformlarında böyle bir imkan bulunabilir). Bu saldırının gerçekleştirilebilmesi için 2 vektör bulunmaktadır:

  • Kullanıcı tarafından girilen veride yer alan web betik kodlarının dinamik olarak yorumlanması ve çalıştırılması
  • Kullanıcı tarafından girilen verilerle enjekte edilen dosya isimleri nedeniyle dinamik olarak çalıştırılabilir web betiği içeren dosyaların dahil edilmesi

Dinamik Çalıştırma Açıklıkları


Web uygulama betikleri üzerlerinde çalıştıkları işletim sistemi kaynaklarına erişmek için çok güçlü API’lere sahip olduğundan, bu tür bir açıklık işletim sisteminin de tamamen ele geçirilmesine imkan tanıyabilir. Aşağıda PHP ve ASP için bu tür açıklıkları doğurabilecek fonksiyonaliteye örnek verilmiştir:

PHP’de Dinamik Çalıştırma: “eval” PHP fonksiyonu dinamik PHP kodu çalıştırmak için kullanılır. Bu şekilde kullanıcı tarafından gelen bir bilgi doğrudan “eval” fonksiyonuyla çalıştırıldığında “file_get_contents” fonksiyonuyla herhangi bir dosya içeriği okunabilir ve görüntülenebilir, veya “system” fonksiyonuyla herhangi bir işletim sistemi komutu çalıştırılabilir.

ASP’de Dinamik Çalıştırma: ASP fonksiyonu “Execute” da PHP’nin “eval” fonksiyonu ile aynı işleve sahiptir. Dolayısı ile bu fonksiyona girdi olan bir kullanıcı girdisi kullanılarak ASP betik enjeksiyonu yapılabilir.

ASP’de komutlar normalde yeni satır karakteriyle ayrılır ancak kod yığınlarını “:” karakteri kullanarak oluşturmak da mümkündür.

ASP’den işletim sistemi komutu işletebilmek için kullanılabilecek nesne işletim sistemi komutları enjeksiyonu bölümünde de bahsettiğimiz “wscript.shell” nesnesidir. Örneğin aşağıdaki ASP kodu dizin listesini web sunucu kök dizininde bulunan bir dosyaya yazacaktır:

Dim oScript
Set oScript = Server.CreateObject(“WSCRIPT.SHELL”)
Call oScript.Run (“cmd.exe /c dir > c:\inetpub\wwwroot\dir.txt”,0,True)

Bu kodu hedef uygulamada “Execute” fonksiyon parametrelerinden birine enjekte edebildiğimiz bir durumda şöyle bir URL oluşturabiliriz:

https://hedefuygulama.com/search.asp?storedsearch=mysearch%3darama:+Dim+oScript:+Set+oScript+=+Server.CreateObject(“WSCRIPT.SHELL”):+Call+oScript.Run+(“cmd.exe+/c+dir+>+c:\inetpub\wwwroot\dir.txt”,0,True)

Dinamik Çalıştırma Açıklıklarının Denetimi: Uygulama haritalama sırasında kullanıcı tarafından kontrol edilebilen girdi alanlarında (form sahaları, cookie parametreleri, hazır linkler üzerindeki parametreler, vd.) kullanılan uygulama betik diline bağlı olarak dille ilgili bir bağlantı gözleniyorsa (örneğin PHP dili için $mysearch=arama gibi bir ifade görülüyorsa) bu alanlarda dinamik komut enjeksiyonu mümkün olabilir. Tabi kullanıcı girdileri uygulama kodu içindeki diğer metinlerle birleştirilerek de dinamik çalıştırılan kodlar oluşturulabilir. Bu nedenle mümkünse tüm girdiler için dinamik çalıştırma açıklığına karşı aşağıdaki adımlar izlenebilir.
  • Aşağıdaki metinler girdi alanlarında gönderilir:
    • ;echo%20111111
    • echo%20111111
    • response.write%20111111
    • :response.write%20111111
  • Eğer bu girdilerle gönderilen isteklere dönen yanıtları içinde “111111” metni kendi başına bulunuyorsa (yani önceki “echo” veya “response.write” metinleri yoksa) dinamik çalıştırma enjeksiyonu yapmak mümkündür.
  • Eğer bu metin dönmemişse ancak uygulama hata üretmişse buna gönderdiğimiz girdinin sebep olmuş olma ihtimaline karşı sentaksımızı düzeltebiliriz.
  • Eğer hedef uygulama PHP ile yazılmışsa “phpinfo()” test metni kullanılarak PHP ortamının konfigürasyon bilgisinin görüntülenip görüntülenmediği test edilebilir.
  • Yine açıklığı daha net doğrulamak için zaman gecikmesine neden olan bir komut girilebilir. Örneğin “system(‘ping%20127.0.0.1’)” gibi.

Dosya Dahil Etme (File Inclusion) Açıklıkları


Web uygulama betiklerinin çoğu hem kod yeniden kullanımını sağlamak hem de dinamik kod ekleme amacıyla dosya dahil etme yöntemini kullanırlar. Dahil edilen dosyanın içeriği tıpkı dahil eden dosyanın içeriğiymiş gibi yorumlanır. Dahil edilen dosya eğer uzaktan dahil edilebiliyorsa (yani sunucu dışındaki bir URL’de bulunan bir dosya dahil edilebiliyorsa) saldırgan istediği kodu çalıştırabilir. PHP dilinin “include” fonksiyonu uzaktaki dosyaları dahil etme imkanı sunduğundan PHP uygulamaları özellikle bu tehdit altındadır.

Eğer sadece yerel dosyalar dahil edilebiliyorsa yine saldırgan açısından faydalı imkanlar doğabilir. Bunlar:
  • Normalde erişilemeyen fonksiyonlara (örneğin admin/ dizini altındaki yönetim fonksiyonlarına, yani çalıştırılabilir dosya içeriklerine) dosya dahil etme yöntemiyle ulaşılabilir.
  • Normalde erişilemeyen statik dosya içeriklerinin dahil etme yöntemiyle izlenmesi mümkün olabilir.

Yerel dosya dahil etme fonksiyonlarına örnek olarak ASP’nin “Server.Execute” fonksiyonu verilebilir.

Dahil Etme Açıklıklarının Tespiti: Dosya dahil etme açıklığının kullanılabileceği girdilerin yerini denemeden kestirmek çok kolay olmamakla birlikte dil ve yer bilgilerinin girildiği parametreler ilgili dil veya yer için hazırlanmış dosya içeriğinin dahil edilme ihtimali nedeniyle iyi adaylardır. Bunun dışında parametre içeriklerinden dahil edilecek dosya isimleri tespit edilebilir. Bu açıklıkların test edilmesi için aşağıdaki adımlar izlenebilir:
  • PHP uygulamalarında rastlanabilecek uzaktaki dosya dahil etme açıklıklarının araştırılması için şu adımlar izlenebilir:
    • Hedeflenen parametrelerin her birine kontrol ettiğiniz bir sunucu üzerinde bulunan bir kaynağın URL’i girilebilir. İstek gönderildiğinde kontrol ettiğiniz sunucuya gelen istekler izlenir.
    • Eğer yukarıdaki test başarısız olursa mevcut olmayan bir sunucuda bulunan bir kaynak URL’i denenir. Hedef uygulamada bir zaman aşımı olup olmadığı izlenir.
    • Eğer açıklık tespit edilmişse çalıştırılabilir kodlar içeren örnek bir dosya kontrol ettiğiniz sunucuya yüklenerek hedef uygulamadan dahil ettirilebilir.
  • Yerel dosya dahil etme açıklıkları PHP’nin dışında diğer dillerde de rastlanabilir. Bu açıklıkların araştırılması için şu adımlar izlenebilir:
    • Hedef sunucu üzerinde bulunan çalıştırılabilir bir sayfa hedef girdi alanlarına girilir. Uygulama davranışında herhangi bir değişiklik olup olmadığı izlenir.
    • Hedef sunucu üzerinde bulunan statik bir sayfa hedef girdi alanlarına girilir. Bu sayfanın içeriğinin uygulama tarafından görüntülenip görüntülenmediği incelenir.
    • Eğer açıklık tespit edilirse doğrudan erişilemeyen fonksiyonalite veya bilgiye bu açıklık vasıtasıyla erişilmeye çalışılır.


<<Önceki Bölüm                                                                                                      Sonraki Bölüm>>