[PHP] Wordt het mailform misbruikt door spammers?

Pagina: 1
Acties:
  • 259 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • kingmuze
  • Registratie: Februari 2003
  • Laatst online: 24-10-2024

kingmuze

so don't fear

Topicstarter
Zoals zoveel sites staat er ook op mijn site een mail form. Hierin kun je allerlei informatie invullen. Wanneer de bezoeker het formulier verstuurd wordt het als volgt verstuurd met PHP(kort samengevat):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$naam = $_POST['naam'];
// SNIP more stuff...

// Create message
$sendMessage = "";
$sendMessage .= "Naam:\n".$naam . "\n";
// SNIP more stuff...

// Create headers
$from    = "info@xxx.nl";
$headers="";
// SNIP more headers...

//Send mail 
$to      = 'info@xxx.nl';
$subject = 'xxx.nl Contactformulier';
$message = $sendMessage;
mail($to, $subject, $message, $headers);
?>

Nou kreeg ik onlangs de volgende contact berichten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Family name:
the3969@bla.com
Name:
cured
Content-Type: multipart/alternative; 
              boundary=4bdc28dd2925186e1e85e544cb68fd60
X-Mailer: Balsa 1.1.6
Subject: ational regulation of ham production ach
cc: tepc2@aol.com
cc: ismailie16@yahoo.com
cc: haw0302@wmc.com
cc: iglesiasenrique@yahoo.com
cc: briandmandy@bellsouth.net
cc: larryb@wmc.com
cc: baby_hot_sauce3@hotmail.com
cc: h159381@msn.com

This is a multi-part message in MIME format.

--4bdc28dd2925186e1e85e544cb68fd60
Content-Transfer-Encoding: 7bit
Content-Type: text/plain

produced by allowing the cured meat to hang in a

--4bdc28dd2925186e1e85e544cb68fd60
Content-Transfer-Encoding: 8bit
Content-Type: text/plain

produced by allowing the cured meat to hang in a

--4bdc28dd2925186e1e85e544cb68fd60--
.

Address:
the3969@bla.com
Zipcode:
the3969@bla.com
City:
the3969@bla.com
Telephone number:
the3969@bla.com
E-mail address:
the3969@bla.com
Message: 
the3969@bla.com


Met de volgende headers
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Return-Path: <zzz@xxx.com>
Received: from mx2.tilbu1.nb.home.nl ([213.51.146.140])
          by mta1.tilbu1.nb.home.nl
          (InterMail vM.6.01.04.03 201-2131-118-103-20050206) with ESMTP
          id <20060923064420.HGJG1054.mta1.tilbu1.nb.home.nl@mx2.tilbu1.nb.home.nl>
          for <yyy@xxx.nl>; Sat, 23 Sep 2006 08:44:20 +0200
Received: from xeon-1.amsrbe.sensson.net ([83.98.148.180]:46505 helo=consulo.sensson.net)
    by mx2.tilbu1.nb.home.nl with esmtp (Exim 4.30)
    id 1GR1FK-0005DJ-Ty
    for yyy@xxx.nl; Sat, 23 Sep 2006 08:44:18 +0200
Received: from apache by consulo.sensson.net with local (Exim 4.63)
    (envelope-from <zzz@xxx.com>)
    id 1GR18b-0004jo-1a
    for xxx@home.nl; Sat, 23 Sep 2006 08:37:21 +0200
To: yyy@xxx.nl
Subject: contact form
X-Sender:  the3969@xxx.com <the3969@xxx.com>
From: info@xxx.nl <info@xxx.nl>
Reply-To: info@xxx.nl <info@xxx.nl>
Date: Sat, 23 Sep 2006 08:37:21 +0200
Message-ID: <20060923083721selman@www.xxx.com>
Delivered-to: info@xxx.nl <info@xxx.nl>
MIME-Version: 1.0
X-Priority: 1
Importance: High
X-MSMail-Priority: High
X-Mailer: SelmanD Mailler With PHP!
X-AtHome-MailScanner-Information: Neem contact op met support@home.nl voor meer informatie
X-AtHome-MailScanner: Found to be clean


