Schützen Innocent MySQL von SQL Injection
Verfasser:
Ashfaq Ansari

Bewertet von:
Wertung:
5
Auf Oktober 19, 2012
Zuletzt geändert:Januar 18, 2013

Zusammenfassung:

Detaillierte Anleitung, wie man MySQL Injektion in PHP verhindern. Sichere Codierung Regeln und Funktionen für SQL-Injection verhindern.

Einführung

 

Dies ist eine kurze Anleitung, wie Sie Ihr Unschuldigen zu schützen MySQL Datenbank SQL-Injection Angriffe.
 

Was ist SQL Injection?

 

Wie der Name andeutet, SQL Injection tritt auf, wenn der Benutzer spritzt SQL-Anweisungen in Ihre Anwendung.
 
Wie kommt es dazu?
 
Sagen wir, wir haben eine einfache Login-Formular, die einen Benutzernamen und Passwort erfolgt, und überprüft die Datenbank. Wenn der Benutzername und das Passwort wird validiert, der Benutzer am System angemeldet.
 

Der Code dafür könnte in etwa so aussehen:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// erhalten die Benutzer und das Passwort aus der POST-Anforderung
$user_name = $_POST[ 'Username' ];
$Kennwort  = $_POST[ 'Password' ];

$Abfrage = "SELECT vorname, last_name, account_number FROM WHERE username = users_table '$user_name'AND password ='$Kennwort' ";

$führen = mysql_query( $Abfrage );

// überprüfen, ob MySQL etwas gefunden, und erhalten den Rekord, wenn es gelungen
wenn ( mysql_num_rows( $führen ) > 0 ) {
    $Daten = mysql_fetch_assoc( $führen );
    echo 'Willkommen' . $Benutzer . '!';
    echo 'Ihre Kontonummer: ' . $Daten[ 'Account_number' ] . '';
} //Drucken Sie das errorr Nachricht
sonst {
    echo "Benutzername oder Passwort ungültig! Bitte versuchen Sie es erneut!';
}
?>

 

Das obige Skript funktioniert gut und es erlaubt die echten Benutzer ihre Benutzernamen und Passwort eingeben, um ihre Kontonummer sehen.
 

Nehmen wir an, ich geben “Demo” wie mein username, und “demopass” wie mein Passwort vergessen, dann die SQL-Abfrage, die der MySQL übergeben wird, wird wie folgt aussieht:
 

1
WÄHLEN first_name, last_name, account_number FROM users_table WHERE Benutzername = 'Demo' UND Kennwort = 'demopass' ;

 

Wenn unsere Eingabedaten wird erfolgreich in der Datenbank validiert, dann werden wir in das System eingeloggt sein und wir werden mit der Kontonummer anderes vorgestellt werden wir nicht bekommen, die Zugriff auf das System, und wir werden mit einer Fehlermeldung präsentiert werden “Benutzername oder Passwort ungültig! Bitte versuchen Sie es erneut!
 

Das Problem, wenn ein böswilliger Benutzer andere Zeichen, das bedeutete für die SQL-Anweisung beendet werden tritt.
 

Nehmen wir an, dass ein Benutzer als Benutzername versucht dem'o und Passwort demopass.
 

Jetzt, mal sehen, wie die SQL-Anweisung aussieht.
 

1
WÄHLEN first_name, last_name, account_number FROM users_table WHERE Benutzername = 'dem'die'AND password ='demopass' ;

 

Wenn MySQL die Anweisung ausführen, es wird nur behandeln “dem” als Benutzername und wenn er auf eine andere ‘die', dann behandelt ‘die‘ als SQL-Befehl, und es wird zu werfen und die Fehlermeldung, da sie nicht erkennt ‘die‘ als gültige SQL-Befehl.
 
ERROR 1064 (42000): Sie haben einen Fehler in der SQL-Syntax; lesen Sie das Handbuch zu Ihrem MySQL-Server-Version für den richtigen Syntax in der Nähe 'o verwenden’ und password =”demopass”; ” in Zeile 1
 

Ehrfürchtig. Die obige Fehlermeldung besagt, dass es einige Fehler in der SQL-Syntax. Wenn Magic Quotes wurden aktiviert, dann könnten wir nicht, dass die oben genannte Fehlermeldung bekommen haben.
 

