Reklamları görebilmek için çerez izni vermelisiniz.

PHP E-Posta Enjeksiyonu

Shiva

Admin
Katılım
31 Tem 2019
Konular
522
Mesajlar
4,089
Çözümler
194
Tepkime puanı
14,597
Konum
Berlin
RC Point
0
">
From: <input type="text" name="sender">
Subject : <input type="text" name="subject">
Message :
<textarea name="message" rows="10" cols="60" lines="20"></textarea>
<input type="submit" name="send" value="Send">
</form>


Bu kod, ilk kısım "True" döndürürse kullanıcı girişi isteyecek olan HTML form kısmıdır.

Üçüncü Kısım

Kod:
}else{
// the form has been submitted
$from=$_POST['sender'];
// send mail :
if (mail($to,$_POST['subject'],$_POST['message'],"From: $from\n")){
echo "Your mail has been sent successfully";
}else{
]
echo "An error has been occured !";
}
}
?>


Özellikle mail($to,$_POST[‘subject’],$_POST[‘message’],”From: $from\n”) kısmına bakarsanız, mail fonksiyonu konusunu mesajını ve formunu parametrelerden alıyor ve maili gönderiyor. Eğer başarılı bir şekilde gönderirse, "Your mail has been sent successfully,” (Mailiniz başarılı bir şekilde gönderilmiştir) çıktısı veriyor ve eğer bir hata olursa "An error has been occurred." (Bir hata oluştu) diyor.

O zaman sorun nerede? Sadece "E-Posta Enjeksiyonu" için değil herhangi bir enjeksiyon saldırısı için asıl problem, kullanıcı girişine veya hatalı giriş doğrulamaya güvenmektir. Kodun üçüncü kısmında da görebileceğiniz üzere mail fonksiyonu, değişkenini herhangi bir girdi doğrulaması olmadan kullanıcıdan direkt olarak alıyor. Yani saldırgan, geliştiricinin direkt olarak kullanabileceği konu, mesaj ve form parametrelerinin değerlerini kontrol edebiliyor.

E-Posta Enjeksiyonu Açıklaması

Bu işi açıklamak için yukarıdaki zafiyetli kodu kullanacağız. Ayrıca aşağıdaki değerli bir mail fonksiyon parametresi göndereceğiz:

Kod:
mail(“[email protected]” , “Call me urgent” , “Hi,\nPlease call me ASAP.\nBye” , “From: [email protected]\n”)


Çıktısı aşağıdaki gibi olacaktır:

6DWR19.png


(
Kime: yö[email protected]
Konu: Beni Acil Ara
Kimden: gö[email protected]
Merhaba,
Beni lütfen olabildiğince çabuk ara.
Hoşçakal
)

Saldırgan gözünden, mail başlığına enjekte edilebilecek birçok ilave alan var. Detaylı bilgi için RFC 822. Örneğin, saldırgana mesaj için daha fazla alıcı eklemeyi sağlayan CC veya BCC enjekte edebiliriz. Ama yeni bir değişken eklemeden önce her bir alanı diğerinden ayıracak yeni bir satır eklememiz gerekir. Yeni satırın onaltılık değeri "0x0A"dır. Misal:

Gönderen değişkeninden sonra CC ve BCC enjekte etme:

Kod:
From:[email protected]%0ACc:[email protected],%0ABcc:[email protected]


Böylece mesaj, eklenen alıcılara gidecektir.

Değişkene enjekte etme:

Kod:
From:[email protected]%0ATo:[email protected]


Böylece mesaj, asıl alıcısına ve saldırgana gidecektir.

Konu değişkeni enjekte etme:

Kod:
From:[email protected]%0ASubject:This’s%20Fake%20Subject


Bu sahte başlık, orijinal başlığa eklenecektir veya bazı durumlarda da onunla yer değiştirecektir. Tamamen mail servisine kalmış bir şey.

Mesajın gövdesini değiştirme:

İki yeni satır enjekte edin sonrasında mesajın gövdesini değiştirecek mesajınızı yazın.

Kod:
From:[email protected]%0A%0AMy%20New%20%0Fake%20Message.


Çözüm Önerileri

- Asla kullanıcı girdi alanlarına güvenmeyin. Tüm kullanıcı girdileri güvenilmez ve potansiyel olarak kötücül düşünülmelidir. Güvenilmeyen girdileri işleyen uygulamalar; Buffer Overflows, SQL Injection, OS Commanding, Denial of Service ve Email Injection gibi saldırılara karşı savunmasız olabilirler.
- Kullanıcı verisini filtrelemek için Regex (Düzenli İfadeler) kullanın. Misal, girdi metninde (\r veya \n) arayabiliriz.
- ZEND mail, PEAR mail and swift mailer gibi bu sorunlara karşı koruma sağlayan dış bileşenler ve kütüphaneler kullanın.
- ModSecurity de sunucu seviyesinde e-posta enjeksiyonuna bir son verebilir. ModSecurity ile POST veya GET gövdesinde BCC, CC veya To taramak ve bunları içeren tüm şeyleri reddetmek mümkündür.
 
Üst