Hacking: Beispiel für SQL-Injection in ein C ++ Programm

Code-Injektion tritt auf, wenn der Benutzer Ihre C ++ Programm verlockt irgendein Stück vom Benutzer erstellten Code auszuführen. # 147-Was? Mein Programm würde das nie tun! # 148- Sie sagen. Betrachten wir die am weitesten verbreitete und, zum Glück, einfachste Variante dieser kleinen Betrug zu verstehen: SQL-Injection.

Hier sind ein paar Fakten über SQL:

  • SQL (Oft ausgesprochen # 147-Fortsetzung # 148-) steht für Structured Query Language.

  • SQL ist die häufigste Sprache Datenbanken für den Zugriff.

  • SQL ist fast überall in den Zugriff auf relationale Datenbanken.

Wenn Sie # 8242-t bereits wissen, SQL, es # 8242-s genügt zu sagen, don, dass SQL oft zur Laufzeit interpretiert wird. Sehr oft, C ++ Anweisungen wird eine SQL-Abfrage an einen separaten Datenbankserver und dann zu verarbeiten und anzuzeigen, was auch immer der Server zurück sendet senden. Eine typische SQL-Abfrage in einem C ++ Programm könnte wie folgt aussehen:

char * query = "SELECT * FROM Transaktionen, bei denen accountID = # 8242-123456789 # 8242 -" Ergebnisse = einreichen (Abfrage) -

Dieser Code sagt, # 147-WÄHLEN alle Felder VON die Transaktionen Tabelle WOHER das Account ID (Vermutlich eines der Felder in der Transaktionstabelle) gleich 123456789 (der Benutzer # 8242-Konto-ID). # 148- Die einreichen() Library-Funktion kann diese Abfrage aus, um den Datenbankserver senden.

Der Datenbankserver würde mit all den Daten, die es auf jede Transaktion hat, dass der Benutzer immer auf dieses Konto vorgenommen hat, die in der Sammlung gespeichert bekommen würde Ergebnisse. Das Programm würde dann durchlaufen Ergebnisse, wahrscheinlich die Anzeige der Transaktionen in einer Tabelle mit jeder Transaktion auf einer separaten Zeile.

Der Benutzer wahrscheinlich doesn # 8242-t müssen, dass viele Daten. Vielleicht nur diese Transaktionen zwischen Anfangsdatum und Enddatum, zwei Variablen, die das Programm von der Abfrageseite Benutzer # 8242-s liest. Dieses selektiver C ++ Programm könnte eine Erklärung wie die folgende enthalten:

char * query = "SELECT * FROM Transaktionen, bei denen accountID = # 8242-123456789 # 8242-" "und das Datum> # 8242- "+ + startdate" # 8242- und Datum lt; # 8242- "+ endDate +" # 8242 - "-

Wenn der Benutzer eingibt 2013.10.01 für ein Anfangsdatum und 2013.11.01 für Enddatum, dann wird die resultierende Abfrage, die an die Datenbank gesendet wird ist die folgende:

SELECT * FROM Transaktionen, bei denen accountID = # 8.242-123.456.789 # 8242- ANDdate> # 8242-2013 / 10/1 # 8242- und Datum lt; # 8242-2013 / 11/1 # 8242--

Mit anderen Worten, zeigen alle Transaktionen im Monat Oktober 2013, das Sinn macht. Was # 8242-s das Problem?

Das Problem entsteht, wenn das Programm nur akzeptiert, was der Benutzer gibt als Start- und Enddaten und Stecker sie in die Abfrage. Es spielt keine # 8242-t tun jede Überprüfung, um sicherzustellen, dass der Benutzer aber ein Datum nur ein Datum und nichts eintritt. Dieses Programm ist viel zu vertrauensvoll.

Was passiert, wenn ein Hacker zu betreten waren 2013.10.01 für die Anfangsdatum, aber für die Enddatum er war so etwas wie zu betreten 2013.11.01# 8242- OR accountID = # 8242-234567890. (Beachten Sie die unausgewogene einfachen Anführungszeichen.) Nun ist die kombinierte SQL-Abfrage, die auf dem Datenbankserver gesendet wird aussehen würde,

SELECT * FROM Transaktionen, bei denen accountID = # 8.242-123.456.789 # 8242- ANDdate> # 8242-2013 / 10/1 # 8242- und Datum lt; # 8242-2013 / 11/1 # 8242- ORaccountID = # 8.242-234.567.890 # 8242--

Das sagt, # 147-Zeige mir alle Transaktionen für das Konto 123456789 für den Monat Oktober 2013 sowie alle Transaktionen für ein anderes Konto 234567890, die ich # 8242-t selbst für ein beliebiges Datum don # 148.

Dieses kleine Beispiel kann ein paar Fragen aufwerfen: ? # 147-Wie hat der Hacker wissen, dass er SQL-Anweisungen anstelle von Daten eingeben könnte # 148- Er doesn # 8242-t Know - er versucht, nur falsche SQL in jedes Feld eingeben, das Zeichen Text akzeptiert und sieht, was passiert. Wenn das Programm beschwert, # 147-das # 8242-s kein zulässiges Datum, # 148- dann weiß der Hacker, dass überprüft das Programm, um sicherzustellen, dass die Eingabe Daten gültig sind und SQL-Injection gewonnen # 8242-t Arbeit hier.

Wenn auf der anderen Seite zeigt das Programm eine Fehlermeldung wie Illegale SQL-Anweisung, dann weiß der Hacker, dass das Programm die falsche Eingabe akzeptiert und versendet es an den Datenbankserver aus, die sie dann trat zurück. Erfolg! Jetzt alles, was er zu tun hat, ist die Abfrage richtig zu formulieren.

Wie wusste der Hacker, dass die Konto-ID genannt wurde Account ID? Er didn # 8242-t, dass entweder wissen, aber wie lange es dauern würde, dass man zu erraten? Hacker sind sehr hartnäckig.

Und schließlich, wie wusste der Hacker, dass 234567890 war eine gültige Kontonummer? Auch er didn # 8242-t - aber glauben Sie wirklich, dass der Hacker # 8242-s dort zu stoppen gehen? Mist nein. Er # 8242-los ist jede Kombination von Ziffern zu versuchen, er denken kann, bis er mit wirklich großen Salden ein paar wirklich große Konten findet, die vom Diebstahl wert sind.

Denken Sie daran, drei Dinge:

  • SQL-Injection war sehr häufig vor Jahren.

  • Es war nur so einfach.

  • Mit einer besseren Kenntnis der SQL und einige wirklich gefoltert Syntax kann ein guter Hacker tun fast alles, was er mit einer SQL-Injektion wie dies wünscht.

Menü