E-posta enjeksiyonu nedir?
E-posta enjeksiyonu, kötü niyetli bir bilgisayar korsanının web sayfalarındaki e-posta iletişim formları gibi e-postayla ilgili işlevleri kötüye kullanarak kötü amaçlı e-posta içeriğini rastgele alıcılara göndermesine olanak tanıyan bir güvenlik açığıdır. E-posta enjeksiyonu, satır sonu karakterlerinin enjekte edilmesine dayandığından, bazen bir tür CRLF enjeksiyon saldırısı olarak kabul edilir. E-posta enjeksiyonuna e-posta başlık enjeksiyonu , SMTP başlık enjeksiyonu veya posta komutu enjeksiyonu da denir.
SMTP nasıl çalışır?
SMTP başlık enjeksiyonunu anlamak için öncelikle SMTP'ye (Basit Posta Aktarım Protokolü) bakmamız gerekiyor.
SMTP, internetin en eski protokollerinden biridir ve ilk olarak 1981 yılında RFC 788'de tanımlanmıştır . Başlangıçta, e-posta göndericisini ve alıcılarını belirten küçük bir komut kümesini kabul ediyordu. E-posta iletişimi zamanla daha karmaşık hale geldikçe, ek başlıklar eklendi.
SMTP'deki ilk önemli kavram, zarf ile e-posta gövdesi arasındaki farktır. Zarf, iletişimin ilk kısmıdır ve SMTP protokolü tarafından tanımlanır. Zarfı aşağıdaki komutlar oluşturur:
POSTA GÖNDERENİ : Zarf göndericisini ayarlar.
RCPT TO : Zarf alıcısını ayarlar. Birden fazla adrese mesaj gönderiyorsanız, bu komut birden çok kez kullanılabilir.
VERİ : E-posta başlıklarından ve tek bir boş satırla ayrılmış mesaj gövdesinden oluşan e-posta yükünü başlatır. Mesaj , yalnızca nokta ( . ) içeren bir satır gönderilerek sonlandırılır .
E-posta başlıkları SMTP protokolünün bir parçası değildir. E-postayı doğru şekilde görüntülemek için e-posta istemcileri ve çeşitli programlama dillerinde bulunan özel e-posta kitaplıkları tarafından yorumlanırlar. En yaygın iki başlık şunlardır:
Kimden : Bu başlık, MAIL FROM komutu kullanılarak ayarlanan adresten farklı olabilen görünür göndereni ayarlar . Çoğu e-posta istemcisinde, MAIL FROM komutuyla elde edilen gönderen bilgileri , varsayılan olarak kullanıcıdan gizlenen Return-Path başlığına yerleştirilir .
Kime : Bu başlık , RCPT TO kullanılarak ayarlanan adresten farklı olabilen görünür alıcıyı ayarlar . Çoğu e-posta istemcisinde, RCPT TO komutundan gelen alıcı bilgileri , varsayılan olarak kullanıcıdan gizlenen Teslim Edilen-Kime başlığına yerleştirilir .
İşte basit bir SMTP diyaloğunun örneği ( >= gönderildi, <= alındı):
> MAIL FROM:<postmaster@invicti.com>
< 250 OK
> RCPT TO:<anna@example.com>
< 250 OK
> RCPT TO:<barbara@example.com>
< 250 OK
> DATA
< 354 Send message content; end with <CRLF>.<CRLF>
> Content-Type: text/html
> Date: Wed, 25 Dec 2019 00:00:01
> From: Santa Claus <santaclaus@invicti.com>
> Subject: Your Gifts Are Here
> To: Not Naughty <notnaughty@example.com>
>
> Hello!
> Your gifts are here, <a href="https://malicioushackersdomain.com/">come to the tree</a>!
> --
> Santa
> .
< 250 OK
postmaster@invicti.com adresinden gelen yukarıdaki e-posta, anna@example.com ve barbara@example.com tarafından alınacaktır . Ancak kullanıcılar, mesajın Noel Baba <santaclaus@invicti.com> tarafından gönderilmiş gibi görüneceğini ( postmaster@invicti.com değil) düşünecektir. Kendi adresleri yerine, alıcının Not Naughty <notnaughty@example.com> olduğunu da göreceklerdir . Anna ve Barbara, e-posta istemcilerinde e-posta başlıklarını manuel olarak açmadıkları sürece, gerçek göndereni göremeyeceklerdir.
E-posta enjeksiyonu nasıl çalışır?
E-posta enjeksiyonu, kullanıcı girdisine yeni satır karakterleri ekleyerek çalışır. Girdi temizlenmez ise, kötü niyetli bir bilgisayar korsanı e-posta başlıkları ekleyebilir veya mesajın gövdesini değiştirebilir. Saldırganlar, kötü amaçlı yüklerini yalnızca nokta içeren bir satırla sonlandırarak mesajın sonunu işaret edebilir ve e-posta sunucusunu, arka uç betiğinin göndermeyi amaçladığı meşru içeriği göz ardı etmeye kandırabilir.
Web programlama dillerindeki çoğu e-posta kütüphanesi, zarf komutlarını doğrudan eklemenize izin vermez. Bunun yerine, sağladığınız e-posta başlıklarını alır ve genellikle bunları eşdeğer SMTP komutlarına dönüştürürler. Örneğin, bir BCC başlığı eklerseniz, e-posta kütüphaneniz başlık içeriğini alıp ek RCPT TO komutları oluşturabilir. Bir saldırgan bu belirli kütüphaneyi kullanarak e-posta başlıkları ekleyebilirse, başlıklar eşdeğer SMTP komutlarına dönüştürülür.
E-posta enjeksiyon saldırısına örnek
Aşağıdaki PHP örneği, e-posta başlık enjeksiyonuna karşı savunmasız tipik bir iletişim formudur ( contact.php ). Adı ve e-posta adresini doğrudan giriş alanlarından alır ve e-posta için bir başlık listesi hazırlar.
<?php
if(isset($_POST['name'])) {
$name = $_POST['name'];
$replyto = $_POST['replyTo'];
$message = $_POST['message'];
$to = 'root@localhost';
$subject = 'My Subject';
// Set SMTP headers
$headers = "From: $name \n" .
"Reply-To: $replyto";
mail($to, $subject, $message, $headers);
}
?>
Bir kullanıcı tarafından gönderilen kötü amaçlı olmayan bir POST isteği şu şekilde olacaktır:
POST /contact.php HTTP/1.1
Host: www.example2.com
name=Anna Smith&replyTo=anna@example.com&message=Hello
Bir saldırgan bu iletişim formunu kötüye kullanabilir ve aşağıdaki POST isteğini göndererek e-posta verilerini enjekte edebilir:
POST /contact.php HTTP/1.1
Host: www.example2.com
name=Best Product\r\nbcc: everyone@example3.com&replyTo=blame_anna@example.com&message=Buy my product!
Saldırgan, yeni bir satır ekler ( \r\n –satır sonu ve satır beslemesi, CRLF ) ve ek e-posta adresleri içeren bir BCC başlığı ekler. E-posta kitaplığı, bu adresleri RCPT TO komutlarına dönüştürür ve iletiyi yalnızca hedeflenen alıcıya değil, aynı zamanda bu ek adreslere de iletir. Bu saldırı ayrıca, alıcının e-postanın başka birinden geldiğine inanmasını sağlamak için bir replyTo başlığını taklit etmeyi de içerir ( blame_anna@example.com ).


