Erklärung der speziellen SQL-Injektion

8

Beim Durchstöbern der dubioseren Teile des Internets bin ich zufällig auf diese spezielle SQL-Injektion gestoßen:

http://server/path/page.php?id=1+union+select+0,1,concat_ws(user(),0x3a,database(),0x3a,version()),3,4,5,6--

Meine SQL-Kenntnisse - die ich für halbwegs gut hielt - scheinen sehr einschränkend zu sein, wenn ich das hier lese.

Da ich mich ausgiebig für das Web entwickle, war ich neugierig zu sehen, was dieser Code tatsächlich macht und noch wichtiger wie er funktioniert.

    
Russell Dias 28.10.2010, 12:19
quelle

4 Antworten

8

Ersetzt eine falsch geschriebene parametrisierte Abfrage wie folgt:

%Vor%

mit dieser Abfrage:

%Vor%

, die Informationen über den Datenbanknamen, die Version und den verbundenen Benutzernamen enthält.

    
Quassnoi 28.10.2010, 12:25
quelle
4

Das Injektionsergebnis hängt von einigen Annahmen über die zugrundeliegende Abfragesyntax ab.

Was hier angenommen wird, ist, dass es irgendwo im Code eine Abfrage gibt, die den Parameter "id" annimmt und ihn direkt in die Abfrage einfügt, ohne sich darum zu kümmern, sie zu bereinigen.

Es wird eine naive Abfragesyntax von etwa wie folgt angenommen:

%Vor%

Was dies bewirkt, führt zu einer substituierten Abfrage (in Ihrem obigen Beispiel) von:

%Vor%

Nun, was das nützlich ist, ist, dass es nicht nur den Datensatz, an dem das Programm interessiert war, sondern auch UNIONs mit einem gefälschten Dataset, das dem Angreifer mitteilt (diese Werte erscheinen getrennt durch Doppelpunkte im dritte Spalte):

  • der Benutzername mit dem wir sind Verbunden mit der Datenbank
  • Der Name der Datenbank
  • die Version der db-Software

Sie können dieselben Informationen erhalten, indem Sie einfach Folgendes ausführen:

%Vor%

Direkt an einer SQL-Eingabeaufforderung, und Sie erhalten etwas wie:

%Vor%

Zusätzlich, da UNION eine implizite Sortierung durchführt und die erste Spalte in dem falschen Datensatz mit einer 0 beginnt, sind die Chancen ziemlich gut, dass Ihr falsches Ergebnis ganz oben in der Liste steht. Dies ist wichtig, weil das Programm wahrscheinlich nur das erste Ergebnis verwendet, oder es gibt ein zusätzliches bisschen SQL in dem grundlegenden Ausdruck, den ich Ihnen oben gegeben habe, der die Ergebnismenge auf einen Datensatz begrenzt.

Der Grund für das obige Rauschen (zB die Auswahl 0, 1, ... usw.) ist, dass die Anweisung, mit der Sie die UNION aufrufen, die gleiche Anzahl von Spalten haben muss wie die erster Ergebnissatz Folglich funktioniert der obige Injektionsangriff nur, wenn die entsprechende Aufzeichnungstabelle 7 Spalten aufweist. Andernfalls erhalten Sie einen Syntaxfehler und dieser Angriff wird Ihnen nicht wirklich geben, was Sie wollen. Die Doppelstriche (-) dienen lediglich dazu, sicherzustellen, dass alles, was später in der Ersetzung passieren könnte, ignoriert wird, und ich bekomme die gewünschten Ergebnisse. Der 0x3a Müll sagt nur "Trennen Sie meine Werte durch Doppelpunkte".

Nun, was diese Abfrage als Angriffsvektor nützlich macht, ist, dass sie leicht von Hand neu geschrieben werden kann, wenn die Tabelle mehr oder weniger als 7 Spalten hat.

Wenn zum Beispiel die obige Abfrage nicht funktioniert und die fragliche Tabelle 5 Spalten hat, würde ich nach einigen Experimenten die folgende Abfrage-URL verwenden, um sie als einen Injektionsvektor zu verwenden:

%Vor%

Die Anzahl der Spalten, die der Angreifer vermutet, basiert wahrscheinlich auf einem fundierten Blick auf die Seite. Zum Beispiel, wenn Sie auf eine Seite mit allen Doodads in einem Geschäft schauen, und es sieht so aus:

%Vor%

Es ist eine ziemlich gute Schätzung, dass die Tabelle, die Sie betrachten, 4 Spalten hat (denken Sie daran, dass es höchstwahrscheinlich einen Primärschlüssel gibt, der sich irgendwo versteckt, wenn wir nach einem 'id' -Parameter suchen).

Entschuldigung für die Textwand, aber hoffentlich beantwortet das Ihre Frage.

    
TreyE 28.10.2010 12:46
quelle
1

Dieser Code fügt der Select-Anweisung, die in page.php ausgeführt wird, eine zusätzliche Union-Abfrage hinzu. Der Injektor hat festgestellt, dass die ursprüngliche Abfrage 6 Felder hat, also die Auswahl der numerischen Werte (Spaltenanzahl muss mit einer Union übereinstimmen). concat_ws erstellt nur ein Feld mit den Werten für den Datenbankbenutzer, die Datenbank und die Version, getrennt durch Doppelpunkte.

    
Orbit 28.10.2010 12:27
quelle
0

Er scheint den Benutzer zu finden, der die Verbindung zur Datenbank herstellt, die Datenbankadresse und den Port, die Version davon. Und es wird durch die Fehlermeldung gesetzt.

    
ykatchou 28.10.2010 12:24
quelle

Tags und Links