Site entiérement piraté

as2
Eléphant du PHP | 132 Messages

08 août 2014, 15:01

Bonjour,
Mon site internet chez free qui utilise PHP + MySql a été piraté et entiérement effacé.
Seuls les dossiers et sous-dossiers ont été laissés, mais vides.
Toutes les tables Mysql ont été effacées.
Celà c'est passé il y a deux semaines, et je me rappelais plus que j'avais un compte sur ce forum.
Je vous fait donc un rapport qu'aujourd'hui.
J'ai changé mes mots de passes FTP et PhpMyAdmin free.
J'ai protégé le dossier qui contient l'accés à la bdd genre /admin/code.php
J'ai mis un .htaccess à la base du site qui protége le /admin/
J'ai remis entiérement le site en ligne ainsi que les bases de données.
Et il remarche ainsi, mais ...

... jusqu'à quand ?

Nul doute que le pirate va facilement contourné mon htaccess


J'ai pas envie de retaper les dizaines de pages php qui contiennent des liens genre machin.php?index=1
Qui sont sans doute des failles de sécurité j'en convient.

Enfin qu'en pensez vous ?

ViPHP
ViPHP | 1996 Messages

08 août 2014, 19:44

As-t-il effacer les logs de connexions ? Sais-tu par où ils est passé ? Avais-tu des formulaires et/ou une page Admin ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

as2
Eléphant du PHP | 132 Messages

09 août 2014, 00:18

As-t-il effacer les logs de connexions ?

non
Sais-tu par où ils est passé ?

non
Avais-tu des formulaires et/ou une page Admin ?
Oui, il y a une page contact avec un formulaire.
Oui il y a une page admin avec les mots de passe de connexion à la base.
Elle est dans un dossier que j'ai protégé par htaccess

ViPHP
ViPHP | 1996 Messages

09 août 2014, 09:30

S'il n'a pas effacer les logs de connexion, tu peux en les lisant savoir où (à peu près) se situe l'attaque.
Généralement, les attaques viennent à partir des formulaires non protégés (ou mal protégé) avec des attaques par injection sql ou mauvaise requête ou mot de passe trop simple (<8 caractères).

De ce fait, créé toi un générateur de mot de passe avec un minimum de 8 caractères tout clavier.
Ensuite stocke les mots de passes sur la base de données "hashé" en SHA256 (MD5 n'est plus considéré comme fiable) en utilisant, en plus, la méthode du grain de sable.
Lorsque tu interrogeras la base de données, tu cherchera d'abord le mot de passe en fonction de l’identifiant entré par le visiteur puis tu le vérifieras. Tu le vérifieras pas en même temps :
//sous mysqli car mysql est devenu obsolète

//connexion sous mysqli non affiché
$requete = "SELECT motDePasse FROM utilisateurs WHERE login='".$_POST["login"]." LIMIT 1'";
$mysqli->real_escape_string($requete); //protection contre les injections sql
if (!$resultat = $mysqli->query($requete)) {
  //erreur dans requete on arrête le processus
  $resultat->close();
} else {
  if ($resultat->num_rows == 0) {
    //erreur l'identifiant n'est pas reconnu, on arrête le processus
    $resultat->close();
  } else {
   $row= $resultat -> fetch_row();
      if ($row[0] != sha256($_POST["motDePasse"])) {
        //erreur pas bon de passe
      }
  }
Ici je n’utilises pas la méthode du grain de sable. Il s'agit d'une méthode qui alterne certains caractères à des positions bien précises (ou aléatoire mais plus compliqué à mettre en œuvre) ou un rajout de caractères. Si les mots de passe se font dérober, ils seront quasi-inutilisables car "hashés" en sha256 et "mélangés" via ta propre méthode.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

as2
Eléphant du PHP | 132 Messages

09 août 2014, 15:17

Merci d'avoir répondu, mais je m'apperçois que j'aurais du me connecter sur PHP Débutant, car là franchement je comprends pas ce que tu racontes (mais on est d'accord que c'est moi qui suis nul bien sûr).

Je me demandes si on c'est pas mal compris dés le début, et c'est sans doute moi qui me suis mal exprimé.

J'utilises pas les bases de donnés pour le "public", mon site ne contient pas de bases de données utilisateurs, personne ne se connecte au site avec un login + mot de passe...

Non, j'utilises les bases de données pour afficher mes pages dynamiquement, le contenu des bases s'affiche sous forme de fiches selon les requètes des utilisateurs (n'importe qui en fait).
Donc dans un sens c'est pas grave que le site ait été piraté, car j'ai une copie de tout, mais c'est grave dans le sens où j'ai mis deux jours à tout remmetre en place.

Pour parler simplement je veux juste que le pirate n'efface plus mon site. Donc , mais encore une fois je suis pas un expert, simplement proteger le fichier pass.php qui contient le fameux

$serveur="sql.orange.fr";
$login="moi";
$pass="zSeJuIù$14";
$base="monsite";

qui est appelé dans tous mes programmes de la sorte :

require("administration/pass.php");
mysql_connect($serveur,$login,$pass);
mysql_select_db("$base");

Autre chose :

Si çà peut vous aider je vous donne les 3 fichiers que le pirate a mis à la racine du site pour le vider, car c'est plus que du chinois pour moi.

Mammouth du PHP | 2278 Messages

09 août 2014, 17:02

si mes souvenirs sont bons le répertoire en question peut être caché (explications à venir si besoin)
Il serait bon de lui donner un nom tout à fait anodin ou imprévisible de même au fichier.

quant à ça:
$serveur="sql.orange.fr";
$login="moi";
$pass="zSeJuIù$14";
$base="monsite";
ça ouvre tout:
login devrait être plus long, pas prévisible (ni root, ni admin, ni chef...)
$pass est évidemment lisible par toute personne qui a accès au fichier.

Tu peux mettre ton fichier passes.php ailleurs que dans l'arborescence WEB
Si tu préfères, dans mon cas j'ai le WEB en /var/www/html/ et j'ai mis passes.php en /home/bilou/
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 août 2014, 00:58

salut,

pour être plus plus complet il ne faut pas utiliser de répetoire admin, administration etc car trop simple a trouver.
un répertoire avec un nom moins simple est une bonne idée.

ensuite il faut vraiment vérifier TOUTES les données que tu utilise dans les requêtes SQL et qui te sont fournit par l'utilisateur.

en clair
<?php
mysql_query('delete from matable where id='.$_GET['id']);
?>
est une faille de sécurité (type injection sql) car l'on peux faire ce que l'on veux de la requête, comme notamment la mettre en erreur afin d'avoir plus d'info (genre connexion etc.).
=> utilise mysql_real_escape_string

ensuite si tu as un formulaire d'upload il est possible que cela soit la source du problème (upload de fichier non / mal contrôlé sur le serveur et c'est finis).
il est aussi possible qu'il y ai eu un brute force sur ton compte ftp ....

il y a beaucoup de possibilité pour arriver a cela sans plus d'info on ne peux que te donner de vague information.

donc le changement de mot pour des mot de passe "fort" c'est la première chose à faire, ensuite déplacer l'administration).

@+
Il en faut peu pour être heureux ......

as2
Eléphant du PHP | 132 Messages

10 août 2014, 13:16

Ok, j'ai mis le dossier admin ailleurs (je dirai pas où :) ) et je l'ai nommé genre mp3 donc rien à voir.
Et j'ai rallongé mon nom d'amin et mon pass.

Oui, le site a été brute-forcer d'aprés ce qu'on m'a dit, et j'ai gardé les fichiers du pirate :
index.php
pas.php
shell.py