PHP E-Posta Enjeksiyonu / R4V3N

R4V3N

Adanmış Üye
3 Tem 2016
6,250
38
26
Kocaeli
Wikipedia'da e-posta enjeksiyonunda:

"E-posta enjeksiyonu, e-posta göndermek için kullanılan internet uygulamalarında meydana gelebilecek bir güvenlik açığıdır. HTTP Header Enjeksiyonunun e-posta versiyonudur. Aynı SQL enjeksiyon saldırıları gibi, bu açık da bir programlama dilinin diğerine gömüldüğünde oluşan genel bir açık sınıfından biridir.

Bir form, web uygulamasına veri gönderen bir web sayfasına eklendiğinde; kötü niyetli bir kullanıcı gönderilen mesaja alıcıların yeni bir listesi veya tamamen farklı bir mesaj gövdesi gibi fazladan bilgi eklemek için MIME formatını exploit'leyebilir. MIME formatı, bir mesajdaki bilgiyi sınırlamak için satır başı kullandığından ve sadece ham mesaj nihai hedefini belirlediğinden, gönderilen form verisine satır başı eklemek
binlerce mesajı tek seferde kullanılmak için basit bir ziyaretçi defterine olanak verir. Kötü niyetli bir spamcı bu taktiği çok sayıda mesajı anonim olarak göndermek için kullanabilir."
yazıyor.

Direkt linki: https://en.wikipedia.org/wiki/Email_injection

E-posta enjeksiyonu, PHP gömülü mail fonksiyonunu vuran bir çeşit enjeksiyon saldırısıdır. Saldırgana BBC, CC, Konu gibi herhangi bir mail başlık alanını enjekte etmeye izin verir ki bu da hacker'a kurbanlarının mail sunucusundan iletişim formuna kadar spam yaymasını sağlar. Bu nedenden dolayı bu saldırı E-posta Enjeksiyonu yada mail form spamlaması diye geçer. Bu açık sadece PHP ile sınırlı değildir. İmkan dahilinde kullanıcıların girdileri üzerine e-postalar gönderen neredeyse tüm uygulamaları etkileyebilir. Bu saldırının asıl gerekçesi hatalı kullanıcı girdi doğrulaması yada hiç doğrulama ve filtreleme olmamasıdır.

BBC & CC nedir? https://blog.atakdomain.com/mail-yazarken-cc-bcc-ne-nedir/

E-Posta Enjeksiyonu Nasıl Çalışır?

E-posta enjeksiyonunun nasıl çalıştığını incelemek için tamamen PHP e-posta fonksiyonunun nasıl çalıştığını bilmemiz gerekir. Aşağıdaki PHP fonksiyonuna bir göz atalım:

Kod:
[COLOR="white"]manual Mail() :

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )[/COLOR]

Gördüğünüz üzere üç tane zorunlu parametre (“to, subject, ve message”), bazı diğer seçmeli parametreler ve Boolean bir değer döndüren fonksiyonumuz var.

Şimdi de açıklı kodumuza bir göz atalım:

Kod:
[COLOR="White"]<?php
 $to="[email protected]";
 if (!isset($_POST["send"])){
   ?>
   <form method="POST" action="<?=$_SERVER['PHP_SELF'];?>">
   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>
   <?
 }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 !";
   }
 }
 ?>[/COLOR]

Bu kod gösterim amaçlı kullanılacak ve açıklamak için de 3 parçaya ayıracağız.

İlk Kısım

Kod:
[COLOR="White"]<?php
 $to="[email protected]";
 if (!isset($_POST["send"])){
?>[/COLOR]

Bu kod, formun gönderilip gönderilmediğini kontrol edecek. Kodun "True veya False" olması halinde farklı cevap gelecek. Eğer "True" dönerse, form gönderilmemiş demektir. Form tekrar çıkacaktır karşımıza ve kullanıcı girişini bekleyecektir. Diğer yandan eğer "False" dönerse, form gönderilmiş ve e-posta gönderilecektir demektir.

İkinci Kısım

Kod:
[COLOR="white"] <form method="POST" action="<?=$_SERVER['PHP_SELF'];?>">
   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>[/COLOR]

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:
[COLOR="White"]}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 !";
   }
 }
 ?>[/COLOR]

Ö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:
[COLOR="White"]mail(“[email protected]” , “Call me urgent” , “Hi,\nPlease call me ASAP.\nBye” , “From: [email protected]\n”)[/COLOR]

Çı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:
[COLOR="White"]From:[email protected]%0ACc:[email protected],%0ABcc:[email protected][/COLOR]

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

Değişkene enjekte etme:

Kod:
[COLOR="white"]From:[email protected]%0ATo:[email protected][/COLOR]

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

Konu değişkeni enjekte etme:

Kod:
[COLOR="white"]From:[email protected]%0ASubject:This’s%20Fake%20Subject[/COLOR]

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:
[COLOR="white"]From:[email protected]%0A%0AMy%20New%20%0Fake%20Message.[/COLOR]

Çö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.
 
Moderatör tarafında düzenlendi:

CH4M3

Uzman üye
19 Ağu 2017
1,926
16
php island
Siteler, içinde frontend (ön tarafı) ve backend (arka tarafı) olarak ikiye ayrılıyor. Frontend herkese görünen kısım, backend ise kimsenin göremeyeceği sunucu taraflı arka tarafta çalışan kodlar.

Dolayısıyla burada dikkat edilmesi gereken ve Siteler kodlanırken yapılan, hatta zamanında benim de küçük çaplı yaptığım en yanlış husus, sunucu taraflı kodları, FrontEnde (html, javascript) göre kodlamaktır. yani Önlemini Html javascript kodlarında değil, sunucu taraflı çalışan kodlarında (php, asp artık her ne ise) yapman gerekiyor. Çünkü Frontend değiştirilebilir, oynanabilir, baştan düzenlenebilir. En aşina olduğunuz örneklerden biri, zamanında çoğu kişinin "Bak kanka şimdi şifreni buraya yaz." dedikten sonra input tagındaki "type" attribute ü kaldırıp hackerlık yapması örneğidir :trl

Ellerine sağlık Hocam, Bunu gördüysek devamı bol bol gelecek demektir :D
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.