10 Kasım 2014

Web Uygulama Denetimi - Bölüm-2: Uygulamanın Analizi

Uygulamanın içeriğinin ortaya çıkarılması haritalamanın önemli bir bölümüdür. Ancak bir o kadar önemli olan bir konu da tehdit yüzeyinin anlaşılması ve bir denetim prosedürünü oluşturmaya başlayabilmemiz için uygulamanın fonksiyonalitesi, davranışı ve kullanılan teknolojilerin tespitidir.

İçerik tespiti sırası ve sonrasında yapılacak uygulama analizinde aşağıdaki alanlar incelenmelidir:

·           Kullanıcı girdisi alan noktalar:  Uygulamanın aşağıdaki girdi imkanlarından hangilerini kullandığı belirlenmelidir:
o  Query string başlangıcına kadar olan URL
o  URL query string ile gönderilen her parametre
o  POST isteği gövdesinde gönderilen her parametre
o  Her cookie
o  Seyrek olarak uygulamalar tarafından kullanılsa da HTTP başlıkları (örneğin: User-Agent, Referer, Accept, Accept-Language, Host başlıkları)

Bazı uygulamalar query string’lerini oluştururken kendi formatlarını kullanabilirler (yani “?parametre1=değer1&parametre2=değer2” yerine “;parametre1=değer1$parametre2=değer2” gibi). Bu nedenle parametre formatının anlaşılması ve buna göre davranılması gerekmektedir. Bazı uygulamalar parametre olarak XML verisi alabilir, bu durumda hem XML verisinin tamamen saldırı string’i ile değiştirilmesi hem de XML parametrelerinin ayrı ayrı incelenmesi gerekebilir.

Ayrıca kullanıcının girdi sağlayabildiği out-of-band girdi kanalları ve uygulamanın bu kanallardan gelen verileri işleme fonksiyonalitesi de belirlenmelidir, örneğin:
o  SMTP ile aldığı e-postaları işleyen ve görüntüleme fonksiyonu
o  Başka bir kaynaktan HTTP ile aldığı içeriği görüntüleme fonksiyonu gibi

Sunucu Tarafı Teknolojileri

Sunucu tarafında kullanılan teknolojileri belirlemek için pek çok işaret bulunmaktadır:
o  Banner Bilgisi:
Web sunucusu da ağ güvenliği bölümünde bahsettiğimiz ağ servislerinden farklı değildir. Web sunucunun üretici ve versiyonunu, üzerinde çalıştığı işletim sistemini ve web sunucusu üzerinde çalışan uygulama sunucusu ve diğer alt servisleri tipik banner bilgisi alma yöntemimizle öğrenebiliriz. Bunun için web sunucusunun TCP 80 portuna bağlanıp aşağıdaki HTTP isteğini göndermemiz yeterli olacaktır:

HEAD / HTTP/1.0
Ve iki kere “Enter” tuşuna basmak

Bu istek sonucu dönecek yanıtın “Server” başlık değeri, sunucu hakkında bilgiler içerebilir.

o  HTTP Fingerprinting:
Web sunucusunun yöneticisi Server HTTP başlığı’nı değiştirmiş ve web sunucusunun bilgilerini saklamış olabilir. Ancak bu engellemeleri aşmak için çeşitli metodlara sunucuların verdikleri tepkileri değerlendirerek web sunucu tahmini yapan başka bir aracımız daha bulunmaktadır “httprint”. “httprint” aldığı yanıtları kendi veritabanı ile karşılaştırarak web sunucu tahmini yapabilmektedir.

o  Dosya Uzantıları:
Kabaca web sunucusu üzerinde çalıştırılan web sunucu sayfalarının tipine, sunucu üzerinde çalışan diğer servislerden veya başka bilgilerden yola çıkarak elde ettiğimiz işletim sistemi bilgisine dayanarak web sunucusunun üreticisini ve kullanılan dilleri tahmin etmek mümkündür. Örneğin aşağıdaki dosya uzantıları şu dillere ait dosyaları ifade etmektedir:
·      asp – Microsoft Active Server Pages
·      aspx – Microsof ASP.NET
·      jsp – Java Server Pages
·      cfm – Cold Fusion
·      php – PHP dili
·      d2w – WebSphere
·      pl – Perl dili
·      py – Python dili
·      dll – genellikle makine diline derlenmiş bir dil (C veya C++ gibi)
·      nsf veya ntf – Lotus Domino

