OVH Cloud OVH Cloud

Victime d'un hack de type "relais" : j'aimerais comprendre

27 réponses
Avatar
SvS
[Moderation]
Attention, cet article est posté dans deux groupes et le FU2
n'etait pas positionné.

J'ai pris sur moi de le positionner sur fr.comp.securite car :

- amha le problème est bien plus général que le php
(vérif des entrées, toussa :) )

- il vaut mieux éviter des réponses à droite et à gauche dans ce cas
Si vous n'êtes pas d'accord avec ce FU2 merci de le repositionner

Eric Razny.
Co-modérateur de fr.comp.securite
[fin de modération]


Bonjour,

j'ai très honte de moi, je pensais avoir bien sécurisé mes pages web, mais
j'ai été victime d'un hack monstrueux sur une page qui était censée
m'envoyer un email.

Je m'explique :
1) une page html classique, qui contient quatre champs : un nom d'émeteur,
un email d'émeteur, un sujet, et un message, en utilisant les champs FORM et
la méthode POST.

2) ces données sont envoyées à une page php qui les récupère, et qui
contient une commande mail qui contient en dur mon adresse email. Extrait de
la feuille php
_____________________________________________
$too = "moi@monadresse.org";
/* Ce qui vient du post */
$subject = $_POST['title'];
$from_n = $_POST['realname'];
$from_e = $_POST['emaille'];
$message = $_POST['comments'];
if ($from_n<>"") $mister = $from_n; else $mister = $from_e;

/* divers tests */
if ($from_e=='') { errmess("Vous n'avez pas mis votre
email...",$url_from,$css_f); }
if ($message=='' & $subject=='') { errmess("Vous avez oubli&eacute; le
sujet et le petit message...",$url_from,$css_f); }

$h = "MIME-version: 1.0\r\n";
$h .= "Content-type: text/html; charset=iso-8899-1\r\n";
$h .= "From: ".$from_n.'<'.$from_e.'>';
$sbj = stripcslashes($subject);
$message = stripcslashes($message);

mail($too, $sbj, $message, $h);
______________________________________


3) en l'espace de 24h, je reçois plus de 600 emails venant de cette page. Je
regarde mon log, effectivement, je vois les lignes qui contiennent les POST,
venant de diverses adresses email. Dans l'urgence je bloque mon site, puis
j'efface la feuille htm et la feuille php

Bon, je me dis "ce n'est pas grave", il n'y a que moi qui a reçu ce spam

4) M...... j'ai servi de relais, car les emails de spam ont bien été
redistribués à des centaines de personnes... Je le sais, car sur mon adresse
de retour (celle de mon serveur apache), j'ai reçu plus de 800 avis de non
délivrance....

5) je regarde les emails qui m'ont été envoyé sur moi@monadresse.org, et
effectivement, je vois pour la plupart des emails de spam une liste
d'adresses dans un deuxième champ "subject". Extrait de l'une d'entre elle :
________________________________________________
Date: Tue, 14 Feb 2006 16:46:43 +0100
Subject: Callorhynchus@monadresse.org
To: moi@monadresse.org
MIME-version: 1.0
Content-type: text/html; charset=iso-8899-1
From: Callorhynchus@monadresse.org<Callorhynchus
Content-Type: multipart/mixed; boundary=47b1ece617d073c62cc4160ab5112110
MIME-Version: 1.0
From: Callorhynchus@monadresse.org
Subject: hmm
,missamys@aol.com,ionacar@aol.com,mlmartin11@aol.com,johnonel@aol.com

-------------- Suit alors une longue liste d'emails, qui se termine par

Message-Id: <20060214154643.8239C1C0009B@mwinf1209.wanadoo.fr>
X-me-spamlevel: low
X-me-spamrating: 60.253081
__________________________

Questions :

A) est-ce normal que la méthode post puisse être simulée?
B) pourquoi, alors que l'adresse de la fonction mail dans la feuille php ne
contenait qu'un seul destinateur, cet email a été envoyé à d'autres???
C) Pourquoi y a -t-il deux champs subjects dans les entêtes?
D) que faire pour se protéger de ça? A part bien sûr ce que j'ai déjà
effectué, à savoir effacer les deux feuilles??
E) est-ce moi qui suis un sombre crétin?????

Pour info : serveur apache 2.0.55
Php 5.1.2

