08 Mart 2015

Web Uygulama Denetimi - Bölüm-15: SMTP Enjeksiyonu

Çoğu uygulama veya web sitesi kullanıcılarına sistem yöneticilerine, destek personeline mesaj atma imkanı sunar. Bu imkan genellikle bir eposta sunucusu vasıtasıyla sağlanır. Kullanıcı bilgileri ve mesajı SMTP mesajı haline çevrilir. Aşağıda bu fonksiyonaliteye yönelik 2 saldırı yöntemi açıklanmaktadır.


E-posta Başlık Manipülasyonu


PHP’nin mail() fonksiyonu gönderen adresi (From) belirtmek için “additional_headers” parametresini kullanır. Bu parametre Cc (karbon kopya) ve Bcc (kör karbon kopya) başlıklarını da içeren diğer başlıkları tanımlamak için de kullanılır. Başlıklar birbirlerinden yeni satır karakterleriyle ayrılırlar (Not: yeni satır karakteri Windows ve Unix işletim sistemleri için farklı olduğundan her ikisi de denenmelidir).

Eğer PHP ile yazılmış ve mail() fonksiyonunun kullanıldığı bir e-posta imkanı kullanılıyorsa “From” sahasına şu şekilde bir girdi girilerek mesaj herhangi başka kişilere de gönderilebilir:

[email protected]%0aBcc:[email protected]

SMTP Komut Enjeksiyonu


Bazı durumlarda uygulama kendisi SMTP iletişimini protokol komutları kullanarak sağlar ve kullanıcı girdisini de bu komutlara parametre olarak gönderebilir. Bu durumda istediğimiz SMTP komutlarını enjekte etmek mümkün olabilir.

Bir SMTP istemcisi (komut satırından bir gerçek kullanıcı veya ağ üzerinden bir soket programı) tarafından DATA komutu girildikten sonra e-posta başlıkları ve gövdesinden oluşan e-posta mesajı girilir. Mesajın sonunda kendine ait bir satırda “.” karakteri girildiğinde SMTP sunucusu mesajın sona erdiğini ve gönderilmesi gerektiğini anlar ve yeni bir mesaj için beklemeye başlar. Bu nedenle eğer kullanıcı girdisi doğrudan SMTP komutlarına girdi olarak veriliyorsa istediğimiz gönderen (MAIL FROM:) ve alıcı (RCPT TO:) e-posta adresleri komutları ile DATA’yı içeren e-posta mesajlarının söz konusu SMTP sunucusu aracılığıyla gönderilmesini sağlayabiliriz.

Doğrudan işletim sisteminin sağladığı SMTP komutlarına veya e-posta imkanlarına ulaşılıyorsa böyle durumlarda işletim sistemi komut enjeksiyon ihtimali de araştırılmalıdır.


SMTP Enjeksiyon Açıklıklarının Tespiti 

  • SMTP enjeksiyon açıklıklarının tespitinde e-posta fonksiyonalitesi sağlayan sayfalara gönderilen tüm parameterlerde aşağıdaki test girdileri <epostaadresiniz> yazılı alana kendi e-posta adresiniz yazılacak şekilde gönderilir:                                                                                                 
    • <epostaadresiniz>%0aCc:<epostaadresiniz>
    • <epostaadresiniz>%0d%0aCc:<epostaadresiniz>
    • <epostaadresiniz>%0aBcc:<epostaadresiniz>
    • <epostaadresiniz>%0d%0aBcc:<epostaadresiniz>
    • %0aDATA%0afoo%0a%2e%0aMAIL+FROM:+<epostaadresiniz>%0aRCPT+TO:+ <epostaadresiniz>%0aDATA%0aFrom:+ <epostaadresiniz>%0aTo:+ <epostaadresiniz>%0aSubject:+test%0afoo%0a%2e%0a
    • %0d%0aDATA%0d%0afoo%0d%0a%2e%0d%0aMAIL+FROM:+<epostaadresiniz>%0d%0aRCPT+TO:+<epostaadresiniz>%0d%0aDATA%0d%0aFrom:+<epostaadresiniz>%0d%0aTo:+<epostaadresiniz>%0d%0aSubject:+test%0d%0afoo%0d%0a%2e%0d%0a

  • Yukarıdaki girdilere karşılık eposta fonksiyonalitesine ilişkin bir hata alırsanız mesaj sentaksının düzeltilmesi için gerekli denemeler yapılır.
  • Uygulama bu girdilere girildiğinde SMTP enjeksiyonuna yönelik açıklık bulunduğuna dair bir fikir vermeyebilir. Bu nedenle tanımladığınız eposta adresini herhangi bir mesajın gelip gelmediğini anlamak için kontrol etmelisiniz.
  • Ayrıca eposta fonksiyonalitesinin bulunduğu sayfa için gelen HTML kodunda etkinsiz hale getirilmiş (disabled) ya da saklı (hidden) bir “To” (alıcı) sahası bulunup bulunmadığı kontrol edilmelidir. Böyle bir saha varsa aktif hale getirilerek doğrudan kullanılabilir. Bir başka test de kullanılan parametre isimlerine uygun olarak ek bir parametre yaratarak uygulamanın bu parametreyi değerlendirme ihtimalini test etmek olabilir.


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