Ayrıca yukarıda bahsedillen kaba kuvvet saldırıları sırasında belli dosya uzantılı isteklere gelen yanıtlardaki farklılıklar o dosya tipini yorumlayan bileşenlerin hedef sistemde yüklü olup olmadığına da işaret ederler. Yani geçerli bir dosya ismi bilmesek bile desteklenen bir uzantıya sahip bir dosya ismini çağırdığımızda aldığımız hata mesajı (statü kodu ve/veya hata mesaj içeriği) sıradan bir olmayan dosya ismine karşılık aldığımız hata mesajından farklı olabilir (.asp ve .txt uzantılı dosya isimlerine alınan yanıtların farklı olması gibi, ya da IIS’in .printer, .ida/.idq uzantılarını destekleyen extension’ları çalıştırması durumunda verdiği farklı mesajlar gibi). Bu şekilde hedef platformda çalışan yorumlayıcıları tespit edebiliriz.

o  Dizin İsimleri:
Bazı dizin isimleri kullanılan sunucu teknolojilerine işaret edebilir. Örneğin:
·           servlet – Java servlet’leri
·           pls – Oracle Application Server PL/SQL Gateway
·           Cfdocs veya cfide – Cold Fusion
·           SilverStream – SilverStream web sunucu
·           rails – Ruby on Rails

o  Oturum Token İsimleri:
Çoğu web sunucu platformu öntanımlı olarak oturum token’ları (cookie’ler ile) üretir ve token isimlerinden yola çıkarak web sunucu teknolojisi anlaşılabilir. Örneğin:
·           JSESSIONID – Java platformu
·           ASPSESSIONID – Microsoft IIS Server
·           ASP.NET_SessionId – Microsoft ASP.NET
·           CFID/CFTOKEN – Cold Fusion
·           PHPSESSID - PHP

o  Üçüncü Taraflarca Geliştirilmiş Uygulama Bileşenleri:
Uygulama içinde başka platformlarda da kullanılan hatta açık kaynak kodlu uygulama bileşenleri bulunabilir (alışveriş sepetleri, login mekanizmaları, mesaj tahtaları gibi). Bunların tespit edilmesi durumunda paket içinde bulunduğu halde kullanılması öngörülmemiş fonksiyonaliteye erişmek, bu projelere ait yayınlanmış açıklıkları araştırmak, bileşenleri lokal olarak indirip kaynak kod analizi yapmak mümkün olabilir. Bu tür bileşenleri tespit etmek için uygulamanın kullandığı cookie isimleri, ilginç HTTP başlıkları veya dizin adları arama motorlarında aranabilir.

·      Sunucu Tarafı Fonksiyonalitenin Belirlenmesi İsteklerin Analizi
Uygulama fonksiyonalitesi anlaşılmaya çalışılırken yapılan isteklerde yer alan sorgu parametre isimlerinden ve değerlerinden yola çıkarak arka tarafta hangi tür sistemlerle etkileşildiğini tahmin edebiliriz. Örneğin:
o  Bir parametre değeri olarak bir dizin ve/veya dosya ismi kullanılıyorsa bu alandaki değeri manipüle ederek directory traversal saldırısı gerçekleştirilebilir.
o  Parametre isimleri veya değerleri SQL yapılarına benziyorsa bu alanlar manipüle edilebilir, dahası SQL injection saldırıları yapılabilir.
o  Sorgu parametreleri arasında “isExpired=0”, “edit=false” gibi uygulama tarafından yerleştirilmiş parametreler bulunması durumunda bu değerler değiştirilerek farklı bir fonksiyonalite veya içeriğe erişilebilir. Bu sayede erişim kontrolleri atlatılabilir.
o  SMTP protokol komutları veya sorgu içinde giden ifadelerin e-posta sunucusuna gönderileceğine dair bir işaret varsa e-posta başlık enjeksiyon saldırısı gerçekleştirilebilir.

