# executeQuery SQL Injection



## Mr. J (6. Jul 2011)

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


```
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


----------



## SlaterB (6. Jul 2011)

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)


----------



## tuttle64 (6. Jul 2011)

Mr. J hat gesagt.:


> 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 (6. Jul 2011)

Der sql-String sieht wie folgt aus:


```
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


----------



## SlaterB (6. Jul 2011)

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 (6. Jul 2011)

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

MfG
Mr. J


----------



## Pippl (6. Jul 2011)

Mr. J hat gesagt.:


> Der sql-String sieht wie folgt aus:
> 
> 
> ```
> ...



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.


```
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 (6. Jul 2011)

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


----------



## maki (6. Jul 2011)

Mr. J hat gesagt.:


> 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 (6. Jul 2011)

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


----------



## maki (6. Jul 2011)

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


----------



## Mr. J (6. Jul 2011)

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


----------



## utnovetur (6. Jul 2011)

```
username = "bla'; insert into users (username, password) values ('Peter', 'geheim'); --"
```


----------



## Mr. J (6. Jul 2011)

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

MfG
Mr. J


----------



## yajp (6. Jul 2011)

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


----------



## maki (6. Jul 2011)

executeQuery kann eben nur Abfragen bearbeiten, versuche es mal mit execute


----------



## Pippl (6. Jul 2011)

Hast du schon probiert 


```
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)


----------



## SlaterB (6. Jul 2011)

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


----------



## maki (6. Jul 2011)

SlaterB hat gesagt.:


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


Ein Insert in einem Query statement abzusetzen wird wohl nicht gehen, d.h. aber nicht das keine 2 Select Statements untergejubelt werden können.


----------



## SlaterB (6. Jul 2011)

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 (6. Jul 2011)

Pippl hat gesagt.:


> Hast du schon probiert
> 
> 
> ```
> ...



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


----------



## Pippl (6. Jul 2011)

Mr. J hat gesagt.:


> 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 (6. Jul 2011)

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


----------



## SlaterB (6. Jul 2011)

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


----------