Nou is natuurlijk de vraag, worden het echt misbruikt of is het een poging tot 8)7 ? Ben ook benieuwd of andere mensen dit al eens hebben meegemaakt

[gvr]muze[nl] says: fear is the mind killer


  • Eijkb
  • Registratie: Februari 2003
  • Laatst online: 13:44

Eijkb

Zo.

Dat is misbruik ja. Je ziet dat via header injection een aantal CC adressen toegevoegd worden die deze mail ook ontvangen hebben.

Ik weet niet wie of wat $sendMessage vult, maar dat zal een tekstbox zijn in het formulier? Dat moet je dus controleren op de input. En werk netjes (alsof register_globals disabled staat) met $_POST[$sendMessage], dat maakt het voor jezelf ook duidelijker.

Ik werk bij een hostingbedrijf en dit zien we héél vaak. Als we het zien zijn er meestal al 1000den mails verstuurd en brengen we het script offline of, indien het de spuigaten uit loopt en niet makkelijk te voorkomen is, de hele site.

Snelle oplossing: het script hernoemen naar iets zonder "mail" in de naam. Veel spammers zoeken binnen google gewoon op "mail" +php oid en vinden zo dit soort scripts die ze vervolgens bestoken met een hoop requests in de hoop dat er eentje lukt. Als het bv. sturen.php had geheten hadden ze het niet gevonden. Maar goed, dat kan je dus doen NAAST het aanpassen van je scripts.

[ Voor 94% gewijzigd door Eijkb op 23-09-2006 11:14 ]

.


  • kingmuze
  • Registratie: Februari 2003
  • Laatst online: 24-10-2024

kingmuze

so don&#039;t fear

Topicstarter
Eijkb schreef op zaterdag 23 september 2006 @ 11:10:
Dat is misbruik ja. Je ziet dat via header injection een aantal CC adressen toegevoegd worden die deze mail ook ontvangen hebben.

Ik weet niet wie of wat $sendMessage vult, maar dat zal een tekstbox zijn in het formulier? Dat moet je dus controleren op de input. En werk netjes (alsof register_globals disabled staat) met $_POST[$sendMessage], dat maakt het voor jezelf ook duidelijker.

Ik werk bij een hostingbedrijf en dit zien we héél vaak. Als we het zien zijn er meestal al 1000den mails verstuurd en brengen we het script offline of, indien het de spuigaten uit loopt en niet makkelijk te voorkomen is, de hele site.

Snelle oplossing: het script hernoemen naar iets zonder "mail" in de naam. Veel spammers zoeken binnen google gewoon op "mail" +php oid en vinden zo dit soort scripts die ze vervolgens bestoken met een hoop requests in de hoop dat er eentje lukt. Als het bv. sturen.php had geheten hadden ze het niet gevonden. Maar goed, dat kan je dus doen NAAST het aanpassen van je scripts.
Thanks voor de handige tip. Maar kun je uberhaupt mailheaders injecteren in het message field van de php mail functie:
mail($to, $subject, $message, $headers);

Het kan me voorstellen dat wanneer $headers wordt opgebouwd uit data dat uit het formulier komt, dat injection dan mogelijk is.

[gvr]muze[nl] says: fear is the mind killer


  • Priet
  • Registratie: Januari 2001
  • Laatst online: 08:01

Priet

To boldly do what no one has..

Voorbeeld van oplossing/filter:
PHP:
1
2
3
function checkPOST() { return !(eregi("(MIME-|CONTENT-|CC:|BCC:|TO:)", str_replace(" ", "", print_r($_REQUEST, true)))); }
function checkEmail($email) { return (eregi("^[_\.0-9a-z-]+\@([0-9a-z-]+\.)+[a-z]{2,4}$", $email)); }
function checkName($name) { return (eregi("^[a-z0-9_ \.]+$", $name)); }

Drie verschillende functies, voor het checken van de POST in het algemeen (geen injectie) en afzonder de naam en e-mailadres.

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


  • Eijkb
  • Registratie: Februari 2003
  • Laatst online: 13:44

Eijkb

Zo.