Jetzt, mal sehen, was passiert, wenn der böswillige Benutzer gibt Benutzername als (‘ OR '1' = '1) und Passwort “demopass“.

Die SQL-Abfrage wird wie folgt aussehen:

1
WÄHLEN first_name, last_name, account_number FROM users_table WHERE Benutzername = '' OR '1 '='1 ' UND Kennwort = 'demopass' ;

 

Was bedeutet die oben SQL-Abfrage bedeuten? Es weist MySQL an, alle Zeilen mit einem Benutzernamen gleich finden “” (blank) oder (1= 1) und ein Passwort gleich “demopass“.
 

Lassen Sie stellen die obigen SQL-Abfrage mehr logisch zu verstehen, was ist eigentlich los mit der SQL-Anweisung:
 

username = “” OR “1= 1” UND password = “demopass”
 

Jetzt, Wir wissen bereits, dass 1 = 1 wird immer TRUE sein. Daher, der Benutzer in der Lage, sich am System anmelden, wenn das Passwort korrekt ist und der Benutzername ist falsch.
 

Wir analysieren mehr schlimmeres Szenario mit einem anderen Angriff String.
 

Angriff String: ‘ OR 1 = 1–
 

Bitte beachten Sie, dass ( und #) werden verwendet, um kündigen SQL-Anweisung. Lasst uns den Angriff String in einer SQL-Abfrage und sehen, wie die letzte SQL-Anweisung aussehen wird.
 

Jetzt, gehen wir davon aus, dass der Angreifer nicht einmal wissen, das Passwort.
 

1
WÄHLEN first_name, last_name, account_number FROM users_table WHERE Benutzername = '' OR 1=1--'AND password =' ​​idonotknow ' ;

 

Sehen Sie, wie die SQL-Anweisung, die von MySQL interpretiert.
 

username = “” OR 1 = 1– UND password = “idonotknow”
 

Bitte beachten Sie, in der obigen Aussage. Wie wir wissen, dass ist eine Aussage Terminator in SQL und 1= 1 ist immer TRUE, nach der Aussage Terminator Rest der SQL-Abfrage wird nicht ausgeführt.
 

Daher, Alle Datensätze in der Tabelle zurück und erhalten die Benutzer in das System eingeloggt sein. Angreifer in der Lage, die Kontonummer des ersten Datensatzes in der Datenbank zu sehen.
 

Lassen Sie uns helfen unschuldig MySQL
 

Magic Quotes

 

Magic Quotes ist ein umstrittenes Merkmal der Skriptsprache PHP, wobei Sonderzeichen mit einem Backslash, bevor sie weitergegeben prep-ended.
 

Magic Quotes wurden standardmäßig bei neuen Installationen von aktiviert PHP3 und PHP4, und da ihr Betrieb hinter den Kulissen und nicht sofort ersichtlich,, Entwickler können nicht über ihre Existenz und die möglichen Probleme, die sie einführen können.
 

Wir müssen auf dem Turn Magic Quotes in php.ini Datei im Web-Root der Website.
 

Wie Magic Quotes hilft?

 

Wir müssen diese Anführungszeichen zu entkommen ( sowohl einfache und doppelte Anführungszeichen, sowie Backslashes).
Dies geschieht, indem Sie einen Schrägstrich vor ihnen getan.
 

So usename = dem'o wird DEM 'o , und MySQL arbeiten kann mit diesem Anführungszeichen, wie es ist “geschützt” nach dem Schrägstrich.
 

Mal sehen, was passiert, wenn Magic Quotes eingeschaltet. Mal sehen, wie der Angreifer mit Magic Quotes ist betroffen.
 

1
WÄHLEN first_name, last_name, account_number FROM users_table WHERE Benutzername = '\' OR 1 = 1 - ' UND Kennwort = 'Idonotknow' ;

 

Das der Benutzername wird interpretiert als: \’ OR 1 = 1–

Das ist ein perfekt entgangen SQL-Abfrage, nichts kann injiziert bekommen. magic_quotes_gpc entweicht die gefährliche Apostroph für uns. Daher, wird der Angreifer nicht in der Lage, in das System einloggen.

Probleme mit Magic Quotes

 

Magic Quotes nur fügen Sie ein Backslash vor ein paar Zeichen, nichts mehr. Dies schützt uns vor SQL-Injektion nur in einigen besonderen Fällen wie oben, und nur durch Co-Inzidenz. Wenn wir display_errors ON, wir machten die Angreifer sehr zufrieden mit Ihrer Datenbank ausgegeben Details vor seinen Augen. Auch wenn Sie nicht, gibt es immer noch die Möglichkeit der blinde SQL-Injection und mit vorab SQL-Injection-Verfahren ist es möglich, zu umgehen magic_quotes_gpc Aufgabe.
 
So, wir brauchen einen Ausweg Daten, die nicht beschissen, ist nicht so anfällig für Zeichensatz Fragen, und ist nicht anfällig für Magie Zucht aufgeschlitzt Zitate.
 
In November 2005 die Kern-PHP-Entwickler beschlossen, wegen dieser Probleme, dass die magic quotes Merkmal würde aus PHP entfernt werden 6.
Sobald die Magic Quotes Funktionen entzogen, dann es geht um einige größere Probleme tauchten sein.
 

SQL Injection Mitigation
 

Es gibt eine Reihe von Möglichkeiten, um zu verhindern, MySQL Injektionen innerhalb PHP. Die häufigsten Arten sind durch Funktionen wie addslashes() und mysql_real_escape_string().
 

addslashes()

 

addslashes() wird eine Zeichenfolge mit einem Backslash vor Zeichen, die in Datenbankabfragen desinfiziert werden müssen zurückkehren. Diese Zeichen sind einfache Anführungszeichen (‘ = ’) Anführungszeichen (” = ”) und das Nullbyte (%00 = \0).
 

addslashes() wird nur funktionieren, wenn die Query-String in Anführungszeichen ist. Eine Zeichenfolge wie die folgende wäre immer noch anfällig für einen SQL-Injection:
 

1
2
3
$user_name = addslashes( $_POST[ 'Username' ] );
$Kennwort  = addslashes( $_POST[ 'Password' ] );
$Abfrage = "SELECT vorname, last_name, account_number FROM WHERE username = users_table '$user_name'AND password ='$Kennwort' ";

mysql_real_escape_string()

 

mysql_real_escape_string() ist ein wenig stärker als addslashes() wie es ruft MySQL die Bibliothek-Funktion mysql_real_escape_string, welche prepends Backslashes zu den folgenden Zeichen: \x00, \n, \r, \, ', ” und x1a.
 

Wie addslashes(), mysql_real_escape_string() wird nur funktionieren, wenn die Query-String in Anführungszeichen ist. Eine Zeichenfolge wie die folgende wäre immer noch anfällig für einen SQL-Injection:
 

1
2
3
$user_name = mysql_real_escape_string( $_POST[ 'Username' ] );
$Kennwort  = mysql_real_escape_string( $_POST[ 'Password' ] );
$Abfrage = "SELECT vorname, last_name, account_number FROM WHERE username = users_table '$user_name'AND password ='$Kennwort' ";

 

sprintf()

 

sprintf() können mit Wandlungs-Spezifikationen verwendet werden, um sicherzustellen, dass die dynamische Argument, wie es wohl zu behandeln ist behandelt. Zum Beispiel, wenn ein Anruf für die Benutzer-ID-Nummer waren in der Zeichenfolge, %s würde verwendet, um sicherzustellen, dass das Argument als String behandelt werden. Ein Beispiel hierfür ist wie folgt:
 

1
2
3
$user_name = $_POST[ 'Username' ];
$Kennwort  = $_POST[ 'Password' ];
$Abfrage = sprintf("SELECT vorname, last_name, account_number FROM WHERE username = users_table '%s'AND password ='%s' ", $user_name, $Kennwort);

 

htmlentities($war, ENT_QUOTES)

 

htmlentities() in Verbindung mit dem optionalen zweiten Parameter quote_style, ermöglicht die Verwendung von ENT_QUOTES, welche konvertiert sowohl doppelte und einfache Anführungszeichen. Dies wird in der gleichen Richtung wie arbeiten addslashes() und mysql_real_escape_string() in Bezug auf die Anführungszeichen, jedoch, statt Voranstellen eines Backslash, es wird die HTML-Entität der Anführungszeichen.
 

Neben der Verwendung von ENT_QUOTES innerhalb htmlentities(), Ein dritter Parameter können eingestellt werden, welche zwingt die Verwendung einer Zeichenfolge innerhalb Konvertierung eingestellt werden. Dies wird dazu beitragen zu stoppen unvorhergesehene resultiert aus der Verwendung multibyte Zeichen in Zeichensätze wie BIG5 und GPK.
 

Das Folgende ist ein Beispiel-Code, die helfen, verhindern würden SQL-Injection in PHP.
 

1
2
3
4
5
$user_name = $_POST[ 'Username' ];
$user_name = htmlentities( $user_name, ENT_QUOTES, 'UTF-8' );
$Kennwort  = $_POST[ 'Password' ];
$Kennwort  = htmlentities( $Kennwort, ENT_QUOTES, 'UTF-8' );
$Abfrage = "SELECT vorname, last_name, account_number FROM WHERE username = users_table '$user_name'AND password ='$Kennwort' ";

 

Optimize SQL-Code

 

Datenbank-Server sind komplexe Tiere und sie haben viel mehr Funktionen, als Sie brauchen. Was die Sicherheit angeht, mehr ist nie besser. Zum Beispiel, die Xp_cmdshell erweiterte gespeicherte Prozedur in MS SQL ermöglicht den Zugriff auf die Schale und das ist genau das, was ein Hacker Träume. Dies ist, warum Sie dieses Verfahren und andere Funktionen sollten deaktiviert, die leicht missbraucht werden. Einfach entfernen oder zumindest deaktivieren Sie alle Funktionen, die Sie tun können, ohne.
 

Deaktivieren Standard SQL Fehlermeldung

 

Fehlermeldungen sind nützlich, um einem Angreifer, weil sie zusätzliche Informationen über die Datenbank und SQL-Abfragen geben. Und alle SQL-Angriffe sind in der Regel von der Art des Fehlers durch SQL herausgegebenen, es bedeutet, dass Art von Fehler entscheidet über die Hacker-Ansatz für das Hacken der Website oder Anwendung. Eine bessere Lösung, die Sicherheit nicht beeinträchtigt wäre, um eine Anzeige generische Fehlermeldung das besagt einfach ein Fehler aufgetreten.
 

Store-Datenbank Anmeldeinformationen sicher

 

Um den Schaden bei einem SQL-Injection-Angriff, immer speichern Anmeldeinformationen für die Datenbank in einem separaten verschlüsselten Datei. Nun, auch wenn ein Hacker schafft es in brechen, er oder sie wird nicht viel nützen, da er nicht viel tun können, in Ihrer Datenbank.
 

Verwenden Least Privilege Prinzip

 

Das Prinzip der geringsten Rechte ist sehr nützlich, und es gilt für SQL-Injektionen ebenso. Denken Sie immer zweimal oder überprüfen Sie über das, was Privilegien Sie sind bestrebt, Benutzer oder Objekt. Angenommen, Sie wan Moderator Zugriff auf einige Benutzer bereitzustellen, so nur geben ihm den Zugang jener Tabellen, die er / sie braucht, anstatt erweist ihm den Zugang der gesamten Datenbank. Wenn Sie Zugang zu einem System bieten, ist es besser, partitionierte Tabelle erstellen Räume in Datenbank und den Zugriff nur für bestimmte Tabellenbereich. Diese Technik drastisch reduzieren die Angriffsfläche.
 

Deaktivieren Shells

 

Viele Datenbanken bieten Shell-Zugang auf die Datenbank, die im Wesentlichen ist, was ein Angreifer oder Hacker Bedürfnisse. Aus diesem Grund müssen Sie diesen offenen Schlupfloch schließen. Jeder Dienstleister hat verschiedene Verfahren zur deaktivieren Sie die Ausführung von Muscheln auf ihrer Datenbank. Also fragen Sie Ihren Datenbank-Dokumentation über das Shell-Zugriff für Ihre Datenbank oder Tabellenbereich oder bestimmte Tabelle deaktivieren.
 

Verwenden Sie SQL Injection Werkzeuge, um Schwachstellen zu prüfen

 

Last but not least, denken wie Hacker. Wie kann ein Hacker meine Datenbank durch hacken SQL-Injection, welche Werkzeuge und Techniken, die er verwenden kann, um die Lücken zu finden. Sie sollten immer einen Probelauf von SQL-Injection Hack Tools wie SQLi, Haviz, SQL injectme usw.. Mehr, wenn Sie Netzhaut Vulnerability Scanner dann leisten die zu gut. Wie es aus allen neuesten Schwachstellen ausgesetzt.

Vielen Dank. Ich hoffe, Sie alle müssen genossen haben. Bitte geben Kommentare so, dass wir mehr tun können, besser.

 
 

28,920 Ansichten, 19 von heute

Die folgenden zwei Registerkarten wechseln Gehalt unter.

Ashfaq Ansari

Sicherheit Researcher
Ashfaq Ansari ist der Gründer von HackSys Teams Codenamen "Panthera". Er ist ein Sicherheitsexperte mit Erfahrung in verschiedenen Aspekten der Informationssicherheit. Er ist Autor "HackSys Extreme Vulnerable Treiber" und "Shellcode of Death". Er hat auch geschrieben und veröffentlicht verschiedene Whitepapers auf niedrigem Niveau Software Ausbeutung. Seine Kern Interesse liegt in "Low Level Exploitation", "Reverse Engineering", "Program Analysis" und "Hybrid Fuzzing". Er ist ein fanboy der Künstlichen Intelligenz und maschinelles Lernen. Er ist das Kapitel für Blei null Pune.

Einen Kommentar schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *