Aplikacje internetowe

Bełdziowe spojrzenie na aplikacje internetowe

Mail injection

Mimo swojego wieku e-mail pozostaje w czołówce sposobów komunikacji w Internecie. Niemal na każdej stronie firmowej czy domowej można znaleźć adres e-mail umożliwiający skontaktowanie się z jej właścicielem. Na wielu z nich komunikacja jest ułatwiona poprzez wstawienie formularza, którego wypełnienie automatycznie wysyła maila. Działanie takie poza ułatwieniem życia użytkownikom może ułatwić życie także spamerom, ale wróćmy do początku.

Początek

Najprostszym sposobem na wysłanie maila spod PHP jest skorzystanie z funkcji mail( ). W podstawowej wersji wystarczy przekazać jej adres odbiorcy, tytuł oraz treść wiadomości. Dzięki czwartemu, opcjonalnemu parametrowi możemy dodać nagłówki, dzięki którym rozszerzymy możliwości wysyłanego maila np. o wysłanie go do wielu odbiorców. I właśnie tu znajduje się problem.

Dodatkowe nagłówki okazują się pomocne gdy chcemy ustalić typ maila (plain text / HTML), kodowanie znaków etc. jednak niosą ze sobą pewne niebezpieczeństwo. Spójrzmy jak one działają.

Nagłówki

Zacznijmy od zapoznania się z wpływem dodawanych nagłówków na wygląd źródła wysyłanego maila. Wykonanie poniższej funkcji

<?php
   mail( 'adres@odbiorcy.pl',
         'Temat',
         'Tresc',
         'X-Mailer: skrypt Beldzia'
       );
?>

skutkuje wysłaniem następującego maila:

Date: 3 Jul 2008 17:48:35 -0000
Message-ID: <20080703174835.21596.qmail@p7.konta.pl>
From: anonymous@p7.konta.pl
To: beldzio@beldzio.com
Subject: Temat
X-Mailer: skrypt Beldzia

Tresc

Jako można zauważyć ostatni parametr przekazany do funkcji mail( ) zostaje umieszczony w oryginalnej formie na końcu listy nagłówków.

W źródle wysłanego przez nas maila jako nadawca figuruje anonymous@p7.konta.pl. Załóżmy, że chcemy aby adresem nadawcy był mail podany przez użytkownika. W tym celu należy dodać nagłówek From.

<?php
   mail( 'adres@odbiorcy.pl',
         'Temat',
         'Tresc',
         'X-Mailer: skrypt Beldzia' . "rn" .
   	'From: ' . $_POST['mail']
       );
?>

Wstawianie przychodzących danych wprost do nagłówków maila może skutkować jego manipulacją, tzn. możliwością dodania oraz nadpisania nagłówków. Przyjmijmy, że użytkownik zamiast adresu e-mail poda poniższy kod:

nadawca@maila.pl
Subject: Spamerski mail reklamujacy viagre
Cc: spamuj@serwer.pl, inny@spam.com, jeszcze@inny.org

efekt? zmiana tematu oraz dodanie trzech odbiorców.

W taki sposób niewinny skrypt do wysyłki e-maili może przerodzić się w maszynkę do wysyłania spamu.

Obrona

Najbardziej naturalnym sposobem obrony przed wstrzyknięciami nagłówków jest filtracja danych mających zostać w nich umieszczonych. Jeśli chcemy umieścić w nich tylko adres e-mail nadawcy, należy sprawdzić czy otrzymane dane pasują do wzorca e-maila.

Jeśli są to inne dane niż adres e-mail najlepszym wyjściem jest usunięcie znaku nowej linii, która jest konieczna w celu dodania kolejnych nagłówków.

Istnieje również alternatywny sposób zabezpieczenia. Wystarczy wszystkie otrzymane dane przesłać w treści maila. Dzięki temu problem wstrzyknięcia nagłówków przestaje istnieć.


Tagi: , ,
Kategoria: Bezpieczeństwo, Filtracja i walidacja


6 komentarzy

  1. DiLu napisał(a):

    Hmm… To chyba rzeczy dla początkujących, bo zwykle sprawdza się eregiem czy inną funkcją wprowadzony adres mailowy (przynajmniej ja tak robię).
    Aha, i cieszę się, że blog się rozkręca :-) Dobrze wiedzieć o każdym zagrożeniu.

  2. Michał "Bełdzio" Ławicki napisał(a):

    z mailem jest prosto :) trudniej robi się jak będzie chciało się dodać inne nagłówki :))

    cieszę się, że ktoś tu zagląda :)

  3. Crozin napisał(a):

    @DiLu: nie używaj ereg_* – przerzuć się na preg_*. Te pierwsze są dosyć wolne i nawet sami twórcy PHP odradzają korzsytania z tego.

  4. Michał "Bełdzio" Ławicki napisał(a):

    dodatkowo preg_ ma większe możliwości :)

  5. DiLu napisał(a):

    @Crozin:
    O! tego nie wiedziałem. Sądziłem, że jest odwrotnie… Więc mam robotę na weekend :-D

  6. stopek napisał(a):

    :) wow . świetna strona. przypadkiem tutaj trafilem a juz widze ze jest na czym oko zawiesic :)

Dodaj komentarz