>> Lustiges Problem: Feldlänge in MySQL

Published by on 2008-09-09 11:43:13

Hier gibt's eine interessante Abhandlung über "SQL Column Truncation Vulnerabilities". Sollte man sich auf der Zunge zergehen lassen.

Versuch einer Kurzfassung:

CREATE table user ( name varchar(16), passwd varchar(8) );

insert into user values ('admin','vollsicher');

Jetzt kommt unser Freund, der Hacker, und verwendet für seinen Account den Usernamen 'admin            x'. Was passiert?

1. der Check "User existiert bereits" via select ... where user.name='admin            x' wird fehlschlagen. Das 'x' ist hierfür entscheidend, denn MySQL vergleicht Strings standardmässig nicht "binär", und ignoriert nachfolgende Leerzeichen. Ein einfaches 'admin ' würde also dazu führen, dass das System sagt, "nene, den User gibt es schon". Durch das _x sind die Zeichenketten aber beim Vergleich verschieden.

2. der User 'admin            x' wird also in der Usertabelle angelegt werden

3. weil das Feld aber nur 16 Zeichen lang ist, wird das nachfolgende 'x' beim Einfügen abgeschnitten (!)

4. von nun an wird jede Query auf die Tabelle in der Form:

select * from user where name='admin'

ZWEI Zeilen liefern, nämlich den richtigen, und den falschen Eintrag - weil die nachfolgenden Leerzeichen im Feld auch bei diesem Vergleich keine Rolle spielen, bzw. bei varchar-Feldern sogar abgeschnitten werden, wenn der Datensatz eingefügt wird.

Das nützt natürlich per se überhaupt nichts, kann aber in bestimmen Fällen (hier bei WordPress) zu echten Problemen führen. Also: nicht nur Queries und Eingangsdaten korrekt quoten, sondern Eingangsdaten auch mal auf die korrekte Länge prüfen - und/oder sensible String-Vergleiche mit BINARY durchführen.

Categorised as: Technik, Untergang der Zivilisation, Work

5 Comments

  • Comment from Florian on 2008-09-09 15:33

    Bin zu faul nachzu-gucken/denken: Was passiert, wenn das Feld für den Namen unique ist? Wird bei der Entscheidung ob unique auch un-binär verglichen?

  • Comment from Florian on 2008-09-09 15:43

    Getestet: Wenn das Feld unique ist, geht das nicht

  • Comment from lgw on 2008-09-09 19:14

    Steht ja auch schon in den Comments des Ausgangspostings. Ist auch logisch, denn der Fehler entsteht ja gerade dadurch, dass für MySQL beide Werte identisch zu behandeln sind - und damit natürlich ne key collision stattfindet :)

  • Comment from Hisky on 2008-10-12 20:04

    Nabend!

    Wie finde ich raus, ob der Angreifer erfolgt hatte? Hatte so einen Angriff Freitag abend...

    Siehe auch hier:
    http://www.hisky.de/2008/10/11/wordpress-hackversuch/

    Mein Passwort ist immernoch das Alte - also ist er nicht rein gekommen!?

    Kurze Mail bitte - Du hast hier leider kein
    "Ja, ich will bei weiteren Kommentaren benachrichtigt werden!"