[SQL] Statement + SQLString

nex_m

Erfahrenes Mitglied
Hey,

ich habe gerade versucht den SQL-String
Code:
String sql = "select * from users where username='..'; insert into users ('..', '..')"
auszuführen.
Scheinbar wird nur die erste Anweisung ausgeführt.
Ist das in der Tat so, dass nur die erste Anweisung ausgeführt und alles nach dem Semikolon verworfen und nicht ausgeführt wird?
 
Zuletzt bearbeitet:
Was für eine DB? Normalerweise ist das ein BEfehl und sieht etwa so aus: INSERT INTO .... SELECT
SQL:
 insert into users ('..', '..') select * from users where username='..';
 
Zuletzt bearbeitet von einem Moderator:
SQLite.
Die Reihenfolge ist so in Ordnung. Das soll ein String sein.
Vlt. muss ich weiter ausholen;) Ich versuche gerade einen SQL-Injection Angriff (Hausübung). Die Frage ist ob ich durch einfaches Anhängen eines Insert-Befehls einen neuen User der Datenbank hinzufügen kann. Scheint so aber nicht zu gehen?
 
@Technoblade
Denke ich bin hier richtig!?
Das ganze Problem bezieht sich hier auf Java wenn ich ein Statement erzeuge.
Code:
Statement stat = connection.createStatement();
ResultSet rs = stat.executeQuery(sql);
Das war vlt. nicht ganz klar.
 
Zuletzt bearbeitet:
Das Problem ist das ALLES andere außer SELECT die Methode Statement.executeUpdate(String) erfordert. Wenn also hier der Programmierer an der Stelle wo du eine SQL-Injection versuchen willst nur mit Statement.executeQuery(String) arbeitet hast du ein Problem.
Dessweiteren müsste auch das Statement an sich als UPDATABLE initialisiert werden, denn durch ein einfaches Connection.createStatement wird bei den meisten DB's ein READ-ONLY-Statement erzeugt *müsste man mal ausprobieren*.
Du siehst also : eine SQL-Injection mit Java gestaltet sich schon schwieriger als z.B. unter PHP
 
Das Problem ist das ALLES andere außer SELECT die Methode Statement.executeUpdate(String) erfordert. Wenn also hier der Programmierer an der Stelle wo du eine SQL-Injection versuchen willst nur mit Statement.executeQuery(String) arbeitet hast du ein Problem.
Dessweiteren müsste auch das Statement an sich als UPDATABLE initialisiert werden, denn durch ein einfaches Connection.createStatement wird bei den meisten DB's ein READ-ONLY-Statement erzeugt *müsste man mal ausprobieren*.
Du siehst also : eine SQL-Injection mit Java gestaltet sich schon schwieriger als z.B. unter PHP

Ich hatte auch erwartet, dass executeQuery() nur für sowas wie READ-ONLY verwendet werden kann. Aber es lässt sich auch "insert into" damit ausführen (scheinbar wird nicht geprüft).
Wenn ich dann aber den SQL String z.B. so modifiziere "select * from ..;insert into .." dann wird das insert ignoriert. Ist das dann Datenbank spezifisch? Oder wie kommt das Verhalten zustande?
 
Also das man mit executeQuery() auch INSERT machen kann entzieht sich mir jetzt mal VÖLLIGER Logik ...
Dafür hat man speziell diese zwei verschiedenen Methoden erdacht. Eine um Informationen aus der Datenbank zu holen und die andere um Informationen in die Datenbank rein zu laden.
Das einzige was ich mir jetzt noch vorstellen könnte ist das es JDBC-Treiber abhängig ist. Ich weis das z.B. der MySQL-JDBC-Connector jegliche Anweisungen welche informationen in der Datenbank verändern *INSERT , UPDATE , DELETE , DROP* von executeQuery() verweigert werden. Ausschließlich lesende Operationenen wie halt SELECT werden zugelassen.
Außerdem : WENN du schon den String manipulierst dann musst du auch auf das LEERZEICHEN zwischen dem Semikolon und der INSERT INTO beachten. Außerdem kann es sein das der aktuelle Datenbank-User einfach keine Rechte hat um das von dir gewollte INSERT ausführen zu können. Fakt ist jedoch um Daten in einer Datenbank ändern zu können muss erstenst das Statement so initialisiert werden das es auch UPDATE-Kommandos akzeptiert *bei einigen Treibern ist ein Statement lediglich als READ-ONLY initialisiert wenn nicht explizit angegeben* und es muss dann auch die executeUpdate() Methode verwendet werden. *Das der DB-User Rechte braucht sollte eigentlich klar sein.* Wenn ein Treiber jedoch trotzdem UPDATE-Kommandos über executeQuery() zulässt gehe ich hier von einem fatalen implementierungs-Fehler des Treibers aus da laut Java-API executeQuery() nur Daten lesen können soll.
 
Das mit dem Leerzeichen habe ich nicht beachtet. Werde ich jetzt noch einmal testen. Vlt. geht's ja damit :D
Ansonsten...dann mal vielen Dank für Erläuterungen.
 

Neue Beiträge

Zurück