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: e-mail injection, mail, mail injection
Kategoria: Bezpieczeństwo, Filtracja i walidacja
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.
z mailem jest prosto :) trudniej robi się jak będzie chciało się dodać inne nagłówki :))
cieszę się, że ktoś tu zagląda :)
@DiLu: nie używaj ereg_* – przerzuć się na preg_*. Te pierwsze są dosyć wolne i nawet sami twórcy PHP odradzają korzsytania z tego.
dodatkowo
preg_
ma większe możliwości :)@Crozin:
O! tego nie wiedziałem. Sądziłem, że jest odwrotnie… Więc mam robotę na weekend :-D
:) wow . świetna strona. przypadkiem tutaj trafilem a juz widze ze jest na czym oko zawiesic :)