Uygulama Davranışından Çıkarımda Bulunma (Extrapolating Application Behavior)
Çoğunlukla uygulamalar geliştiren kişiler aynı olduğundan uygulamanın farklı alanlarında benzer biçimde davranırlar. Bu davranışlar daha sonra potansiyel bir açıklığın exploit edilmesi için  kullanılabilir. Örneğin:
o  Uygulama genel olarak bir girdi temizleme rutini kullanıyor olabilir, ve SQL injection açıklığı bulunabilecek bir alanda girdiniz bilmediğiniz bir şekilde temizlenebilir. Uygulamanın başka bir bölümünde girdide aranan şartlara ilişkin uyarılar alıyor olabilirsiniz, ve bu bilgiden yola çıkarak kabul gören bilgileri tahmin edebilirsiniz.
o  Uygulamanın bir alanında hata mesajları detaylı olarak verilmiyor olabilir, ancak başka bir alanından detaylı hata mesajları alabilirsiniz. Detaylı bilgi alınan yerdeki davranış özelliklerinden yola çıkarak verilmeyen alan hakkında sonuçlara ulaşabilirsiniz.
o  Uygulama bir takım bilgileri kolay ulaşılamaması için belli bir algoritmadan geçirerek başkalaşmış bir şekilde saklıyor olabilir. Uygulamanın bir alanında da bu algoritmadan geçmiş bir girdi bir hata mesajının içeriğinde görüntüleniyor olabilir. Bu hata mesajı bildiğiniz bir girdiyi dönüştürmek için kullanılabilir.

Saldırı yüzeyinin haritalanması

•    User impersonation fonksiyonalitesi – Hakların yükseltilmesi (privilege escalation)
•    Açık iletişim (cleartext communication) – Oturum çalma, erişim credential’ları ve diğer hassas verilerin çalınması
•    Off-site linkler – Referer başlığı içindeki parametre sızmaları
•    Diğer sistemlerle arayüzler – Diğer sistemler için oturum ve erişim kontrolleri’nin aşılması
•    Hata mesajları – Bilgi sızdırma
•    e-posta iletişim fonksiyonalitesi – e-posta ve/veya komut injection
•    Makine kodu bileşenleri veya bu kodlarla iletişim – Hafıza taşma saldırıları
•    Üçüncü taraflarca üretilmiş kodların kullanımı – Bu bileşenlere ilişkin bilinen açıklıklar
•    Web sunucusunun belirlenebilmesi – Bilinen güvenlik konfigürasyon açıklıkları ve yazılım açıklıkları

Haritalama sürecinin son adımı potansiyel saldırı vektörlerinin belirlenmesidir. Aşağıdakiler web uygulamalarının temel davranışları ve kontrol alanları ile bunlara karşı gerçekleştirilebilecek saldırı türlerini içermektedir. Daha sonraki bölümlerde bu saldırıların nasıl gerçekleştirilebilecekleri incelenecektir:

·      İstemci tarafı girdi kontrolleri – Kontroller sunucu tarafında da gerçekleştirilmeyebilir
·      Veritabanı etkileşimi – SQL injection
·      Dosya yükeleme ve indirme – Directory traversal saldırıları
·      Kullanıcının girdiği verinin görüntülenmesi – XSS
·      Dinamik yönlendirmeler (redirects) – Redirection ve başlık enjeksiyon saldırıları
·      Login – Kullanıcı adı belirleme, zayıf password’ler, kaba kuvvet saldırısı kullanma imkanı
·      Çok aşamalı login – Mantık hataları (her sayfadan sıra ile geçileceği varsayımı ile önceki aşamaların kontrol edilmemesi)
·      Oturum durumu – Tahmin edilebilir token’lar, token’ların içeriklerinin güvenliğinin sağlanmaması
·      Erişim kontrolleri – Yatay ve dikey erişim hakları artırma saldırıları
·      User impersonation fonksiyonalitesi – Hakların yükseltilmesi (privilege escalation)
·      Açık iletişim (cleartext communication) – Oturum çalma, erişim credential’ları ve diğer hassas verilerin çalınması
·      Off-site linkler – Referer başlığı içindeki parametre sızmaları
·      Diğer sistemlerle arayüzler – Diğer sistemler için oturum ve erişim kontrolleri’nin aşılması
·      Hata mesajları – Bilgi sızdırma
·      e-posta iletişim fonksiyonalitesi – e-posta ve/veya komut injection
·      Makine kodu bileşenleri veya bu kodlarla iletişim – Hafıza taşma saldırıları
·      Üçüncü taraflarca üretilmiş kodların kullanımı – Bu bileşenlere ilişkin bilinen açıklıklar
·      Web sunucusunun belirlenebilmesi – Bilinen güvenlik konfigürasyon açıklıkları ve yazılım açıklıkları

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