Versuchte Mailinjection trotz Schutz dagegen?

Versuchte Mailinjection trotz Schutz dagegen?

am 13.08.2006 20:43:26 von Christian Hoelscher

Hallo zusammen,

meine PHP-Anfänge habe ich dank der tollen Hilfe hier vor mittlerweile mehr
als 4 Jahren hinter mir gelassen, bin aber nach wie vor kein professionelle
PHP-Nutzer. Nun stehe ich nach Jahren wieder vor einem Problem, wo ich nicht
weiterkomme. Auf einer Website von mir gibt es ein Kontaktformular, das ich
mit folgender (sicherlich bekannter) Funktion vor Mail-Injection
vermeintlich geschützt hatte:

function input_check_mailinj($value)
{
# Array mit Zeichenketten, auf die hin geprüft werden soll...
$suspicious_str = array
(
"content-type:"
,"charset="
,"mime-version:"
,"multipart/mixed"
,"bcc:"
,"cc:"
);
// entferne hinzugefügte Slashes aus der Variable $value...
$value = stripslashes($value);

foreach($suspicious_str as $suspect) {
# überprüft, ob $value Zeichen von $suspect enthält...
if(eregi($suspect, strtolower($value)))
{# ... das Skript mit Meldung sofort abwürgen.
die ('Das ausgeführte Skript wurde beendet: ...');
}
}
}

Diese Funktion wurde dann im Kontaktskript wie folgt verwendet:

foreach($_POST as $value) input_check_mailinj($value);

Das hat bisher auch recht gut funktioniert... Bis heute diese Mail
eintrudelte - offensichtlich ein Versuchsballon eines Hackers...?

Betreff: wowsite!! look this: http://rwcotton.com/rss-read.php?q=xanax xanax
http://rwcotton.com/rss-read.php?q=tramadol tramadol
http://rwcotton.com/rss-read.php?q=bontril bontril /\\|/\\
Body: wowsite!! look this: http://rwcotton.com/rss-read.php?q=xanax xanax
http://rwcotton.com/rss-read.php?q=tramadol tramadol
http://rwcotton.com/rss-read.php?q=bontril bontril /\\|/\\

Mich machen hier diese Zeichen /\\|/\\ unruhig. Sind die ein Problem? Ich
mag mittlerweile unter Verfolgungswahn leiden... Kann ich hier Ärger
bekommen, sprich kann /\\|/\\ zu einer erfolgreichen Injection der mail()
führen, sprich Versand per bcc oder cc? Was sollen diese Zeichen überhaupt?
Ich verstehe den Sinn nicht. Und kann ich evtl. bei Vorkommen dieser
Zeichenkette /\\|/\\ auch über die EREGI das obige Skript abwürgen? Das
bekomme ich nämlich nicht hin.

Macht es übrigens Sinn, die obige Funktion zusätzlich per foreach($_GET as
$value) input_check_mailinj($value); laufen zu lassen? Anders gesagt: ist
die foreach per $_POST zuwenig?

Macht es Sinn, im Kontaktskript zusätzlich alle in der Mailfunktion
verwendeten Variablen per stripslashes zu bearbeiten? Kann ein

Das Kontaktskript habe ich zunächst komplett vom Server genommen.

Vielen Dank im voraus!

Christian

Re: Versuchte Mailinjection trotz Schutz dagegen?

am 13.08.2006 21:42:07 von Ulf Kadner

Christian Hoelscher wrote:

> mit folgender (sicherlich bekannter) Funktion vor Mail-Injection
> vermeintlich geschützt hatte:

Deine Funktion ist sicher nicht bekannt!

> function input_check_mailinj($value)
> {
> # Array mit Zeichenketten, auf die hin geprüft werden soll...
> $suspicious_str = array (
> "content-type:" ,"charset=" ,"mime-version:" ,"multipart/mixed"
> ,"bcc:" ,"cc:"
> );
> // entferne hinzugefügte Slashes aus der Variable $value...
> $value = stripslashes($value);
> foreach($suspicious_str as $suspect) {
> # überprüft, ob $value Zeichen von $suspect enthält...
> if(eregi($suspect, strtolower($value)))

erigi ist veraltet und hier voellig unnoetig. Nimm hier mal lieber
strstr() oder strpos()

> {# ... das Skript mit Meldung sofort abwürgen.
> die ('Das ausgeführte Skript wurde beendet: ...');
> }
> }
> }

Was stellt den $value dar? Die Funktion ist eigentlich nur fuer den
Messagetext relevant.

> Diese Funktion wurde dann im Kontaktskript wie folgt verwendet:
> foreach($_POST as $value) input_check_mailinj($value);

Das ist Quark! Sorry :-) Aber Du must schon die entsprechenden Felder
korrekt pruefen.

> Das hat bisher auch recht gut funktioniert... Bis heute diese Mail
> eintrudelte - offensichtlich ein Versuchsballon eines Hackers...?

Subject pruefen das keine Linebreaks oder andere Sonderzeichen enthalten
sind. Links kannste auch rausschmeissen. Eine maximallaenge ist auch
sinnvoll.

Messagetext kannst Du mit Deiner Funktion pruefen

> Mich machen hier diese Zeichen /\\|/\\ unruhig.

Warum? Es gibt vieleicht nen paar Mailserver die diese Zeichen speziell
interpretieren aber mir ist nix bekannt

> Macht es Sinn, im Kontaktskript zusätzlich alle in der Mailfunktion
> verwendeten Variablen per stripslashes zu bearbeiten? Kann ein

Warum Slashes sind doch irrellevant.

MfG, Ulf

Re: Versuchte Mailinjection trotz Schutz dagegen?

am 14.08.2006 00:28:06 von Michael Scharrer

Moin,

ich bin ja auch nicht der Fitteste und eher Amateur...
Ich hatte das gleiche Problem.
Scheinbar wird auch Unicode verwendet, von daher solltest Du auch
bestimmte dieser Zeichen über Deinen Filter laufen lassen.
Z.B. http für http.
Noch besser finde ich, sicher zu stellen, dass das Script auch von
Deinem Server aufgerufen wird.
Kein Spammer macht sich die Mühe, Deine Seite zu bemühen ;-)

Bei mir muss eine Zufallszahl eingegeben werden, erst wenn die richtig
eingegeben wird, wird das eigentliche Script mit den Filtern includet.

Natürlich muss der Filter für alle Variablen gelten.
Für Mail, Name usw. sind aber nur bestimmte Zeichen erlaubt und zudem
begrenzt, hier stellt sich das Prob einer Injektion nicht, hier filtere
ich nur, um mich vor unnützen Mails zu schützen.

Ich weiss nicht, ob meine Lösung elegant ist, jedenfalls funktioniert es
und ich bin frei von Spam oder Injektions.

Grüsse,
Michael

Re: Versuchte Mailinjection trotz Schutz dagegen?

am 14.08.2006 06:50:50 von Sebastian Wessel

Michael Scharrer schrieb:
> Moin,
>
> Bei mir muss eine Zufallszahl eingegeben werden, erst wenn die richtig
> eingegeben wird, wird das eigentliche Script mit den Filtern includet.
>
(...)
> Ich weiss nicht, ob meine Lösung elegant ist, jedenfalls funktioniert es
> und ich bin frei von Spam oder Injektions.

.... und wahrscheinlich frei von Barrierefreiheit ...
(hier schon zu oft behandelt)


--
MfG
Sebastian Wessel