SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von MmVisual »

Hallo allerseits,

In meinem Programm nutze ich Lazarus 2.7.1, nahezu das aktuellste Snapshot und als Datenbankkomponente ZEOS. Nun hat ein User festgestellt dass relativ einfach sich einen SQL Code als Injection mit TDBEdit und der verbundenen Query ausführen lassen! :shock: :shock: :shock:

Das was in der TDBEdit eingegeben wird ist einfach über TDatasource und TZQuery in die Datenbank, ohne extra Code geschrieben. (MySQL)

hier sind ein paar Screenshots.

1) Wenn ein Bauteil angelegt wird, das ein \' im Namen hat, wird ein SQL-Syntaxfehler gemeldet.
test1_wrongsqlsyntax.png
2) Wenn man den Bauteilnamen mit einem SQL-Kommentar enden lässt, ist die Syntax der SQL-Statements wieder korrekt (typisches SQL-Injection-Szenario: http://xkcd.com/327/" onclick="window.open(this.href);return false; :))
test2_fixwrongsqlsyntaxwithcomment.png
3) Einfügen von OR TRUE in eine SQL-WHERE-Klausel. Die interne Abfrage (separate Query-Abfrage in BeforePost() ), ob ein Datensatz mit diesem Namen schon existiert gibt damit fälschlicherweise true zurück.
test3_ortrue_errormessage.png
4) Mit Klick auf OK springt man zum ersten Datensatz, weil ein Bauteil dieses Namens doch noch nicht existiert.
test4_ortrue_okpressed.png
Wo ist nun der Bug? In der Zeos Komponente oder in Lazarus?

Und die allerwichtigste Frage: Wie kann ich das beheben?

Grüße Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von MmVisual »

Ich denke, ich habe das gefunden, aber ich habe noch nicht die richtige Lösung für das Problem.

Wenn ein neuer Bauteilname eingegeben wurde, dann wird vor dem Speichern die Bezeichnung in eine Query genommen und in der Datenbank abgefragt ob es ein doppelter Eintrag gibt.
Und genau diese Query macht das Problem.

Code: Alles auswählen

