Hacking sort() for Fun and Profit Marc Ruef | 12.11.2012 Nur wenige Leute in meinem Umfeld wissen, womit ich mein Geld verdiene. Diejenigen, die es zu wissen meinen, assoziieren meine Tätigkeit nach wie vor mit Viren und Würmern. Wer sich ein bisschen besser auskennt, der denkt als erstes an Nmap und Nessus. Die meisten denken jedoch, dass ich halt einfach "mit Computer" zu tun habe. Mir solls recht sein. Ein Jugendfreund hat vor einiger Zeit sein eigenes Unternehmen gegründet. Er ist einer der wenigen Freunde, die ich habe, die nicht studiert haben. In der Tat ist er gar einer der wenigen Leute, die ich kenne, die als Handwerker ihren Alltag bestreiten. Aufgrund seines unverhohlenenen Desinteresses an Computern ist er somit einer der letzten, der nachvollziehen kann, was ich den ganzen Tag im Büro so mache. Eines Tages kam er zu mir und sagte, dass sein junges Unternehmen nun auch eine Webseite habe. Und er wolle wissen, wie er die Popularität derer im Internet steigern kann, so dass er mehr Kunden anwerben könne. Im gleichen Atemzug fuhr er weiter, dass es in seiner Branche Usus ist, sich auf einer schweizweit bekannten Handwerker-Plattform zu präsentieren. Er habe sich da mal angemeldet, tauche aber auf den hinteren Plätzen auf. Ich sagte ihm, dass ich mir das mal anschauen werde. Auf der Seite werden sämtliche angemeldeten Homepages nach Kategorien (z.B. Bodenleger, Gipser, Maler) und nach Ort/Postleitzahl eingeteilt. Ruft man eine entsprechende Unterkategorie auf, werden sämtliche Einträge in alphabetischer Reihenfolge dargestellt. Dies gilt jedoch nur für das kostenlose Listing, denn die kostenpflichtige Anmeldung führt dazu, dass man ganz am Anfang aufgelistet wird. Es sollte mich interessieren, wie diese Sortierung zustande kommt. Ein Blick in den HTML-Quelltext der Ausgabe erfreute mein Herz: Sämtlichen bezahlten Einträgen wurde das Unicode-Zeichen "ZERO WIDTH NO-BREAK SPACE" (U+FEFF) vorangestellt. Dies machte es besonders einfach, denn es mussten nun nicht zwei Abfragen durchgefürt, sortiert und aneinandergehängt werden. Stattdessen reichte eine Abfrage mit entsprechender Präparation, um die zweigeteilt sortierte Liste - kommerziell und dann frei - generieren zu können. Die Frage war nun: Kann ich nun ebenfalls einen freien Eintrag dahingehend manipulieren, dass er dieses Kriterium erfüllt? So erfragte ich die Login-Daten meines Freundes, um den Firmennamen auf "FOO" zu ändern. Das funktionierte prächtig und führte dazu, dass sein Listing im Rahmen der wenigen kommerziellen Einträge figurierte. Aber ich fragte mich: Sollte ich nicht auch hier an die erste Stelle kommen können? Ich entschied mich stattdessen auf "ZERO WIDTH SPACE" (U+200B) zu setzen und das Bevorzugen von Zahlen vor Buchstaben in sort() auszunutzen. Und tatsächtlich, er sollte von nun an an erster Stelle dargestellt werden. Als ich ihn kurz darauf anrief und zum Besuchen der Seite aufforderte, war er ganz verdutzt. Wie hatte ich das bloss gemacht? Ich versuchte den Ansatz so einfach wie möglich zu erklären. "Wir Informatiker kennen verschiedene Formen von Leerzeichen. Und die werden unterschiedlich sortiert..." Wirklich verstanden hat er den Sachverhalt wohl kaum. Doch kam er zum Schluss, dass er nun endlich verstehen würde, womit ich mein Geld verdiene. Das sei ja ganz einfach... So ganz einfach, das rede ich mir jedenfalls ein, ist es aber dann doch nicht. Ich verdiene nun schon seit bald 15 Jahren mit Security-Testing mein Geld und derlei minimal erscheinende Hacks fussen in der Regel auf sehr viel Erfahrung. In diesem Fall musste ich mindestens 3 Technologien (HTML, PHP, Unicode) verstehen und mir ihre Schwächen zu Nutze machen können. Mein Freund hat sich übrigens tags darauf entschieden, dass er von diesem unlauteren Wettbewerb absehen wolle. Er wolle "in der Branche nicht als Hacker gebrandmarkt werden". Ich musste schmunzeln. Mir wars jedenfalls egal, denn ich hatte meine 5 Minuten Spass.