executeQuery SQL Injection

Mr. J

Mitglied
Hallo,
ich habe ein Programm das eine Verbindung zu einer Datenbank aufbaut und dann ein vorbereitetes Statement mit executeQuery absendet.

Java:
java.sql.Connection conn = DriverManager
					.getConnection("jdbc:sqlite:test.db");
			Statement stat = conn.createStatement();
			ResultSet rs = stat.executeQuery(sql);

Meine Frage ist jetzt ob es irgendwie möglich ist in der Variable "sql" statt einem einzelnen Statement auch mehrere Statements unterzubringen, also z.B. neben einem SELECT-Statement zusätzlich noch ein INSERT-Statement?

MfG
Mr. J
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
ja, mach doch,
sql dürfte ein String sein, dem ist egal wo er wie oft verwendet wird,
oder welche Fehler treten bei dir auf?

wenn der String "SELECT .. " lautet, macht er sich als INSERT natürlich eher schlecht..

(edit: wenig hilfreich, ignorieren)
 
Zuletzt bearbeitet von einem Moderator:

tuttle64

Bekanntes Mitglied
Meine Frage ist jetzt ob es irgendwie möglich ist in der Variable "sql" statt einem einzelnen Statement auch mehrere Statements unterzubringen, also z.B. neben einem SELECT-Statement zusätzlich noch ein INSERT-Statement?

Solange die SQL-Syntax nicht verletzt wird, kannst du ein INSERT mit einem SELECT verbinden, allerdings muss das INSERT in Verbindung mit dem SELECT stehen d.h. die Attribute die beim Select verwendet werden, sollten also auch beim Insert eine Verwendung finden.
 

Mr. J

Mitglied
Der sql-String sieht wie folgt aus:

Java:
String sql = "select * from users WHERE username='" + username
				+ "' AND password='" + password + "';";

Wobei username und password in einem Webinterface abgefragt werden. Die Idee hinter dem Ganzen war die Überprüfung ob hier eine SQL-Injection möglich ist so dass ein neuer Benutzer angelegt wird. Der erste Ansatz war erstmal aus den Anführungsstrichen auszubrechen und anschließend noch ein weiteres SQL-Statement mit hineinzupacken. Dazu sah meine Eingabe beim Password dann so aus: "';INSERT INTO users (username, password) VALUES ('Attacker', 'test')--", aber damit funktioniert es nicht, allerdings kommt vom Server auch keine Fehlermeldung von daher habe ich keine Ahnung was ich genau falsch mache oder ob die Injection prinzipiell nicht möglich ist.

MfG
Mr. J
 
S

SlaterB

Gast
ach, falsch gelesen, in executeQuery() mehrere SQL-Befehle gleichzeitig,
na sowas, also allgemein rate ich dringend davon ab,
genaueres möchte ich nicht beurteilen, kann es gerade auch nicht testen
 

Mr. J

Mitglied
Ja, sowas dachte ich mir schon, insbesondere da Java ja die Möglichkeit über executeBatch mitbringt mehrere Sachen gleichzeitig auszuführen.

MfG
Mr. J
 
P

Pippl

Gast
Der sql-String sieht wie folgt aus:

Java:
String sql = "select * from users WHERE username='" + username
				+ "' AND password='" + password + "';";
Die Idee hinter dem Ganzen war die Überprüfung ob hier eine SQL-Injection möglich ist so dass ein neuer Benutzer angelegt wird. ...

MfG
Mr. J

Wenn du PreparedStatements verwendest kannst du SQL-Injections auch verhindern und du musst dich beim zusammensetzen des SQL Befehls nicht mit Anführungszeichen rumärgern.

Java:
 PreparedStatement prep = conn.prepareStatement(
      "INSERT INTO User VALUES (?, ?);");

    prep.setString(1, "Username");
    prep.setString(2, "Password");

Weiters gibt es noch setInt() und ähnliche Methoden.
 

Mr. J

Mitglied
Mmh,
das habe ich vergessen zu erwähnen: der Quellcode soll nicht modifiziert werden in dieser Übung, es ging nur darum ob es möglich ist über die Eingaben user/password einen Angreifer in die vorhandene Datenbank einzufügen aber soweit ich das jetzt sehe geht das nicht.

MfG
Mr. J
 
M

maki

Gast
Mmh,
das habe ich vergessen zu erwähnen: der Quellcode soll nicht modifiziert werden in dieser Übung, es ging nur darum ob es möglich ist über die Eingaben user/password einen Angreifer in die vorhandene Datenbank einzufügen aber soweit ich das jetzt sehe geht das nicht.
Warum sagst du das eigentlich nicht gleich???

