2016-05-07 22 views
2

Ich schreibe einen Bericht über SQL-Injection-Angriffe. Ich habe ein Beispiel auf Owasp wie unten gezeigt gefunden.SQL Injection Query

Da dies ein Beispiel und für mich ist, scheint es als eine einfache Abfrage eine Zeile mit der spezifischen ID bekommen, tut es sonst noch etwas oder meine Annahme ist richtig?

String query = "SELECT * FROM accounts WHERE custID='" + 
request.getParameter("id") + "'"; 
// Since this is an online example i don't know what getParameter("id") method does. 
+0

Ich glaube, Sie vermissen den Punkt der SQL-Injection enthalten könnte: Es geht um Code ist * nicht * in der Ausführung durch Anwendung . Beginnen Sie mit der Wikipedia-Seite: https://en.wikipedia.org/wiki/SQL_injection. –

+0

Ich denke, das Ihnen zur Verfügung gestellte Beispiel ist schlecht. Anstatt Ihnen ein richtiges Beispiel für SQL-Injection zu geben, wie zum Beispiel 'OR 1 == 1;' (return * all * records), haben sie scheinbar Java-Code bereitgestellt. –

Antwort

5

mir enthalten scheint es, als eine einfache Abfrage eine Zeile mit spezifischer ID bekam

Das ist die Magie der Injektion. Die Abfrage sollte nur eine Zeile erhalten, die ein bestimmtes Kriterium erfüllt, das von einer Anfrage kommt (wie ein GET oder POST von HTML zum Beispiel).

So request.getParameter("id") bietet einen Parameter vom Benutzer (oder ein sehr böser Typ).

Normalerweise wer schrieb, dass der Frieden von Code so etwas wie dies zu erwarten:

id = 12

, die in

SELECT * FROM accounts WHERE custID='12' 

Jetzt Bild ergeben würde, was, wenn der Benutzer geschieht (ein schlechter in diesem Fall) sendet dies stattdessen:

id = 0'; DROP TABLE accounts; -- 

Diese wou ld ausführen als

SELECT * FROM accounts WHERE custID='0'; DROP TABLE accounts; --' 

Schritt-für-Schritt:

  1. Sicherstellen, dass die beabsichtigte Abfrage ohne Fehler ausgeführt (0)
  2. die Abfrage vor dem geplanten Endpunkt (';)
  3. Inject Ihr bösartiger Code (DROP TABLE accounts;)
  4. Stellen Sie sicher, dass alles, was von der ursprünglichen Abfrage übrig ist, als Kommentar behandelt wird (--)

Das Problem in dem OWASP Beispiel ist die Abfrage nicht selbst, sondern die Tatsache, daß Parameter, die von ‚außen‘ kommen (request.getParameter("id")) werden verwendet, um eine Abfrage zu erzeugen, ohne irgendwelche potentiellen Steuerzeichen entweicht.

Diese Art des Schreibens Code ermöglicht grundsätzlich jedem Benutzer Code auf Ihrem SQL-Server ausführen.

1
request.getParameter("id") 

einen der Parameter "id" aus der http-Anfrage erhalten, z.B. für: http://test.com/?id=qwertzrequest.getParameter("id") wird "qwertz" zurückgeben. SQL-Injection ist möglich, in diesem Fall, da der Wert dieses Parameters nicht geprüft wurde und alles

3

Das Problem mit dieser Abfrage besteht darin, dass das SQL dynamisch erstellt wird. Request.getparameter ist wahrscheinlich nur eine Funktion, die die ID der Zeile für die spezifische Webanforderung zurückgibt.

Aber wenn die Webseite erlaubt, diesen Parameter durch ein Textfeld zu füllen oder die Funktion direkt von JavaScript aufgerufen wird, kann jeder Wert in id gesetzt werden.

Dies könnte eine beliebige SQL-Anweisung enthalten, die mit der korrekten Authentifizierung, auch ‚DROP Datenbank‘