Kann man mit der Where-Klausel SQL-Injections ausführen?
... und falls es möglich ist, könnte mir noch jemand Beispiele geben, mit welcher Eingabe?
Das Statement sieht in etwa so aus:
SELECT foo
FROM bar
WHERE 1 = 1 AND ...
die Punkte sind der Teil, der generiert wird und zum Teil der Benutzer selbst eingeben kann (um genauere Selektionen zu ermöglichen).
Bei der Ausführung wird nur das erste Statement ausgeführt also wenn man so etwas wie "; DELETE FROM bar;" eingeben würde, würde trotzdem nur das select ausgeführt werden, und das Löschstatement einfach ignoriert werden.
Meiner Ansicht nach müsste es so unmöglich sein, ernsthaft Schaden anzurichten. Oder gibt es noch eine andere Möglichkeit, wie Änderungen vorgenommen werden könnten (mit subqueries kenne ich mich jetzt nicht wirklich aus aber ich denke da kann man kein drop/delete/truncate oder so etwas aufrufen, weil das doch keinen Sinn machen würde)?
2 Antworten
Doch, das geht! Nehmen wir doch mal Dein Beispiel: "; DELETE FROM bar;". Durch das erste ";" wird das vorausgehende SELECT-Statement abgeschlossen und es beginnt ein neues Statement. Hat nun der User, unter welchem das eigentliche Statement ausgeführt werden soll, die passenden Berechtigungen, so wird der (nun neue) Befehl "DELETE FROM bar;" ausgeführt und die Tabelle "bar" leergeräumt.
Dem kann man aber entgegenwirken, indem man Usereingaben (oder generell Zeichenketten) nicht als Literale, sondern als Parameter angibt. Dadurch werden SQL Injections stark erschwert bzw. sogar komplett vermieden!
Und ja: ich benutze in meiner Software und in meinen Skripten diese Technik mit den Parametern!
Wenn nur das erste Statement ausgeführt wird, dann hat der User, unter welchem die DB-Verbindung läuft, vielleicht keine Berechtigung zu Löschen von Zeilen aus dieser Tabelle. Aber ich weiß auch nicht, unter welchem DBMS die SQL-Statements laufen sollen: Ist es Oracle, MSSQL, MySQL, MariaDB, PostgreSQL oder eine andere relationale Datenbank?
Edit: Ich habe eben erst gelesen, daß Du DB2 als DBMS hast. Mit den Feinheiten dieses DBMS von IBM bin ich leider nicht ganz so vertraut.
Gemnerell aber würde ich plädieren, auf Nummer Sicher zu gehen. Betreibe also lieber diesen Mehraufwand! Ich habe mir für meine Proggies (in C# und PHP) Wrapper geschrieben, welche das Parameter-Handling deutlich vereinfachen. So halte ich den Mehraufwand in Grenzen.
Berechtigung zum löschen hat er ja hoffentlich schon ... es wird nämlich eine Erweiterung zum (kontrollierten) löschen und das ist die Selektion, was gelöscht werden soll (um es dann auch zu loggen). Er sollte nur nichts selbstständig löschen können.
Dann probiere ich noch ein bischen weiter und hoffe mal, dass ich es noch in einer Woche hinbekomme (dann ist ja schon wieder Weihnachten ... nicht vergessen!).
Danke auf jeden Fall (:
es ist eigentlich mehr ein problem der validierung des inputs als des sql statements
Wenn man "..." durch Folgendes ersetzt:
1=1 INTO OUTFILE '/var/www/html/lasertag.txt'
kann man je nach Berechtigungen und Verzeichnisstruktur die kompletten Daten aus der Datenbank speichern und auslesen.
Ich hoffe, ich konnte dir helfen. Beste Grüße
Hans Dieter
Es wird nur das erste angegebene Statement ausgeführt (habe ich eigentlich auch geschrieben 😅) und ich benutze auch Parameter wo es geht. Nur geht das an der Stelle gerade nicht bzw. würde einen so wesentlichen Mehraufwand bedeuten, dass ich es gerne vermeiden würde.
DBMS ist DB2 falls das wichtig sein sollte.