Klar geht das, nennt sich SQL Injection.
 

Mr. J

Mitglied
Soweit ich das im hier vorliegenden Beispiel sehen kann geht es nicht, ich habe es ja bereits versucht allerdings scheint es so zu sein dass nur das erste Statement interpretiert wird und alles weitere bei der Anfrage einfach ignoriert wird.

MfG
Mr. J
 
M

maki

Gast
Weil du es nicht kannst, heisst es nicht dass es nicht geht, Google mal nach SQL Injection.
 

Mr. J

Mitglied
Habe ich bereits getan, evtl. wirfst du erstmal einen Blick auf das bereits von mir gepostete Statement und sagst mir was daran falsch ist anstatt mich direkt zu google zu verweisen.
Folgendes wurde als Password eingegeben: ';INSERT INTO users (username, password) VALUES ("Attacker", "test")--
Theoretisch sollte dabei ein neuer Eintrag in der Datenbank für einen User Attacker mit dem Password test rauskommen, allerdings passiert dies nicht und meine Vermutung ist dass das executeQuery entweder nur ein Statement verarbeiten kann.

MfG
Mr. J
 

Mr. J

Mitglied
Funktioniert nicht, was mich darin bestärkt dass eine zweite Anfrage wohl bei executedQuery nicht bearbeitet wird.

MfG
Mr. J
 

yajp

Mitglied
Hallo,
geht es jetzt ausschließlich darum, ob ein Insert möglich ist oder auch ob die Anmeldung auf dem 'Webinterface' umgangen werden kann?

grüße
 
P

Pippl

Gast
Hast du schon probiert

Java:
String sql = "SELECT * FROM Users; INSERT INTO Users VALUES('Name', 'Password');";

ausführen zu lassen. Wenn kein User angelegt wird dann kann man nicht mehrere SQL-Statement mit einem executeQuery() ausführen.

Somit wird nur das SELECT Statement ausgeführt, diese kann aber umgangen werden. (aber da wären wir wieder bei PreparedStatements und modifiziert soll ja nichts werden)
 
S

SlaterB

Gast
@maki
vorher hieß es noch 'Weil du es nicht kannst, heisst es nicht dass es nicht geht,'..
 
S

SlaterB

Gast
na ob auch das geht?

aber noch konkreter wirds, wenn es bei nur einer Query bleibt, etwa das Beispiel
SELECT author, subject, text FROM artikel WHERE ID=42 UNION SELECT login, password, 'x' FROM user
SQL-Injection ? Wikipedia

dann war ja wirklich was zu finden ;)
 

Mr. J

Mitglied
Hast du schon probiert

Java:
String sql = "SELECT * FROM Users; INSERT INTO Users VALUES('Name', 'Password');";

ausführen zu lassen. Wenn kein User angelegt wird dann kann man nicht mehrere SQL-Statement mit einem executeQuery() ausführen.

Das wäre wieder effektiv eine Änderung am Code. Letztendlich kann ich nur username und password im Webinterface eingeben und das sollte wohl nicht ausreichen damit man einen neuen Nutzer anlegen kann, aber keine Panik denn die Möglichkeit dass dies nicht möglich ist wurde in der Übung eingeräumt.

MfG
Mr. J
 
P

Pippl

Gast
Das wäre wieder effektiv eine Änderung am Code. Letztendlich kann ich nur username und password im Webinterface eingeben und das sollte wohl nicht ausreichen damit man einen neuen Nutzer anlegen kann, aber keine Panik denn die Möglichkeit dass dies nicht möglich ist wurde in der Übung eingeräumt.

MfG
Mr. J

Der String sollte auch nur mal zum Testen sein was passiert wenn nach dem SELECT noch ein INSERT folgt (danach kannst wieder den anderen reingeben). Somit wüsstest du ob ein INSERT noch einem SELECT noch ausgeführt wird.

Nachdem SELECT wird Schluss sein.
 

Mr. J

Mitglied
Ja, denke ich auch. Immerhin etwas Schutz der von Java mitgebracht wird. Aber mit dem preparedStatement ist man da deutlich sicherer (habe ich auch als fix für mögliche SQL-Injections angegeben).
Ich bedanke mich auf jeden Fall bei allen hier Mitwirkenden, meine Panik dass ich etwas übersehen haben könnte ich damit beseitigt. :toll:

MfG
Mr. J
 
S

SlaterB

Gast
die UNION-Injection bedacht? Einfügen mag nicht gehen, aber evtl. mehr Auslesen als gut ist, siehe mein letztes Posting
 

Ähnliche Java Themen

Neue Themen


Oben