Kann man mit der Where-Klausel SQL-Injections ausführen?

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!

Woher ich das weiß:Berufserfahrung – Software-Entwickler und PC-Techniker

guterfrager5 
Beitragsersteller
 16.12.2024, 13:58

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.

Waldi2007  16.12.2024, 14:03
@guterfrager5

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.

guterfrager5 
Beitragsersteller
 16.12.2024, 14:14
@Waldi2007

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 (:

slaxxer  17.12.2024, 16:59
@Waldi2007

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