32 votes

Quelqu'un a piraté ma base de données - comment ce gars l'a-t-il fait?

Quelqu'un a piraté ma base de données et a supprimé la table.

Dans ma page PHP, il y a une seule requête pour laquelle j'utilise mysql_real_escape_string:

 $db_host="sql2.netsons.com";
$db_name="xxx";
$username="xxx";
$password="xxx";    

$db_con=mysql_connect($db_host,$username,$password);    

$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);    
mysql_set_charset('utf8',$db_con); 

$email= mysql_real_escape_string($_POST['email']);
$name= mysql_real_escape_string($_POST['name']);
$sex= mysql_real_escape_string($_POST['sex']);    

if($_POST['M']!=""){  $sim = 1;  }else {  $sim = 0;   }

$query = "INSERT INTO `users` (`email`, `name`, `sex`, `M`) VALUES
( '".$email."', '".ucwords(strtolower($name))."', '".$sex."','".$sim."')";    

$res = mysql_query($query) or die("Query fail: " . mysql_error() );

mysql_close($db_con);
 

Et register_globals est désactivé .

Alors, comment ce gars a piraté ma base de données?

67voto

ajreal Points 31456

mysql_real_escape_string

La connexion MySQL. Si l'identificateur de lien n'est pas spécifié, le dernier maillon ouvert par mysql_connect() qui est utilisé. Si aucun lien n'est trouvé, il va essayer d'en créer un, comme si mysql_connect() a été appelée sans arguments. Si aucune connexion n'est trouvé ou créé, une alerte de niveau E_WARNING est généré.

Comme l'explique ici : Ne mysql_real_escape_string() ENTIÈREMENT protéger contre les injections SQL?

Basé sur votre extrait de code, vous avez connecté la base de données deux fois.

$db_con=mysql_connect($db_host,$username,$password);    

$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);    
mysql_set_charset('utf8',$db_con); 

Et vous n'avez pas d'alimentation de la base de données identificateur de lien pour :

$email= mysql_real_escape_string($_POST['email']);
$name= mysql_real_escape_string($_POST['name']);
$sex= mysql_real_escape_string($_POST['sex']); 

Par conséquent, mysql_set_charset n'a pas d'effet de réel échapper fournis$_POST pour le multi-octets caractères.

Suggestion

  • supprimer le deuxième mysql_connect($db_host,$username,$password);
  • ajouter explicitement $db_con lors mysql_real_escape_string

6voto

Paul Dixon Points 122033

Il ne semble pas que le code que vous avez collé constitue une attaque appropriée. Pour ce faire, j'analyserais les journaux binaires de MySQL avec l'instruction DROP TABLE appropriée, afin de me donner un horodatage. Vous pouvez ensuite utiliser cet horodatage pour rechercher les demandes Apache avec lesquelles vous pouvez être en corrélation.

Ensuite, il suffit de vérifier soigneusement le code de chaque demande de candidat jusqu'à ce que vous le cliquiez :(

4voto

atmorell Points 1142

Vous avez peut-être un utilisateur MySQL avec un mot de passe faible. Je voudrais changer tous les mots de passe et vérifier qui est autorisé à se connecter à la base de données MySQL. Verrouillez votre pare-feu afin que seuls les ports nécessaires soient ouverts (80 443?)

Voici quelques articles sur le verrouillage de votre code php http://www.addedbytes.com/writing-secure-php/

Meilleures salutations. Asbjørn Morell

2voto

cyber-guard Points 1179

Le fait que votre base de données ait été compromise ne signifie pas qu'il y a eu une injection SQL. Si vous le souhaitez, vous pouvez partager le journal d'accès, ce qui devrait fournir suffisamment d'indices indiquant où l'attaquant est entré. Mon hypothèse serait l'inclusion de fichier local, où il incluait le fichier de configuration, ou peut-être une sorte de vulnérabilité d'exécution de code. Sans plus d’informations, c’est deviner, c’était aussi bien un travail d’ingénierie sociale, ou une attaque de phishing ...

1voto

dartacus Points 346

À première vue, vous n'avez laissé aucune ouverture pour une attaque par injection SQL. Cet extrait de code est-il bien celui dans lequel l'intrusion se produit?

La seule chose que je peux révéler est cette annonce ambiguë d'un fournisseur d'hébergement sur ucwords: http://2by2host.com/articles/php-errors-faq/disabled_ucwords/

g

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X