Injectie in de message is gewoon mogelijk. Je moet weten dat een compleet mailtje een tekst bestand is. De syntax bepaalt wat waar staat. Dus als een spammert headers injecteerd in bv. $naam dan is die syntax correct en zullen je eigen headers niet meer meetellen omdat die buiten je mail staan als je begrijpt wat ik bedoel.

PHP is soms te makkelijk :+ Zorg er voor dat je ten alle tijden ALLE userinput controleerd op vanalles en nog wat. Is soms wat lastig en lijkt overbodig maar goed: beter te veilig dan een gatenkaas.

.


  • Priet
  • Registratie: Januari 2001
  • Laatst online: 08:01

Priet

To boldly do what no one has..

Eigenlijk is de oorzaak het té simpele mail-protocol. En of je het nou stuurt met PHP/ASP/Java/Perl/etc, je zult het altijd op zo'n manier kunnen misbruiken :(

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


  • Pyrus
  • Registratie: November 2001
  • Laatst online: 20-09 21:30

Pyrus

Hardknock life

De oplossing die ik heb bedacht is een nep mailform maken eigenlijk. Je schotelt de gebruiker een formulier voor dat als mailform uitziet, maar in feite zet je het gewoon in een database en stuur je zelf via een echt mailform een reply. Eventueel kun je na verzenden van de gebruiker een standaard mailtje naar jezelf sturen met een link naar dat formulier :)
Natuurlijk dan nog steeds input checken, maar dan nu op SQL-injecties (wat gewoon te voorkomen is met mysql_real_escape_string() om alle strings te pleuren dacht ik)

LinkedIn


  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 16:14

pietje63

RTFM

Priet schreef op zaterdag 23 september 2006 @ 11:44:
Eigenlijk is de oorzaak het té simpele mail-protocol. En of je het nou stuurt met PHP/ASP/Java/Perl/etc, je zult het altijd op zo'n manier kunnen misbruiken :(
Input control...
Als je het e-mail adres op ":" checkt en een vergelijkbaar iets met het subject veld doet ben je al een heel eind.

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Verwijderd

pietje63 schreef op zaterdag 23 september 2006 @ 12:00:
[...]

Input control...
Als je het e-mail adres op ":" checkt en een vergelijkbaar iets met het subject veld doet ben je al een heel eind.
Dan ben je er nog niet. Je hebt dan nog steeds de kans op MIME-injections.

Gebruik gewoon een standaard class "Full featured email transfer class for PHP", dan is alles al voor je geregeld. En je krijgt er meer flexibiliteit voor terug.

Acties:
  • 0 Henk 'm!

  • pim
  • Registratie: Juli 2001
  • Laatst online: 17-09 11:39

pim

* kick *

in alle input : vervangen door ; lost het op.

Acties:
  • 0 Henk 'm!

Verwijderd

In princiepe is iets als:
$naam = $_POST['naam'];

Ten strengste verboden. User input is nooit te vertrouwen, en hiermee geef je eigelijk aan dat $naam niet meer schadelijk kan zijn. Oplossingen zijn vaak simpel. Als je bv alle enters eruit haalt en ervoor zorgt dat de naam niet langer mag zijn dan 80 tekens, is het vrijwel onmogelijk om nog truken uit te halen. Als je nog veiliger wilt kan je ook nog regular expressions die hierboven staan gemeld gebruiken.

Voorbeeld enters weghalen en max tekens van 80:
$naam = substr(str_replace(array("\n","\r")," ",$_POST['naam']),0,80);

Acties:
  • 0 Henk 'm!

Verwijderd

Hier vind je een interessant artikel over injection van e-mail headers:

http://www.securephpwiki.com/index.php/Email_Injection

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
In het geval van de TS is er alleen maar sprake van een poging tot injecteren. Met zijn code kan dat ook niet anders aangezien er niets wat door de user wordt ingevuld in de headers terechtkomt. Het spambericht incluis "headers" staat dan ook gewoon in de body van het bericht (de eerste tekst in de TS), de echte mailheaders zijn gewoon schoon.
Verder denk ik dat een blik in een RFC met betrekking tot mail een stuk meer op kan lossen dan willekeurig regexen en andere checks op je input los te laten. Checken is goed, maar nog belangrijker is dat je weet waar je mee bezig bent...

Regeren is vooruitschuiven

Pagina: 1