BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- PHP Verständnis von SQL-Injections (http://www.black-board.net/thread.php?threadid=23721)


Geschrieben von theromi am 19.05.2009 um 19:32:

  Verständnis von SQL-Injections

Hi,

ich beschäftige mich gerade ein wenig mit SQL-Injections und schätze, nach Lektüre von Wikipedia und den weiterführenden Links, dass ich es grundlegend verstanden habe. Nun wollte ich mit ein paar "Reallife"-Exploits angucken um mal zu testen, ob ich die verstehe.

Ein Beispiel (ein Exploit, mit dem ich selber mal getroffen wurde großes Grinsen ):

Zitat:
http://www.xxx.com/?page_id=115&forumaction=showprofile&User=1+union+select
+null,concat(user_login,0x2f,user_pass,0x2f,user_email),null,null,null,null
,null+from+wp_tbv_users/*


Gut, "User" ist offensichtlicht der unüberprüfte Schwachpunkt im PHP-Script. "Union Select" ist mir auch klar, genauso wie concat. 0x2f ist ein Slash im Ascii-Code, wird also als optisches Trennzeichen verwendet. Hier tritt aber die erse Frage auf: Okay, ich kann nicht einfach einen Slash da hin schreiben, ist ja eine URL. Aber muss ich das bei jedem Sonderzeichen machen (also durch den Hex-Code im ASCII ersetzten), oder nur bei diesen, die auf natürliche Weise in URLs leben? Augenzwinkern

Das Zweite was ich nicht verstehe sind die ganzen Kommas mit anschließenden "null"s. Da kann ich mir gar keinen Reim drauf bilden, wie wo und warum die da auftreten müssen. Vielleicht kann da ja einer Licht ins dunkel bringen.

Danke schonmal,
Roman



Geschrieben von Zyrus am 19.05.2009 um 21:44:

 

Mit SQL bist du nicht vertraut, oder ?

mit "null" wird nur die jeweilige Spalte definiert.

Greetz

Zyrus



Geschrieben von LX am 20.05.2009 um 00:22:

Achtung

Zitat:
Original von Zyrus
Mit SQL bist du nicht vertraut, oder ?

mit "null" wird nur die jeweilige Spalte definiert.
Ich denke, soweit kann er sich das schon zusammenreimen. Die Frage ist nur, warum man null selektieren sollte.

Hier gehe ich aber davon aus, dass man auch den Code kennen müsste, dessen Schwachstelle die Injection ausnutzt. Je nach dem, was man machen möchte, besteht eine Injection ja aus mehreren Teilen. Wenn man eine Datenbankabfrage nur umgehen möchte (z.B. eine Prüfung auf einen bestimmten Feldwert) oder man etwas in die Datenbank schreiben möchte, was nicht reingehört, dann genügt ein einfaches ergänztes SQL-Statement. Möchte man hingegen Werte aus der Datenbank auslesen, so müssen die natürlich auf einer Seite auch noch irgendwo angezeigt werden und nicht einfach in einem PHP- oder MySQL-Fehler untergehen.

In diesem konkreten Fall gehe ich mal davon aus, dass das Ergebnis des Queries in einer HTML-Tabelle ausgegeben werden soll, deren Spalten numerisch aus einem Resultset befüllt werden (also z. B. "<td>$resultrow[3]</td>"). Damit nun der ausgelesene Wert in einer vernünftigen Spalte landet, simuliert die ergänzte SELECT-Abfrage ein paar leere Spalten und den interessanten Part eben in einer Spalte, die vermutlich breit genug für die Anzeige ist.

So zumindest meine Deutung, für alles andere bräuchte man in der Tat den dahinter stehenden Code.



Geschrieben von theromi am 30.05.2009 um 14:12:

 

So, endlich mal wieder ein bisschen Zeit Augenzwinkern
Ja, genau, LX hat mir da schon weitergeholfen. Macht Sinn großes Grinsen

Zitat:
Wenn man eine Datenbankabfrage nur umgehen möchte (z.B. eine Prüfung auf einen bestimmten Feldwert) oder man etwas in die Datenbank schreiben möchte, was nicht reingehört, dann genügt ein einfaches ergänztes SQL-Statement.

Und genau das habe ich bei mehreren Lücken ausprobiert und es hat nie funktioniert. Führt PHP vllt. keine zwei Statements in einer Anweisung aus?



Geschrieben von LX am 30.05.2009 um 14:42:

 

mysql_query() führt nur eine einzelne Abfrage aus, ja.


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH