Jemand hat meine Datenbank gehackt – wie?

Lesezeit: 5 Minuten

Benutzer-Avatar
xRobot

Jemand hat meine Datenbank gehackt und die Tabelle gelöscht.

Auf meiner PHP-Seite gibt es eine einzige Abfrage, bei der ich mysql_real_escape_string verwende:

$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);

Und register_globals ist deaktiviert.

Also, wie wurde meine Datenbank gehackt?

  • stackoverflow.com/questions/1220182

    – Haim Jewgi

    22. November 2010 um 8:45 Uhr

  • Welchen Zeichensatz verwendet Ihre Verbindung?

    – CDhowie

    22. November 2010 um 8:45 Uhr

  • Werfen Sie einen Blick auf PDO und die vorbereiteten Anweisungen. Es würde Ihnen viel Zeit und Kopfschmerzen ersparen.

    – jwueller

    22. November 2010 um 8:50 Uhr

  • Warum benutzt du mysql_select_db() zweimal?

    – jwueller

    22. November 2010 um 9:02 Uhr

  • Warum verwendet heutzutage irgendjemand hirntote, dynamisch generierte Zeichenfolgen für SQL? (Die tatsächlich gültigen Anwendungsfälle sind sehr weit und dazwischen.)

    Benutzer166390

    23. November 2010 um 5:01 Uhr


Benutzer-Avatar
ajreal

mysql_real_escape_string

Die MySQL-Verbindung. Wenn die Link-ID nicht angegeben wird, wird der letzte von mysql_connect() geöffnete Link angenommen. Wenn kein solcher Link gefunden wird, wird versucht, einen zu erstellen, als ob mysql_connect() ohne Argumente aufgerufen worden wäre. Wenn keine Verbindung gefunden oder hergestellt wird, wird ein Fehler der Stufe E_WARNING generiert.

Wie hier erklärt: Schützt mysql_real_escape_string() VOLLSTÄNDIG vor SQL-Injection?

Basierend auf Ihrem Code-Snippet haben Sie die Datenbank zweimal verbunden.

$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); 

Und Sie haben die Datenbank-Link-ID nicht angegeben für:

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

Daher hat mysql_set_charset keine Auswirkung auf das bereitgestellte echte Escape$_POST für Multibyte-Zeichen.

Anregung

  • den zweiten entfernen mysql_connect($db_host,$username,$password);
  • explizit hinzufügen $db_con beim tun mysql_real_escape_string

  • typ sehr gut erklärt. +1 für Ihre gute Erklärung und Links

    – Awais Qarni

    11. August 2011 um 13:05 Uhr

  • Update Oktober 2013: mysql_real_escape_string ist veraltet. Verwenden Sie mysqli_real_escape_string() oder PDO::quote()

    – Pablofiumara

    20. Oktober 2013 um 12:17 Uhr

  • Eine Anmerkung für die möglichen Leser. Diese “Antwort” erklärt nicht, wie die Datenbank gehackt wurde. Denn für den im OP bereitgestellten Code ist es unmöglich, etwas einzuschleusen. Keine der im verlinkten Beitrag erwähnten Kodierungen wird verwendet, und daher wird standardmäßig latin1 verwendet, was bedeutet, dass dieser Code unverwundbar ist.

    – Ihr gesunder Menschenverstand

    13. September 2016 um 9:02 Uhr

Es sieht nicht so aus, als ob der von Ihnen eingefügte Code einen geeigneten Angriff bietet. Ich würde dies untersuchen, indem ich die MySQL-Binärprotokolle nach der relevanten DROP TABLE-Anweisung scanne, um mir einen Zeitstempel zu geben. Dann können Sie diesen Zeitstempel verwenden, um nach Apache-Anforderungen zu suchen, die Sie damit korrelieren können.

Dann geht es nur noch darum, den Code in jeder Kandidatenanfrage sorgfältig zu prüfen, bis Sie es geschafft haben 🙁

Vielleicht haben Sie einen MySQL-Benutzer mit einem schwachen Passwort. Ich würde alle Passwörter ändern und prüfen, wer berechtigt ist, sich mit der MySQL-Datenbank zu verbinden. Sperren Sie Ihre Firewall, sodass nur benötigte Ports geöffnet werden (80.443?)

Hier sind einige Artikel über das Sperren Ihres PHP-Codes
http://www.addedbytes.com/writing-secure-php/

Mit freundlichen Grüßen. Asbjörn Morell

  • Heutzutage ist der Fernzugriff auf MySQL standardmäßig deaktiviert und wird normalerweise auch auf die weiße Liste gesetzt, es sei denn, Sie haben einen beschissenen Host.

    – Cyber-Wache

    22. November 2010 um 10:18 Uhr

  • remote access to MySQL is disabled by default – kann dies begründen? oder weitere Informationen dazu geben?

    – ajreal

    22. November 2010 um 10:20 Uhr

  • Wenn Sie den MySQL-Server installieren, wird der Fernzugriff, dh die Anmeldung von einem anderen Computer als dem Server, auf dem der MySQL-Daemon läuft, deaktiviert; das bedeutet, dass Sie es explizit zulassen müssen. Selbst wenn eine Person einen MySQL-Benutzernamen/ein Kennwort hat, kann sie diese nicht nutzen und sich anmelden, es sei denn, sie kann Code auf dem Remote-Computer ausführen. In diesem Fall ist die Sicherheit des gesamten Servers sowieso vollständig gefährdet … Wiederverwendete Passwörter für MySQL, FTP und SSH sind ein völlig anderes, wenn auch sehr bevorstehendes Problem, aber es hat nichts mit der Sicherheit von MySQL selbst zu tun.

    – Cyber-Wache

    22. November 2010 um 10:55 Uhr

  • Dies gilt zumindest für die Linux-Box NICHT, sondern wird stattdessen durch Berechtigungen gesteuert.

    – ajreal

    22. November 2010 um 12:15 Uhr

Die Tatsache, dass Ihre Datenbank kompromittiert wurde, bedeutet nicht, dass es eine SQL-Injektion gab. Wenn Sie möchten, können Sie das Zugriffsprotokoll freigeben, das genügend Hinweise darauf geben sollte, wo der Angreifer eingedrungen ist. Meine Vermutung wäre die lokale Dateieinbindung, wo er die Konfigurationsdatei eingebunden hat, oder vielleicht eine Art Schwachstelle bei der Codeausführung. Ohne weitere Informationen ist es jedoch nur eine Vermutung, es könnte genauso gut ein guter Social-Engineering-Job oder ein Phishing-Angriff gewesen sein …

Auf den ersten Blick haben Sie keine Öffnungen für einen SQL-Injection-Angriff gelassen. Ist dieser Codeauszug definitiv derjenige, in dem das Eindringen stattfindet?

Das einzige, was ich finden kann, ist diese mehrdeutige Ankündigung eines Hosting-Providers zu ucwords: http://2by2host.com/articles/php-errors-faq/disabled_ucwords/

G

Benutzer-Avatar
Alireza

Ich denke, dies geschieht über die PHP-Shell (Hintertür). Ist das ein Sharing-Host? Überprüfen Sie in diesem Fall, ob andere Websites auf demselben Server ebenfalls angegriffen werden oder nicht. Auf diese Weise können Sie feststellen, ob der Angreifer aus Ihrer Nachbarschaft auf Ihre Website gelangt. Um Websites auf Ihrem Server anzuzeigen, benötigen Sie einen umgekehrten IP-Scan.

1179180cookie-checkJemand hat meine Datenbank gehackt – wie?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy