Hilfe bei SQL-Injection-Beispiel

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Casisto
User
Beiträge: 12
Registriert: Sonntag 20. Oktober 2013, 13:11

Hallo Forum,

bisher war ich nur ein stiller Mitleser. aber ich muss für eine Hausarbeit das Thema SQL-Injection unter Python (empfohlen wurde mir das ganze per SQLite3) bearbeiten.

Ich habe jetzt ein Programm was mir meine Datenbank erzeugt und (4 Spalten, 3 Zeilen) eine Spalte enthält 'User', und dieser soll eigentlich nur seine Daten einsehen und verändern dürfen.

Per SQL-Injection soll im folgenden nun das Passwort (eine weitere Spalte der DB) eines anderen Users geändert werden. Meine SQL-Abfrage ist wie folgt aufgebaut:

Code: Alles auswählen

sql = "SELECT password FROM geheim WHERE user = '" + userin + "'"
cursor.execute(sql)
Mein Hackversuch ( bei eingabe seines Usernames bzw. seines Passwortes) lautet:

Code: Alles auswählen

UPDATE geheim SET password = /'1234/' WHERE user = /'Hausmeister/'
bzw. mit

Code: Alles auswählen

UPDATE geheim SET password = '1234' WHERE user = 'Hausmeister'
habe ich es auch schon probiert.

Bei beiden Varianten erhalte ich die Rüclmeldung:
Traceback (most recent call last):
File "Daten anzeigen per Eingabe.py", line 13, in <module>
cursor.execute(sql)
sqlite3.OperationalError: near "1234": syntax error
Kann mri jemand helfen wie ich die Injection "richtig" machen kann?

LG
Casisto
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Lass dir vor dem ``cursor.execute(sql)``-Aufruf mal das zusammengesetzte SQL-Statement mittels print ausgeben. Dann solltest du sofort sehen, dass es sich um kein gültiges SQL handelst. Nun musst du dir nur noch überlegen, wie du daraus gültiges SQL bekommst. Das ist aber Teil deiner Hausarbeit und solltest du selbst hinbekommen ;-)
Das Leben ist wie ein Tennisball.
Casisto
User
Beiträge: 12
Registriert: Sonntag 20. Oktober 2013, 13:11

hi, und danke für deine Hilfe.

Ich habe jetzt das SQL-Statement abgeschlossen und ein zweites (also praktisch meinen ersten Injection-Versuch) angehängt mit ";" angehängt, jetzt lautet die Warnung:
sqlite3.Warning: You can only execute one statement at a time.
Weiterhin hab ich die Verknüpfung per "&" versucht, aber da kam nur folgende Fehlermeldung:
sqlite3.OperationalError: near "UPDATE": syntax error
Und soetwas wie einen Wagenrücklauf gibt es ja bei SQL nicht, wie kann ich weiter vorgehen?
BlackJack

@Casisto: Es scheint als könnte man das SQLite-Modul damit nicht so einfach austricksen. Musst Du wohl eine andere DB-Software verwenden.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn es nur zu Demonstrationszwecken implementiert werden soll, dann hilft vielleicht die executescript-Methode weiter.
Das Leben ist wie ein Tennisball.
Casisto
User
Beiträge: 12
Registriert: Sonntag 20. Oktober 2013, 13:11

Ok, Danke für eure Hilfen.

Meine Recherchen in den letzten Stunden ergaben leider auch das wenigstens in SQLite 3 die Möglichkeit zur SQL-Injection nicht gegeben ist.

Die Executescript-Methode, ist das nicht zum Einschleusen von JavaScript? Ansonsten hast du dazu einen schönen Link? Eine kurze Googlesuche hat mich auch nur auf JS verwiesen.
Ansonsten würde das schon reichen.

Eine letzte Frage hätte ich aber noch, kennt ihr eine SQL-Distribution wo SQL-Injections "todsicher" möglich sind? MySQL vielleicht?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Casisto hat geschrieben:Die Executescript-Methode, ist das nicht zum Einschleusen von JavaScript? Ansonsten hast du dazu einen schönen Link? Eine kurze Googlesuche hat mich auch nur auf JS verwiesen.
Statt mit Google zu suchen könntest du zum Beispiel direkt inder Python-Dokumentation zum sqlite-Modul nachschauen ;-)

Wenn du es über die execute-Methode machen willst, dann probier einfach ein paar Datenbankanbindungen durch. Geht ja schnell.

Hat eigentlich jemand Bobby Tables gesehen?
Zuletzt geändert von EyDu am Montag 4. November 2013, 22:12, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Casisto: wie kommst Du jetzt plötzlich auf Javascript? Hast Du überhaupt schon »executescript« ausprobiert?
BlackJack

@Casisto: Das man bei `Sqlite3` bei `execute()` nur eine Anweisung angeben kann, heisst ja nicht, dass man da keine SQL-Injection betreiben kann. Du kannst dem SELECT vielleicht kein UPDATE unterschieben, aber es sollte zum Beispiel möglich sein Daten von anderen Benutzer auszulesen. Leute die solche Lücken lassen, speichern auch gerne mal Passworte direkt in der Datenbank statt nur Hashes. Sqlite3 ist definitiv nicht so sicher gegen SQL-Injection, dass man da nicht die üblichen Sicherheitsmassnahmen treffen sollte.
Casisto
User
Beiträge: 12
Registriert: Sonntag 20. Oktober 2013, 13:11

Ok, mit executescript hat es nun geklappt. Gestern Abend war ich mit meinen Gedanken noch zu stark in einem Beleg und habe nicht verstanden das die Funktion executescript heißt. Ich kenne eine Methode aus JS mit den Namen die aber gar nichts mit Datenbanken zu tun hat...

Aber vielen Dank für eure Hilfe und Schande über mein Haupt, ein 2-minütiger Blick in die Doku nach den entscheidenden Tipp von EyDu hätte alles schon gestern Abend geklärt ;-)
Antworten