Oggi per gli spammers è sempre più difficile trovare un relay aperto, ed anche i pochi esistenti sono quasi sempre inseriti nelle black list... Tuttavia esistono sempre nuove
prospettive per chi si ingegna, specialmente quando l'ingenuità altrui apre dei comodi varchi.
Stiamo parlando dei form per l'invio delle mail che migliaia di programmatori PHP improvvisati
(e non solo quelli) hanno disseminato in rete senza applicare un'adeguata validazione dell'input dell'utente e che si stanno rivelando una vera manna per i professionisti dello spamming.
Tutti gli sviluppatori sanno di doversi difendere dalle SQL injections... Meno nota è la possibilità di injections negli headers delle mail: il problema
è conosciuto da anni ma è diventato emergenza negli ultimi mesi, cioè da quando gli spammers hanno
iniziato a sfruttare abbondantemente questa vulnerabilità : tutto parte da una caratteristica (possiamo chiamarlo bug?) della funzione mail() di PHP.
Descrizione della funzione mail
bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]] )
I primi tre parametri non hanno bisogno di spiegazioni, il terzo parametro invece è una specie di calderone in cui infilare tutto cià che non è destinatario, oggetto della mail o corpo del messaggio, quindi ad esempio il mittente o tutti gli headers aggiuntivi per inviare una mime mail.
Qui arrivano i dolori perché se non si va a verificare che cosa
effettivamente l'utente inserisce nel "calderone" abbiamo automaticamente aperto le porte ad una possibile injection di headers come ad esempio la stringa:
"\nBCC:indirizzo@daspammare1.it,indirizzo@daspammare2.com...."
E tutto questo avviene attraverso informazioni apparentemente innocue come il mittente (From:).
Chi ha sempre fatto le cose come si deve non deve allarmarsi... per gli altri ecco
in sistesi le regole da seguire per evitare il problema.
- Utilizzate sempre la validazione lato server: verificare i dati in Javascript va bene solo per comodità del navigatore, ma dobbiamo sempre effettuare anche in PHP gli
opportuni controlli sull'input dell'utente. Ricordiamo che è possibile effettuare il submit di un form via script e vanificare ogni controllo lato client, ed è appunto questa la tecnica utilizzata dagli spammers. - Lato server verifichiamo sempre che la mail inserita per il mittente sia un indirizzo
valido e che in generale quando l'input dell'utente finisce nel quarto parametro della funzione mail()non contenga a-capo (\n, \r\n) o stringhe troppo lunghe. Attenzione ai campi hidden del form... non sono affatto nascosti agli occhi di chi spamma. - Non utilizzare form mail PHP scaricandoli dalla rete se non si è in grado di comprenderne il codice PHP: non si può sapere se l'autore ha preso le precauzioni necessarie
In caso contrario è quasi sicuro che nel giro di poco tempo lo script per l'invio della mail dal form sarà preso di mira e verrà utilizzato per inviare spam. Infatti, esistono robots specializzati nell'analizzare i siti realizzati in PHP e scovare pagine vulnerabili.
La conseguenza
più probabile per i siti che diventano inconsapevolmente dei relay è quella di far inserire l'ip del server in una black list e quindi rendere impossibile l'invio di mail agli utenti che di quella macchina si servono.
Di seguito alcuni link presso cui trovare esempi di codice corretto (ma ci vuole davvero poco), in ogni caso consiglio una ricerca in Google con la keyword [PHP Mail Header Injection]
Email Header Injections in PHP
Email Header Injection Exploit
Email Injection (Secure PHP)