q.SQL.Text := 'SELECT ID FROM bauteil WHERE Bezeichnung = ''' + qBauteilBezeichnung.AsString + '''';
Nun ist die Frage, wie mache ich das richtig?
Einfach Quoten reicht ja nicht.

Grüße Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

grl
Beiträge: 36
Registriert: Fr 17. Okt 2008, 19:24
OS, Lazarus, FPC: Debian X64, Lazarus 1.1, FPC 2.7.1
CPU-Target: x86, ARM

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von grl »

MmVisual hat geschrieben:Wo ist nun der Bug? In der Zeos Komponente oder in Lazarus?
Also, ganz aus dem Bauch raus würd ich sagen: bei dir bzw bei dem was du programmiert hast.

Wie erzeugst du denn die Query? Wenn du ein "\'" in deinem Text zulässt führt das wahrscheinlich dazu, daß du mit dem Backslash ein Hochkomma in deine Query escapesd. Und das macht natürlich aus deiner Query ganz was anderes. Daß das nicht passiert musst du verhindern, das wird dir keine Komponente abnehmen könnnen,

Gruß
Luggi

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von Bauer321 »

so genau kenne ich mich damit auch nicht aus aber prepared statements ist so eine Sache die mir dazu einfällt. Das ist glaube ich extra gemacht um SQL-Injections zu vermeiden ist aber nachdem was ich neulich mal gelesen hab auch schneller
www.mcpatcher.net | www.hoeper.me

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von MmVisual »

"prepared statements" - Ja genau, sowas brauche ich.

Gibt es unter Zeos eine Funktion die mir einen String fertig SQL tauglich aufbereitet?
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von MmVisual »

Ich habe das mal so umprogrammiert:

Code: Alles auswählen

q.SQL.Text := 'SELECT ID FROM bauteil WHERE Bezeichnung = :Bezeichnung';
q.Params.ParamValues['Bezeichnung'] := qBauteilBezeichnung.AsString;
Jetzt scheint es zu klappen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

grl
Beiträge: 36
Registriert: Fr 17. Okt 2008, 19:24
OS, Lazarus, FPC: Debian X64, Lazarus 1.1, FPC 2.7.1
CPU-Target: x86, ARM

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von grl »

MmVisual hat geschrieben:Ich habe das mal so umprogrammiert:

Code: Alles auswählen

q.SQL.Text := 'SELECT ID FROM bauteil WHERE Bezeichnung = :Bezeichnung';
q.Params.ParamValues['Bezeichnung'] := qBauteilBezeichnung.AsString;
Jetzt scheint es zu klappen.
Das über Parameter zu lösen ist sicher gescheiter als den Query-String selber zu bauen.

Gruß
Luggi

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von MmVisual »

Na dann hab ich mal zu tun ... 30000 Codezeilen zu durchforsten.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von Bauer321 »

MmVisual hat geschrieben:"prepared statements" - Ja genau, sowas brauche ich.

Gibt es unter Zeos eine Funktion die mir einen String fertig SQL tauglich aufbereitet?
http://sourceforge.net/project/shownote ... _id=618508 also geben tuts sie auf jeden Fall wie man sie genau nutzt kann ich dir nicht sagen. Das mit den parametern sollte allerdings dazu führen, dass diese von Zeos mittels mysql_real_escape_string Escaped werden (ansonsten sehe ich den sinn in den Parametern nicht)
www.mcpatcher.net | www.hoeper.me

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von af0815 »

MmVisual hat geschrieben:Na dann hab ich mal zu tun ... 30000 Codezeilen zu durchforsten.
Bevor du das noch zig mal machen musst, schau dir mal an, wie du ev. Deinen Code schon bei der Eingabe resistenter machen kannst.

Schau dir mal die Beispiele an.
http://de.wikipedia.org/wiki/SQL-Injection
http://www.unixwiz.net/techtips/sql-injection.html
http://www.heise.de/security/artikel/Giftspritze-270382.html
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von Bauer321 »

af0815 hat geschrieben:
MmVisual hat geschrieben:Na dann hab ich mal zu tun ... 30000 Codezeilen zu durchforsten.
Bevor du das noch zig mal machen musst, schau dir mal an, wie du ev. Deinen Code schon bei der Eingabe resistenter machen kannst.

Schau dir mal die Beispiele an.
http://de.wikipedia.org/wiki/SQL-Injection
http://www.unixwiz.net/techtips/sql-injection.html
http://www.heise.de/security/artikel/Giftspritze-270382.html
durch ein prepared statement sollten eigentlich alle Risiken beiseite sein. Ansonsten zuerst den String mit mysql_real_escape escapen
www.mcpatcher.net | www.hoeper.me

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von af0815 »

Bauer321 hat geschrieben:durch ein prepared statement sollten eigentlich alle Risiken beiseite sein. Ansonsten zuerst den String mit mysql_real_escape escapen
Das Risiko ist vermindert. Zuerst sollte immer verhindert werden, das überhaupt ungewollte Einträge gemacht werden. Das heisst entweder Benutzereingaben durch vorgefertigte Liste zu ersetzen bzw. dort wo der benutzer echt Eingaben machen muß, den iput entsprechend zu parsen und gewisse Begriffe und Zeichen einfach nicht anzunehmen bzw. den Benutzer darauf hinzuweisen, das seine Eingabe so nicht gewünscht ist.
Beispiel: keine Hochkommas, Steuerzeichen, Bindestriche, Escapezeichen, spezielle Worte.

Je mehr der Input geprüft wird, desto mehr wird verhindert, das falsche Sachen an die DB geliefert werden, zusätzlich wird der Benutzer auch bei den EIngaben (vernünftig) hingewiesen wenn was nicht so stimmt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von MmVisual »

Das Problem ist ja auch nicht so einfach zu lösen.

Meine EXE läuft je nach Konfiguration mit SQLite, MySQL und PostgeSQL (über die ZEOS Komponente). Und bei allen Datenbanktypen dürfen keine SQL-Injections auftreten.

Ich habe jetzt das gesamte Programm durchforstet und die Stellen mal mit dieser Syntax ersetzt:

Code: Alles auswählen

q.SQL.Text := 'SELECT ID FROM bauteil WHERE Bezeichnung = :Bezeichnung';
q.Params.ParamValues['Bezeichnung'] := sBezeichnung;
Aber einfach mal so ins blaue hinein möchte ich den User nicht einschränken, es sollte dann schon was "Handfestes" sein, das ich abfangen muss.

Ab Montag testet ein User meine Änderung mit MySQL. Ich selbst habe zu wenig Erfahrung mit SQL-Injections.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von af0815 »

MmVisual hat geschrieben:Das Problem ist ja auch nicht so einfach zu lösen.

Meine EXE läuft je nach Konfiguration mit SQLite, MySQL und PostgeSQL (über die ZEOS Komponente). Und bei allen Datenbanktypen dürfen keine SQL-Injections auftreten.
Das glaube ich Dir.
Das einfachste wird sein, das du dir eine Funktion erstellst, wo du die wichtigesten Sachen (zu Fuß) prüfst (siehe vorherigen Post von mir). Damit sind mal die meisten Sachen für die Scriptkiddies blockiert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SQL-Injections mit Lazarus möglich - Wo ist da der Bug?

Beitrag von MmVisual »

Das "einfachste" ist nicht so einfach, daher warte ich lieber ab.

Denn ein TDBEdit >> TDatasource >> TZQuery Verbindung macht alles schon automatisch. Darin werden die Daten eingegeben, dargestellt und gespeichert.
Jetzt darin den eingegebene Text zu überprüfen und die Eingabe zu blockieren ist schon eine größere Sache.
Wenn das Probleme bereiten würde, dann wäre sicher JEDE Lazarus-Anwendung mit Datenbanken automatisch ein Sicherheitsrisiko und es wäre hier sicher schon breit diskutiert worden.

Daher lasse ich das erst mal auf "Prepared Statements".
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten