際際滷

際際滷Share a Scribd company logo
ovvero:  piccole regole di hardening per le contact form dei nostri blog a cura di  Francesco Fullone  < [email_address] > un  phpBreakfast  offerto dal  GrUSP  ed  Apropos Il tuo sito? Il mio spam relay!
<?php=php_info() ?> Chi sono:  Sviluppatore PHP dal 1999 Blogger a tempo pieno Sistemista, sviluppatore e consulente part-time ;) Che faccio:  Collaboro con gruppi come  Apropos  ed il  GrUSP  per la diffusione dell'open source e di php  Coordino un progetto (in php) per la gestione del project management chiamato  phpCollab  [ http://www.php-collab.org ] Collaboro a diversi progetti online
print_f ($_GLOBALS); In questo talk si discuter in 30 minuti di: Tecniche di Mail Injection Controlli lato client, controlli lato server e sistemi antispam remoti
Prima di iniziare un pochino di ripasso Il flusso dell'informazione all'interno di un'applicazione php avviene normalmente in un modo: INPUT   ELABORAZIONE   OUTPUT che pu嘆 essere di qualsiasi tipo html, css, javascript, sql, xml o anche php! che pu嘆 essere di qualsiasi tipo da form su web a dati provenienti da un db, ad interrogazione di un webservice
Non credere agli utenti, filtra lINPUT! Utilizzare i dati di input cos狸 come vengono inviati  (raw data)  竪 pericoloso BISOGNA FILTRARE! Ma di questo ne abbiamo parlato lo scorso anno... ricordate?
Mail Injection Il  Mail Injection  竪 una tecnica che permette di inoculare  all'interno di semplici script di invio email codice per sfruttare il web server come spam relay. Sfruttando l'input non filtrato 竪 possibile aggiungere nuovi elementi alla nostra email, come ad esempio altri indirizzi email. Vedremo ora un esempio classico di form di invio contatti presente nel 90% dei blog/siti su internet
Un esempio di contact form <form method=post action=<?=$_SERVER['PHP_SELF'];?>> nome: <input type=text name=nome /> <br/> cognome: <input type=text name=cognome /> <br/> email: <input type=text name=email /> <br/> il messaggio: <br/><textarea name=messaggio></textarea><br/> <input type=submit name=spamma value=send/> </form> <?php if ($_POST['spamma'] == send) { mail( 'spam-me@fullo.net', 'ti ho mandato un messaggio!', $_POST['messaggio'],   From: $_POST['nome'] $_POST['cognome'] <$_POST['email']>); } ?>
AVETE NOTATO L'ERRORE?
L'e(o)rrore in evidenza <form method=post action=<?=$_SERVER['PHP_SELF'];?>> nome: <input type=text name=nome /> <br/> cognome: <input type=text name=cognome /> <br/> email: <input type=text name=email /> <br/> il messaggio: <br/><textarea name=messaggio></textarea><br/> <input type=submit name=spamma value=send/> </form> <?php if ($_POST['spamma'] == send) { mail( 'spam-me@fullo.net', 'ti ho mandato un messaggio!', $_POST['messaggio'] ,   From:  $_POST['nome'] $_POST['cognome']   < $_POST['email'] >); } ?>
I DATI NON SONO STATI FILTRATI...  QUESTO COMPORTERA' SPAM!!!
Dati non filtrati? Ahi, Ahi, Ahi... Supponiamo di inviare tramite form:  $_POST['email'] =  &quot;sender@real.tlc> %0A Cc:pr0n@sex.xxx %0A Bcc:spam@grrrr.xxx,v1agr4@pills.xxx <v1agr4@pills.xxx&quot; <?php if ($_POST['spamma'] == send) { mail( 'spam-me@fullo.net', 'ti ho mandato un messaggio!', $_POST['messaggio'],   From: $_POST['nome'] $_POST['cognome'] < $_POST['email'] >); } ?> Che si traduce in una email cos狸 scritta:  To: spam-me@fullo.net Subject: ti ho mandato un messaggio! From:  $_POST['nome'] $_POST['cognome']  < sender@real.tlc> Cc:pr0n@sex.xxx Bcc:spam@grrrr.xxx,v1agr4@pills.xxx <v1agr4@pills.xxx >   $_POST['messaggio']
Una semplice cura... Cos狸 come ho fatto per gli indirizzi email potrei iniettare un nuovo subject, un body o un  mime type ! Come fare per proteggersi? Semplice, filtrando l'input! <?php $from = urldecode($from); if (eregi(&quot;&quot;,$from) || eregi(&quot;&quot;,$from)){ die(&quot;ti ho beccato spammer!&quot;); } ?> E verificando l'esistenza del dominio dell'email Con Linux 竪 possibile utilizzare la funzione  checkdnsrr  che permette di interrogare host e servizi remoti, maggiori informazioni sul manuale online di php:  http://us3.php.net/manual/it/function.checkdnsrr.php
Una cura pi湛 efficace Usare librerie come PEAR:MAIL, Zend_Mail o gli eZ components risolve molti problemi Alcune librerie permettono infatti di fare controlli avanzati sul tipo di dato parsando non solo i  caratteri cattivi  ma controllando anche che le email inserite siano corrette controllandone il contenuto o addirittura interrogando direttamente i server smtp remoti per sapere se l'account esiste
Una protezione in pi湛 non si rifiuta mai... Usare AKISMET per ricontrollare i dati (gi parsati)  aiuta a ridurre anche lo SPAM in ingresso. AKISMET.com  竪 un servizio gratuito offerto dai creatori di WordPress.com per filtrare i messaggi e controllare che non contengano spam. Il progetto mette a disposizioni delle API liberamente utilizzabili per integrare il tutto all'interno della propria applicazione. In un anno di utilizzo ho bloccato circa  100.000 messaggi di spam  (molti dei quali inviati con tecniche di mail injection)
? Domande?
Altri attacchi: Approfondimenti su web Url interessanti: Akismet http://www.akismet.com SecurePHP Wiki http://www.securephpwiki.com/index.php/Email_Injection PHP Security Guide http://phpsec.org/projects/guide / Hardened-PHP http://www.hardened-php.net/suhosin/index.html Il Wiki del GrUSP http://wiki.grusp.it
Contatti Francesco Fullone [email_address] ffullone http://www.fullo.net http://www.grusp.it http://www.aproposito.org
Licenza Quest'opera 竪 stata rilasciata sotto la licenza Creative Commons Attribution-ShareAlike 2.5.  Per leggere una copia della licenza visita il sito web  http://creativecommons.org/licenses/publicdomain/  o spedisci una lettera a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

More Related Content

Il tuo sito? Il mio spam relay!

  • 1. ovvero: piccole regole di hardening per le contact form dei nostri blog a cura di Francesco Fullone < [email_address] > un phpBreakfast offerto dal GrUSP ed Apropos Il tuo sito? Il mio spam relay!
  • 2. <?php=php_info() ?> Chi sono: Sviluppatore PHP dal 1999 Blogger a tempo pieno Sistemista, sviluppatore e consulente part-time ;) Che faccio: Collaboro con gruppi come Apropos ed il GrUSP per la diffusione dell'open source e di php Coordino un progetto (in php) per la gestione del project management chiamato phpCollab [ http://www.php-collab.org ] Collaboro a diversi progetti online
  • 3. print_f ($_GLOBALS); In questo talk si discuter in 30 minuti di: Tecniche di Mail Injection Controlli lato client, controlli lato server e sistemi antispam remoti
  • 4. Prima di iniziare un pochino di ripasso Il flusso dell'informazione all'interno di un'applicazione php avviene normalmente in un modo: INPUT ELABORAZIONE OUTPUT che pu嘆 essere di qualsiasi tipo html, css, javascript, sql, xml o anche php! che pu嘆 essere di qualsiasi tipo da form su web a dati provenienti da un db, ad interrogazione di un webservice
  • 5. Non credere agli utenti, filtra lINPUT! Utilizzare i dati di input cos狸 come vengono inviati (raw data) 竪 pericoloso BISOGNA FILTRARE! Ma di questo ne abbiamo parlato lo scorso anno... ricordate?
  • 6. Mail Injection Il Mail Injection 竪 una tecnica che permette di inoculare all'interno di semplici script di invio email codice per sfruttare il web server come spam relay. Sfruttando l'input non filtrato 竪 possibile aggiungere nuovi elementi alla nostra email, come ad esempio altri indirizzi email. Vedremo ora un esempio classico di form di invio contatti presente nel 90% dei blog/siti su internet
  • 7. Un esempio di contact form <form method=post action=<?=$_SERVER['PHP_SELF'];?>> nome: <input type=text name=nome /> <br/> cognome: <input type=text name=cognome /> <br/> email: <input type=text name=email /> <br/> il messaggio: <br/><textarea name=messaggio></textarea><br/> <input type=submit name=spamma value=send/> </form> <?php if ($_POST['spamma'] == send) { mail( 'spam-me@fullo.net', 'ti ho mandato un messaggio!', $_POST['messaggio'], From: $_POST['nome'] $_POST['cognome'] <$_POST['email']>); } ?>
  • 9. L'e(o)rrore in evidenza <form method=post action=<?=$_SERVER['PHP_SELF'];?>> nome: <input type=text name=nome /> <br/> cognome: <input type=text name=cognome /> <br/> email: <input type=text name=email /> <br/> il messaggio: <br/><textarea name=messaggio></textarea><br/> <input type=submit name=spamma value=send/> </form> <?php if ($_POST['spamma'] == send) { mail( 'spam-me@fullo.net', 'ti ho mandato un messaggio!', $_POST['messaggio'] , From: $_POST['nome'] $_POST['cognome'] < $_POST['email'] >); } ?>
  • 10. I DATI NON SONO STATI FILTRATI... QUESTO COMPORTERA' SPAM!!!
  • 11. Dati non filtrati? Ahi, Ahi, Ahi... Supponiamo di inviare tramite form: $_POST['email'] = &quot;sender@real.tlc> %0A Cc:pr0n@sex.xxx %0A Bcc:spam@grrrr.xxx,v1agr4@pills.xxx <v1agr4@pills.xxx&quot; <?php if ($_POST['spamma'] == send) { mail( 'spam-me@fullo.net', 'ti ho mandato un messaggio!', $_POST['messaggio'], From: $_POST['nome'] $_POST['cognome'] < $_POST['email'] >); } ?> Che si traduce in una email cos狸 scritta: To: spam-me@fullo.net Subject: ti ho mandato un messaggio! From: $_POST['nome'] $_POST['cognome'] < sender@real.tlc> Cc:pr0n@sex.xxx Bcc:spam@grrrr.xxx,v1agr4@pills.xxx <v1agr4@pills.xxx > $_POST['messaggio']
  • 12. Una semplice cura... Cos狸 come ho fatto per gli indirizzi email potrei iniettare un nuovo subject, un body o un mime type ! Come fare per proteggersi? Semplice, filtrando l'input! <?php $from = urldecode($from); if (eregi(&quot;&quot;,$from) || eregi(&quot;&quot;,$from)){ die(&quot;ti ho beccato spammer!&quot;); } ?> E verificando l'esistenza del dominio dell'email Con Linux 竪 possibile utilizzare la funzione checkdnsrr che permette di interrogare host e servizi remoti, maggiori informazioni sul manuale online di php: http://us3.php.net/manual/it/function.checkdnsrr.php
  • 13. Una cura pi湛 efficace Usare librerie come PEAR:MAIL, Zend_Mail o gli eZ components risolve molti problemi Alcune librerie permettono infatti di fare controlli avanzati sul tipo di dato parsando non solo i caratteri cattivi ma controllando anche che le email inserite siano corrette controllandone il contenuto o addirittura interrogando direttamente i server smtp remoti per sapere se l'account esiste
  • 14. Una protezione in pi湛 non si rifiuta mai... Usare AKISMET per ricontrollare i dati (gi parsati) aiuta a ridurre anche lo SPAM in ingresso. AKISMET.com 竪 un servizio gratuito offerto dai creatori di WordPress.com per filtrare i messaggi e controllare che non contengano spam. Il progetto mette a disposizioni delle API liberamente utilizzabili per integrare il tutto all'interno della propria applicazione. In un anno di utilizzo ho bloccato circa 100.000 messaggi di spam (molti dei quali inviati con tecniche di mail injection)
  • 16. Altri attacchi: Approfondimenti su web Url interessanti: Akismet http://www.akismet.com SecurePHP Wiki http://www.securephpwiki.com/index.php/Email_Injection PHP Security Guide http://phpsec.org/projects/guide / Hardened-PHP http://www.hardened-php.net/suhosin/index.html Il Wiki del GrUSP http://wiki.grusp.it
  • 17. Contatti Francesco Fullone [email_address] ffullone http://www.fullo.net http://www.grusp.it http://www.aproposito.org
  • 18. Licenza Quest'opera 竪 stata rilasciata sotto la licenza Creative Commons Attribution-ShareAlike 2.5. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/publicdomain/ o spedisci una lettera a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.