Merci pour vos réponses, et mes excuses à la communauté pour avoir servi,
contre ma volonté, la très mauvaise cause des spammeurs
:-(((((((((((((((((((

10 réponses

1 2 3
Avatar
Fabien LE LEZ
On 19 Feb 2006 22:49:56 GMT, R12y
:

Juste pour information, il y a un groupe consacré à l'algorithmique:
fr.comp.algorithmes.


Pour en revenir au problème évoqué dans ce thread, une lecture
attentive de la doc (et des notes qui vont avec) n'est pas à négliger.
En l'occurence, la note du 14 février sur
<http://fr3.php.net/manual/en/function.mail.php>.

Avatar
Nicob
On Sun, 19 Feb 2006 22:49:56 +0000, R12y wrote:

En gros, tu programme d'abord les tests que ton programme doit passer et
ensuite du fait le programme.


Mouais ...

Ici encore, on a le problème du niveau (en sécurité) de la personne qui
écrit les tests. Car il y aura forcément une énorme différence entre
les tests "simplement fonctionnels" écrits par un développeur classique
et une série de tests comme celles réalisés par l'OUSPG (PROTOS WAP,
ISAKMP, SNMP, SIP) ou par GLEG.Net (RADIUS, LDAP, ...).

C'est d'ailleurs effarant de voir le nombre de vulns trouvées par ces
jeux de tests ...


Nicob

Avatar
R12y
Nicob :

C'est d'ailleurs effarant de voir le nombre de vulns trouvées par ces
jeux de tests ...


Rien n'empeche d'intégrer ces tests à la batterie de tests fonctionnels.
Si le code source des "tests" est mis à disposition.

--
Debian/apt Repo: http://locataire-serveur.info/sections/liens/debian-repository
Fedora/yum Repo: http://locataire-serveur.info/sections/liens/fedora-core-yum

Avatar
R12y
MIMATA :

R12y wrote:
La sécurisation d'un script ou programme quelconque passe d'abord par
une bonne conception.
Le truc c'est que je voudrais tester les scripts que j'ai intégré sur mes

sites mais que d'autres personnes ont programmé, il s'agit d'un test a
posteriori. Je ne suis pas encore assez au point pour pouvoir juger de la
sécurité d'un prog juste en lisant le code.


Prenons l'exemple des mails par un formulaire web, il n'y a pas que savoir
lire un langage qu'il faut. Il faut aussi comprendre comment fonctionne:

- les emails.
- le protocole HTTP

Un bon moyen est de commencer par s'habituer à lire les RFC
(http://fr.wikipedia.org/wiki/RFC)

Croire que maitriser un langage est suffisant est à mon avis une erreur.
Je te le dis parceque tu semble insister sur le fait que tu veuille te
concentrer sur PHP. Pour faire dans la sécurité, toucher _un peu_ à tous
les langages c'est bien.

Il y a une nouvelle mode de nos jours, la programmation dirigée par les
tests. En gros, tu programme d'abord les tests que ton programme doit
passer et ensuite tu fais le programme. Tu pourais donc t'en
inspirer... Ca t'interesse d'avoir un peu de détails sur la manière de
mener les choses sous cet angle?
Bien sûr !



Pour ça c'est mieux qu'on continue à en parler sur fr.comp.developpement.

--
Debian/apt Repo: http://locataire-serveur.info/sections/liens/debian-repository
Fedora/yum Repo: http://locataire-serveur.info/sections/liens/fedora-core-yum


Avatar
MIMATA
R12y wrote:
Prenons l'exemple des mails par un formulaire web, il n'y a pas que
savoir lire un langage qu'il faut. Il faut aussi comprendre comment
fonctionne:
- les emails.
- le protocole HTTP
Mouais...moi, je veux juste qu'on me dise clairement "pour mettre un champs

qui ne soi pas une passoire dans ton formulaire, mets ce code : ... ; si tu
veux tester si ton champs est ok, mets ce code : ...". A la limite, si je
comprends pas bien pourquoi ça marche mais que ça marche, ça me va...dans un
premier temps, je comprendrai plus tard. C'est quand même pas un truc super
original que je demande, les champs de formulaire avec Votre nom, Votre
prénom, Votre mail, Votre site, Votre commentaire...c'est des choses hyper
banales non ?

Un bon moyen est de commencer par s'habituer à lire les RFC
(http://fr.wikipedia.org/wiki/RFC)
A ouais mais non... Plus ça va et plus c'est technique là. C'est pas que je

veuille pas m'y intéresser mais franchement c'est pas de mon niveau. Autant
apprendre les CSS, le (X)HTML, le JAVASCRIPT et maintenant le PHP me
paraissait accessible, mais lire les RFC et surtout comprendre ce qui est
marqué dedans, c'est pas pour moi, j'ai pas un diplôme d'ingénieur en
informatique. Autant me mettre au chinois, déjà je comprends pas un mot sur
2, ensuite même quand je comprends les mots, je comprends pas le sens des
phrases... J'avais lu celle concernant les mails mais je n'en ai pas tiré
grand chose.
Ma demande originelle avait pour but de savoir comment tester mes
formulaires pas comment devenir ingéneur informatique. Il faut que vous (toi
et les autres spécialistes) comprenniez qu'on ne peut pas nous (moi et
l'immense majorité de neuneus qui font des sites web en php
occasionnellement) demander de devenir des pro juste parce qu'il parait
normal qu'avant de vouloir se frotter à un langage, il faut parfaitement le
connaitre. Je suis le premier à dire aux mégas débutants qu'avant de vouloir
faire un site, il faut se renseigner un minimum sur les principes
fondamentaux (comment nommer les pages et les fichiers, pourquoi le site est
différent sous FF et IE, etc) mais je ne leur dit pas d'apprendre
parfaitement les langages informatiques, le fonctionnement d'internet, les
techniques de piratages, le fonctionnement de leur ordinateur, le
fonctionnement du hardware, le fonctionnement de la centrale électrique qui
aliment le tout... Ca me fait penser aux début de l'informatique quand les
mecs disaient que pour pouvoir s'en servir, il fallait apprendre le dos (et
c'était vrai) puis sont apparus les système d'exploitation...et là...ben les
1er avaient toujours raison mais les autres s'en foutaient parcequ'ils
pouvaient quand même s'en servir, même sans connaitre le langage qui
permettait de faire appraitre ces superbes et mystérieux écrans bleu... Ce
que je demande, c'est juste un moyen de tester mes scripts.


Croire que maitriser un langage est suffisant est à mon avis une
erreur. Je te le dis parceque tu semble insister sur le fait que tu
veuille te concentrer sur PHP. Pour faire dans la sécurité, toucher
_un peu_ à tous les langages c'est bien.
Je suis d'accord, c'est bien, mais il faut bien commencer par le début et

essayé d'avancer en procédant par ordre. Seul chez moi, je peux pas me
mettre à apprendre tous les langages juste pour voir. J'ai déjà vu les CSS,
le (X)HTML un peu de XML, le JAVASCRIPT, le SQL et maintenant je me plonge
dans le PHP en utilisant ce que j'ai appris dans les langages précédement
cités.

Il y a une nouvelle mode de nos jours, la programmation dirigée par
les tests. En gros, tu programme d'abord les tests que ton
programme doit passer et ensuite tu fais le programme. Tu pourais
donc t'en inspirer... Ca t'interesse d'avoir un peu de détails sur
la manière de mener les choses sous cet angle?
Bien sûr !



Pour ça c'est mieux qu'on continue à en parler sur
fr.comp.developpement.
Bon...je me suis abonné... mais je sens que je suis pas de taille...


J'entends d'ici certains qui vont lire ces lignes se dire "celui-là, il n'a
rien compris, il veut jouer dans la cour des grands sans se fatiguer : pour
faire de la sécurité, il faut parfaitement maitriser tous les aspects de la
programmation et le fonctionnement des échanges d'informations sans quoi on
ne peut pas se protéger". Ils auront à la fois raison et tord car la réalité
c'est qu'il y a beaucoup d'amateurs sur le web, moi le premier, et ces
derniers ne pourront jamais apprendre et comprendre tout ce qui semble
nécessaire. Faut-il restreindre l'utilisation du web aux seuls spécialistes
ou donner les moyens à tout le monde de se protéger correctement et de
prendre conscience des faiblesses de leurs sites ? Je repose donc ma
question du départ : existe-t-il un site qui permet de tester nos
formulaires ?



Avatar
Nicob
On Mon, 20 Feb 2006 14:43:48 +0000, R12y wrote:

Si le code source des "tests" est mis à disposition.


Les entités commerciales devraient tout de même être prêtes à mettre
la main à la poche pour acheter un jeu de test fait par des gars
qui connaissent leur métier (exemple : gleg.net).


Nicob

Avatar
R12y
MIMATA :

R12y wrote:
Prenons l'exemple des mails par un formulaire web, il n'y a pas que
savoir lire un langage qu'il faut. Il faut aussi comprendre comment
fonctionne:
- les emails.
- le protocole HTTP
Mouais...moi, je veux juste qu'on me dise clairement "pour mettre un champs

qui ne soi pas une passoire dans ton formulaire, mets ce code : ...


Et supposons que juste pour faire chier, je dise que tu dois plutot en
mettre un autre (et que je justifie aussi mon choix), comment tu décides?

Votre nom, Votre prénom, Votre mail, Votre site, Votre
commentaire...c'est des choses hyper banales non ?


Tu mélanges tout: la simplicité du principe, de mise en oeuvre,
de l'implémentation, des tests,...
Ce n'est pas _du tout_ parceque c'est facile à énoncer que c'est facile à
mettre en oeuvre. Et encore mois à tester.

Ma demande originelle avait pour but de savoir comment tester mes
formulaires pas comment devenir ingéneur informatique.


Mais oui...

Je suis le premier à dire aux mégas débutants


Euh... les méga débutants, tu en fais encore partie hein...

fait penser aux début de l'informatique quand les mecs disaient que pour
pouvoir s'en servir, il fallait apprendre le dos (et c'était vrai) puis
sont apparus les système d'exploitation...


Bon. On va dire que tu n'as rien dit.

Ce que je demande, c'est juste un moyen de tester mes scripts.


Et je t'ai répondu.
Moi j'ai plutot l'impression que tu recherchais une réponse qui te
plaisais. Mais ça n'engage que moi.

Faut-il restreindre
l'utilisation du web aux seuls spécialistes ou donner les moyens à tout
le monde de se protéger correctement et de prendre conscience des
faiblesses de leurs sites ?


Ce qu'il faut c'est arreter de faire croire au gens qu'on peut faire des
choses "sans se prendre la tête".
Le genre de slogans "créez vote site en quelques clics", "créez ceci ou
cela sans rien y connaitre"... Ben ta mis le pied en plein dedans. Ben
c'est faux.

--
Debian/apt Repo: http://locataire-serveur.info/sections/liens/debian-repository
Fedora/yum Repo: http://locataire-serveur.info/sections/liens/fedora-core-yum


Avatar
Fabien LE LEZ
On 20 Feb 2006 18:45:22 GMT, MIMATA :

existe-t-il un site qui permet de tester nos
formulaires ?


Je vois déjà trois problèmes :


1- Le problème légal.

La justice ne semble pas faire de différence entre quelqu'un qui
cherche des failles pour envoyer du spam, et quelqu'un qui cherche des
failles pour aider l'auteur à les réparer.

Donc, faire un tel site risquerait de s'avérer dangereux.

En tout cas, ne compte pas sur moi pour prendre le risque.


2- La compétence de l'auteur du site.

Imaginons qu'un gars crée un tel site. Qu'est-ce qui me prouve qu'il
est plus compétent que moi, et saura repérer des failles que je
n'aurais pas vues ?


3- La faisabilité technique.

Pour la faille dont on parle ici, c'est relativement simple : il
suffit d'essayer de rentrer
": é.com", et voir si ça marche.

Mais en général, c'est plus dur.
Prenons par exemple l'URL :
http://machin.truc/bidule.php?page=schtroumpf

À quoi ce paramètre correspond-il ?

Je vois au moins trois possibilités :

a) Recherche dans un tableau PHP
$tableau= array ("schtroumpf" => "les données",
"gargamel" => "d'autres données");
Ici, il y a peu de risques : soit l'entrée existe, texto, dans le
tableau, et on accède à des données autorisées, soit elle n'existe
pas, et on n'accède à rien -- au pire, on affiche un message d'erreur.

b) Recherche dans une base SQL.
Ici, il y a plus de risques : on peut faire du "SQL injection", i.e.
essayer d'ajouter des commandes SQL.
Il y a des moyens d'empêcher ça (par exemple, vérifier que le
paramètre ne contient que des lettres), mais il me paraît difficile,
pour un outil automatique, de détecter qu'il y a une recherche dans
une base SQL, et d'identifier la valeur à donner pour créer un
problème détectable immédiatement.

c) Ouverture d'un fichier.
fopen ("../data/$page", "r");
Même type de risque (imagine ce qui se passe si $page vaut
../../../etc/passwd), et même type de solution (vérifier que le
paramètre ne contient que des lettres, ou autre jeu de caractères très
réduit), mais c'est difficile pour un outil automatique de détecter
qu'il y a ouverture d'un fichier, et de trouver le paramètre qui
"cassera" le script.

Variante : include ("$page.php");

Autre variante :
passthru ('grep "Hello world!" < ../data/$page.txt');

avec $page= "machin.txt;echo Achetez du Viagra|mail ;rem ";


Pour résumer, il faut au minimum lire le code pour détecter les
problèmes possibles.

Avatar
MIMATA
R12y wrote:
MIMATA :
R12y wrote:
Prenons l'exemple des mails par un formulaire web, il n'y a pas que
savoir lire un langage qu'il faut. Il faut aussi comprendre comment
fonctionne:
- les emails.
- le protocole HTTP
Mouais...moi, je veux juste qu'on me dise clairement "pour mettre

un champs qui ne soi pas une passoire dans ton formulaire, mets ce
code : ...
Et supposons que juste pour faire chier, je dise que tu dois plutot

en
mettre un autre (et que je justifie aussi mon choix), comment tu
décides?
Et ben j'écoute attentivement histoire de comprendre pourquoi tu fais

ça et je vois après.

Votre nom, Votre prénom, Votre mail, Votre site, Votre
commentaire...c'est des choses hyper banales non ?
Tu mélanges tout: la simplicité du principe, de mise en oeuvre,

de l'implémentation, des tests,...
Ce n'est pas _du tout_ parceque c'est facile à énoncer que c'est
facile à mettre en oeuvre. Et encore mois à tester.
Il est bien possible que je ne comprenne pas toute la difficulté de mettre


en oeuvre des tests standart "non destructeurs".

Ma demande originelle avait pour but de savoir comment tester mes
formulaires pas comment devenir ingéneur informatique.
Mais oui...

Ah, ouf. N'empêche, les RFC, c'est bien compliqué quand même non ?



Je suis le premier à dire aux mégas débutants
Euh... les méga débutants, tu en fais encore partie hein...

En PHP bien sûr, je suis hyper-mega débutant, je pensais au HTML et

aux CSS.

fait penser aux début de l'informatique quand les mecs disaient que
pour pouvoir s'en servir, il fallait apprendre le dos (et c'était
vrai) puis sont apparus les système d'exploitation...
Bon. On va dire que tu n'as rien dit.

OK...


Ce que je demande, c'est juste un moyen de tester mes scripts.
Et je t'ai répondu.

Moi j'ai plutot l'impression que tu recherchais une réponse qui te
plaisais. Mais ça n'engage que moi.
Tu as raison, J'attends qu'on me dise : ça existe, va voir là ou ça n'existe


pas, tu dois apprendre à faire tes tests toi même car c'est trop spécifique
à chaque script ; donc j'attends qu'on me dise oui ou non. Il doit y avoir
un truc qui m'échappe encore mais je vais bien finir par comprendre :-D .
J'en déduis qu'il n'existe pas de site qui propose ce genre de chose (je
parle des test non destructeurs simple à réaliser soi même)

Faut-il restreindre
l'utilisation du web aux seuls spécialistes ou donner les moyens à
tout
le monde de se protéger correctement et de prendre conscience des
faiblesses de leurs sites ?
Ce qu'il faut c'est arreter de faire croire au gens qu'on peut faire

des choses "sans se prendre la tête".
Le genre de slogans "créez vote site en quelques clics", "créez ceci
ou
cela sans rien y connaitre"... Ben ta mis le pied en plein dedans.
Ben
c'est faux.
Y'a une marge entre "rien n'y connaitre" et "tout connaitre". Et j'ai pas


mis les pieds dedans, je m'y colle et j'essaie de comprendre mais beaucoup
de choses arrivent en même temps et ça fait beaucoup à assimiler en trop peu
de temps et sans avoir le temps de mettre en pratique donc tout me parait
très théorique et j'ai du mal à comprendre les implications de certaines
affirmations d'où la fausse image que je renvoi.




Avatar
Vincent Bernat
OoO Pendant le repas du lundi 20 février 2006, vers 19:45, MIMATA
disait:

Mouais...moi, je veux juste qu'on me dise clairement "pour mettre un champs
qui ne soi pas une passoire dans ton formulaire, mets ce code : ... ; si tu
veux tester si ton champs est ok, mets ce code : ...". A la limite, si je
comprends pas bien pourquoi ça marche mais que ça marche, ça me va...dans un
premier temps, je comprendrai plus tard. C'est quand même pas un truc super
original que je demande, les champs de formulaire avec Votre nom, Votre
prénom, Votre mail, Votre site, Votre commentaire...c'est des choses hyper
banales non ?


Dans ce cas, ne traite pas directement toi-même tes formulaires en
PHP. Utilise un framework fait pour, il fera de la vérification de
type selon tes indications et t'évitera la plupart des attaques
décrites par Fabien dans un autre post à condition que tu précises
bien ce que tu attends dans chaque case du formulaire et que tu en
sois conscient. Si tu autorises un champs 'texte libre', il faudra
bien que tu fasses attention où tu l'utilises vu qu'aucune
vérification ne sera faite dessus.

Je ne connais malheureusement pas de framework pour les formulaires en
PHP, mais je pense qu'il en existe un certain nombre. Tu peux
peut-être redemander sur fr.comp.lang.php.
--
BOFH excuse #428:
Firmware update in the coffee machine

1 2 3