 Bevor ich hier anfange, habe ich eine persönliche Bemerkung. Ich würde gerne ein Bild mit euch allen machen. Ich hoffe, dass es okay wird für euch. Bitte alle sagen, fuck Bill. Das war wunderbar. Vielen Dank. Heute werde ich über Pearl zu erzählen. Hier ist Pearl. Der Style ist schlecht. Die Objektoriterierung ist schlecht. Die Datentypen sind schlecht. Sehr schlecht. Aber Pearl gibt es seit 1987 und sehr viele alte Systeme benutzen es. Sehr viele Sysadmins benutzen es. Und leider benutzen es auch sehr viele Security-Experten. Wenn ich es in einem Satz zusammenfassen soll, Pearl ist schlechter als Peisen, weil die Leute das schlechter haben wollen. Das ist ein Zitat von Larry Wall, dem Erfinder von Pearl. Erst mal zu Pearl Datentypen. Wir haben die Skalare. Das sind einfach nur normale Zahlen. Strings, Floats. Sie sehen auch so aus. Und das ist die Syntax. Dann kommen Syntax. Dann kommen Race. Sie sehen so aus. Und jetzt kommen Dictionaries. Das sind normale Dictionaries. Sie werden Hashes genannt. Sie haben geschreifte Klammern. Die Syntax ist verständlich. Alles funktioniert so, wie es soll. Aber wer wird das vergessen? Wie sieht es mit Listen aus? Also... Hier ist ein Beispiel für eine Liste. Das gelbe Stück ist die Liste. Wir stecken das in ein Array. Und dann holen wir das erste Element. Jetzt stecken wir die Liste in ein Skala. Jetzt wird man erwarten, dass nur das erste Element landet. Wie in jeder anderen Sprache. Wie in einer anderen normalen Sprache. Das ist das letzte Element der Liste. Was ist denn hier los? Das passiert nur, wenn wir es nicht kasten. Wenn wir es als ein Skala umrühren. Manu, dann wird die Zahl der Elemente der Liste ausgegeben. Jetzt werden wir die hessischen Liste. Das ist das letzte Element der Liste. Das ist das letzte Element der Liste. Aber jetzt werden wir die Liste einem Hasht zuweisen, dass erwartete Behalten ist, dass zumindest eine Exception kommt oder undefined ausgegeben wird. Aber Perl hat es geschafft, dass B ausgegeben wird. Obwohl keine Hashingsyntax verwendet wird und die Liste sogar eine Ungradezahl von Elementen enthält. Was, bitte? Aber wir werden dieses Verhalten später genauer untersuchen. Zwischenzeitlich ist es wichtig, dass das passiert, weil eine Liste kein Datentyp ist, sondern eine Liste ist nur ein Ausdruck. Da, um uns alle zu verbühren. Nachdem wir Liste als potenzielles Quelle für Probleme identifiziert haben, werden wir uns CGI-Module angucken. Es ist ein Kernmodul in PL52. Es ist mitverwendet, um Daten des Benutzers aus ATTB-Pabaremetern zu bekommen und Berechnungen darauf auszuführen. Genau wie der Rest von Perl gibt es, existiert es seit 15 Jahren. Gucken wir uns nun den Demo-Code an mit foo und bar als Parameter. Wenn wir jetzt eine Anfrage senden mit foo und bar, dann sehen wir, dass die Ausgabe, wie es erwartet ist. Wenn wir aber jetzt diesen Request senden, der die Argumente zweimal enthält, das Logische ist, dass Perl das Gleiche wieder ausgibt. Aber Perl und Logik funktionieren nicht gut miteinander und deswegen werden wir als Ausgabe zwei verschiedene Liste sehen. Wenn man jetzt also Multi-Werte in HTML verwendet, dann kann das Problem geben. Aber was sagt die Dokumentation dazu? Das ist ein Bildschirm-Ausschnitt der offiziellen Perl-Dokumentation. Kann man hier etwas sehen? Können Sie jetzt etwas sehen? Jetzt, die nachte Dokumentation, kann man fragen, einen Array zurückzubekommen. Wie tritt man es, in dem man nach einem Nicht-Array fragt, weil eine Liste kein Multi-Wert ist? Was? Was sagt OWASP dazu? Nach Ihnen tut das Perl-Modul nur die erste Auftreten nehmen. Das macht die Dokumentation und OWASP blind über eine HTT-Parameter-Überfüllungsattacke. Wir fangen jetzt also an, Listen zu misshandeln. Wir stecken sie in einen Hasch rein. Wir sehen, dass der Wert die Liste erstellt. Das ist, was wir erwarten. Wir würden erwarten, dass das Array zugewiesen wird. Aber der Hasch sieht danach so aus. Jetzt sieht es so aus, dass Inhalte der Liste als ein weiteres Paar in den Hasch eingefügt sind. Das passiert, weil Listen als eine Erweiterung von Hashes interpretiert werden. Das Implements ist einfach nur ein hübsches Komma. Weil niemand sich darum kümmert. Deswegen werden auch keine Probleme damit publiziert. Liste sind einfach nur total kaputt. CGI-Parameter können Listen werden. Wenn wir Listen in Hashes reinbacken, dann werden sie in Teile von dem Hash. Und all das ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Und es ist sehr, sehr wenig bekannt. Ausdrücke. Die E-Mails für neue User anzulegen, die werden darüber validiert, dass Tokens an die E-Mails geschickt werden. Danach wird ein Benutzer gefragt, ein Passwort und echten Namen anzugeben. Hier ist der Code, der das macht. Und dort wird genau diese Methode, die wir gerade besprochen haben, verwendet. Es wird ein Dictionary verwendet. Und an dieser Anstelle kann ein Liste eingesetzt werden. Was passiert ist also, wenn wir den Klarnamen auf Lolso setzen. Die Liste wird zu einem Hash umgewandelt und wenn wir dann diesen Request senden, dann diese Eingaben gesendet werden, dann plötzlich wird ein neuer Schlüssel erstellt und das Wert des Loginnahms wird überschrieben, obwohl er bereits gesetzt wurde. Und so kann man das Feld der E-Mail kontrollieren. Diese Verwundbarkeit hat an Mozilla's Baxilla war präsent und es ist eine sehr einfache Verwundbarkeit. Vielen Dank. Das ist eine super einfache Verwundbarkeit, die für über sieben Jahre dort war. Wiederholen wir, wieder. Lists sind massiv kaputt. Ich habe bis jetzt nur das gezeigt, was öffentlich war. Hashes sind der, kann aber nicht der einzige Platz sein, der verwundbar sein kann. Jetzt tun wir das Erweiterungsverhalten von Hashes auf eine neue Ebene führen und bisher unveröffentlichte Dinge zeigen. Eine Liste ist eine Funktion, die A, B und C bekommen und A, B und C ausgeben. Ratet, was passiert? Es gibt noch mehr. In einem regulären Aufruf oder Ausdruck mit A, B, C als Werten. Was passiert, wenn anstelle von dem String B eine Liste als Inhalt gegeben wird? Was passiert, wenn das jetzt in ein Array eingefügt wird und dann angezeigt wird? Aber was passiert? Dinge werden immer ausgewertet, wenn, was, es ist sehr fraglich. Jetzt versuchen wir es nochmal auf zwei Folien und, Perl, jetzt erzwingen wir, dass die Liste ein Multi Wert ist mit B und C als Element, so dass es ein Array sein muss. Wir tun jetzt, deswegen, dass es ein Array ist, dass B und C enthält. Aber Perl sagt, wieder, fuck off und B und C werden als zweites und drittes Argument ausgegeben. Das ist total verrückt. Wir haben also ein neues Argument erstellt mit Unterverwendung einer Liste. Es ist die gleiche Syntax, die wir verwendet haben, um ein irregulares Array zu machen. Perl kann das jetzt nicht ignorieren und es muss unsere Liste wie ein Erreber handeln. Aber nein. Perl überschreibt das dritte Argument mit hart kundiert etwas in die Liste. Total verrückt. Perl, unsere Liste erweitern, als ob sie mehrere Argumente für die Funktion enthält. Das ist komplett verrückt. Aber die Perl-Dokumentation sagt, dieses Verhalten ist kein Bug, sondern ein Feature. Ist es wirklich? Danke. Vielen Dank. Gucken wir uns DBI Quote an. Das ist ein Kernmodul seit 1994. Ich wurde in diesem Jahr geboren. Es ist das verbreitet zu Weg, um mit Datenbanken zu reden. Es ist so verbreitet und es ist die einzige Funktion, die für SQL Injections infrage kommt. Wie funktioniert Quote? Wenn ein regulärer Ausdruck eingegeben wird, dann wird der direkt in eine Query umgesetzt. Quote tut es für uns aber escapen, so dass es in der Query sicher benutzt werden kann. Jetzt probieren wir es mit einem regulären Ausdruck. In diesem Ausdruck tun wir einen CGI-Parameter verwenden uns unsere Query einfügen. So wird es an die CGI-Instanz übergeben. Wenn wir jetzt ein Apostrophen einfügen, dann wird der Quote es behandeln und so können wir jeden böshaften SQL-Ausdruck ein Ich denke es ist Zeit für eine Live-Demo. Was wir jetzt hier haben, dass mich eine Sekunde probieren. Das ist ein Quote, den ich hergestellt habe. Könnt ihr sehen? Wie kann ich das denn hier vergrößern? Also funktioniert nicht. Seht ihr den Code? Wir erstellen die Variablen, dann machen wir eine Verbindung zur Datenbank und dann drucken wir den Query, den wir in der Präsentation verwendet Hier läuft es. Oh, oh, etwas ist passiert, etwas ist passiert Perle krasst mein PC, in Larjet. Was soll ich da machen? Ich werde den Notpad copyieren. Was ich jetzt sende, ist dieses Request. Was ist der Request hier in Gelb? Ich sende dieses Request. Okay. Jetzt lasst uns das Ergebnis anschauen. Das funktioniert nicht auf zwei Monitor. Nein, die Front kann ich nicht größer machen. Vielleicht kann ich es doch größer machen. Ja, es funktioniert nicht. Das funktioniert nicht. Es geht einfach zurück nach der Präsentation, wenn ich es schaue. Oh nein, es funktioniert. Jetzt wird es größer wunderbar. Ja, und das ist, wie du es schaust. So, ihr springt das Selekt aus. Das hat es jetzt ausgegeben. Und alles ist gut. Jetzt schicken wir Admin-Apostrophe. Wir versuchen, ein Apostrophe einzufügen. Und das hat auch funktioniert. Wir haben es nicht geschafft, was einzufügen. Ich sende dieses Request. Und jetzt schicke ich diesen Request. Glückwunsch, Pearl. Viel Glück, Pearl. Das ist unser Ergebnis. Nein, das ist das Ergebnis. Ja, SQL inject everything. Jetzt kann man mit ein SQL Injection Attack machen. Wir haben es geschafft, das Escaping zu umgehen, weil es sich um zwei Argumente handelt in dieser Funktion. Wenn irgendjemand das Type Argument verwandt, dann würde es der Funktion helfen. Aber ich habe noch nie gesehen, dass irgendwo verwendet wurden. Und diese Konstanten für den Typ, die sind in der Modul definiert. So, diese Konstanten sind Zahlen 1 bis 8. Und als wir diese Zahl als zweites Argument eingefügt haben, hat Pearl hier in dieser Funktion, das als ein Literal interpretiert und direkt zurückgegeben, ohne das im Code zu schicken. Das ist der zweite Fail in dieser Funktion. Jetzt fragt ihr euch, was man dann alles damit machen kann. Das hier sind die ganzen Sachen, die man damit anstellen kann. Und das ist nur ein ganz kleiner Teil von dem, was man wirklich machen kann, wenn man sich die Mühe machen würde, das auf alle andere Software anzuwenden und die zu exploiten. Sucht einfach nur nach CGI und Quote in GitHub und dann überlegt mal, was ihr damit anstellen könnt. Zusammenfassung. Listen sind gefährliche, sonderbare Ausdrücke. Pearl ist eine sonderbare, gefährliche Sprache. Jetzt müssen wir sofort aufhören, Pearl zu verwenden. Ihr sollt aufhören, write only Code zu schreiben. Stop the missfunctional and complicated OOP. Ihr sollt auch aufhören, das nicht funktionierende Objektorientierung zu verwenden. Und ihr sollt auch aufhören, diese ganzen Security Preaches einzubauen, indem ihr Pearl verwendet. Vielen Dank. Wir kommen nun zur Fragerunde, bitte stellt euch an den Mikrofon auf. Wir sind bereit, die Fragen entgegenzunehmen. Haben Sie Fragen? Das Internet hat Fragen. Ja, wir haben eine Frage. Das Internet fragt, kann Ron das umgehen mit richtiger Benutzervalidierung und strikten Ende-zu-Ende-Warnungen? YouStrike tut überhaupt nichts in diesem Fall. Das CGI gibt einfach nur eine Liste zurück. Für den zweiten Teil, nachdem wir in Bakzilla das Ganze berichtet haben, ist eine neue Version von CGI herausgegeben worden, die versucht hat, dieses Verhalten einzuschränken. Aber tatsächlich gibt es nur eine Warning aus, aber behebt nicht das Problem. Vielen Dank für die Information, aber Schützen tut es nicht. Microfon 2? Ja, ich werde der erste Verrückte sein, der hier Pearl mag. Kannst du bitte auf die Zusammenfassung gehen, auf die Vorhergefolge? Wenn du sagst, Lists sind zu viel. Wenn du sagst, Lists sind zu viel. Dann solltest du beachten, dass Lists und Argument-Calls komplett verschiedene Dinge sind. Du hast versucht, Lists wie Python-Arrays zu verwenden, und wenn du das willst, solltest du Python-Arrays verwenden. Ich weiß, es ist nur eine Opinion, es ist so, wenn du das willst, das ist so, wenn du das willst, das ist so, wenn du das willst. Ich stimme zu, das sollte man machen, man sollte Python verwenden. Ich denke, das ist zwar nur eine Meinung, aber du hast hier zwei Funktionen gefunden, die sehr schlecht designt wurden. Ja, du kannst es gerne versuchen, auf den Programm hierzu zu schieben. Warum haben wir denn Listen, wenn wir Arrays haben wollen? Warum macht ihr überhaupt Listen, wenn es sie gar nicht gibt? Es sind keine Ausdrücke, warum habt ihr sie überhaupt? Ja, zuerst vielen Dank für den Talk. Es war sehr unterhaltsam. Hast du irgendeine Vorstellung, warum es so lange gebraucht hat, bis jemand darauf gestoßen ist? Ich weiß es nicht. Weil was? Weil es eine write-only-Sprache ist. Ja, vielen Dank für den tollen Vortrag. Ich habe lange Zeit nicht mehr ein Poll programmiert, deswegen vielleicht ist es eine dumme Frage. In meinem Code waren keine Warnings an, und US-Trict macht überhaupt nichts. Es gibt nur Warnungen aus. Es gibt nur Warnungen aus. Es ist ein Single-Value-Parameter. Aber es ist eigentlich Warnung. Wenn ich zuerst die Warnungen verwende, habe ich mir gedacht, wenn eine Warnung kommt, dass es wirklich ernst ist. Ich kann die Warnungen einschalten und dieses Skript wird wunderbar funktionieren. Eine andere Frage aus dem Internet. Wie kann man diese Fehler vermeiden in Anwendungen, die schon in Perl geschrieben sind? Um das hier zu verhindern, muss man jeden CGI-Parameter als ein Skalabahandeln. Wenn du eine Erregung oder eine Hasche oder eine Erregung oder eine Erregung in eine Funktion reinstecken willst, musst du ein Backslash vor die Referenz machen. Also als Minimum. Oder aber man muss es in einen Skalal reinstecken. Das Beispiel mit ... Ich verwende es üblicherweise. Es ist eine Erregung, in der man das Skalal verwendet, bevor präpertes Statement. Man kann mehr Werte zu der präpertes Statement, als Result von diesem. Man kann alles in eine Funktion reinstecken, wenn man sie in eine Liste insertiert. Wenn du ein Argument hast, kannst du in eine Funktion alles Mögliche einfügen. Und wenn du einen Apostrophe einfügst, dann kannst du alles, was danach kommt, kontrollieren. Ich wollte nur fragen, ob du weißt, was Referenzen sind und ob du die DPI Handbuchseite gelesen hast. Ja. Ja, jetzt hacke ich dir ja auf ein Prepare und Quote rum. Das ist obviously bad programming, aber er hat zwar richtig, dass es schlechte Programmierer-Disziplin ist. Aber was er hier tut, ist, er schiebt es auf den Programmierer, wo er es in der Sprache haltet lösen könnte. Logisch sollte es funktionieren. Und es ist auch ... DPI ist in der ersten Chapter. Und es ist auch dokumentiert. Und DPI ist im ersten Handbuch. Das ... Das ist ein S-Home-Microphone. Ich kann das nur wiederholen, Listen auszurollen in Argumenten. Es steht ... Es ist im Sprachdesign enthalten. Das mit den RR-Referenzen? Ist klar, aber ... Aber das Design dieses CGI-Modul ist schlecht. Ich stelle mir zu, dass das eine schlechte Programmierung ist. Und das machen alle. Selbst wenn wir 20 Jahre alt sind, ist das schlecht. Ich stelle mir zu, dass das eine schlechte Programmierung ist. Und das machen alle. Selbst wenn du 20 Jahre in Pearl programmiert hast, dann findet man es immer noch in Burgzeller drin. Und das ist ... was dieses Problem mit uns macht. Meine Eindruck von dem, was hier passiert ist, dass man einen komischen Wert hat, der mit der Syntax-Zulaufzeit verändern kann. Kennst du irgendeine andere Sprache? Wenn es noch mehr Fragen gibt, dann werde ich noch mehr Präsentationen machen. Ich weiß keine. Danke. Danke. Danke.