Tanja: Sicherheitslücken

Hi alle zusammen,
ich bastel viel und gerne in PHP und erst kürzlich wurde mein Forum (es ist das phpbb) gehackt. Nunfrag ich mich, wie konnten die in den Adminteil eindringen ? Worauf muss man achten, um sicher zu sein ?!

Eure -Tanja-

  1. Hoi,

    ich bastel viel und gerne in PHP und erst kürzlich wurde mein Forum
    (es ist das phpbb) gehackt. Nunfrag ich mich, wie konnten die in den
    Adminteil eindringen ? Worauf muss man achten, um sicher zu sein ?!

    Nun, das ist kein triviales Thema mehr. Dazu gibt es viele Artikel.
    Das Wichtigste vielleicht im Ueberblick:

    • Variablen *immer* initialisieren! Nicht-Initialisierte Variablen
        koennen in PHP zu unvorhergesehenen Ergebnissen fuehren (Stickwort:
        Importierung von URL-Parametern in den globalen Namensraum).

    • User-Eingaben *immer* validieren! Nicht-validierte User-Eingaben
        sind in jeder Sprache ein Problem. Die koennen zu "einfachen"
        Sachen wie dDoS bis hin zu ernsthaften Problemen fuehren.

    • Passwoerter *immer* am besten verschluesselt oder, falls das nicht
        moeglich ist, per POST uebertragen. Aber auf KEINEN Fall per GET.
        Unverschluesselte Passwoerter werden im Klartext ueber das Internet
        geschickt und koennen im Grunde ueberall mitgeloggt werden. Bei
        einer GET-Uebertragung tauchen sie zusaetzlich noch in allen
        moeglichen und unmoeglichen Logdateien auf.

    • Nach jedem Login wieder ausloggen! Wartest du auf einen
        Session-Timeout, statt dich auszuloggen, kann deine Session-ID
        benutzt werden, um Administrations-Zugriff zu erlangen.

    • Bei *allen* hoehoergestellten Funktionen sicherstellen, dass der
        User, der sie ausloest, auch die Rechte dazu hat! Dazu gehoert auch
        eine eindeutige Identifikation.

    Tja, mehr faellt mir jetzt aus dem Stand auch nicht ein, sorry.
    Aber mit der Zeit solltest du selbst ein Gespuehr dafuer entwickeln
    und "wissen", was sicher oder unsicher ist.

    Gruesse aus dem schoenen LH,
     c.j.k

    1. Hi,

      Tja, mehr faellt mir jetzt aus dem Stand auch nicht ein, sorry.

      mir auch nicht - das ist schon mehr, als ich genannt hätte. Den ersten Punkt möchte ich aber noch etwas deutlicher machen:

      • Variablen *immer* initialisieren! Nicht-Initialisierte Variablen
          koennen in PHP zu unvorhergesehenen Ergebnissen fuehren (Stickwort:
          Importierung von URL-Parametern in den globalen Namensraum).

      Insbesondere heißt das: *Kompletter* Verzicht auf "magische" Variablen mit nicht allgemein(!) feststehendem Namen, besonders auf die schon erwähnten URL-Parameter, aber auch Environment-Werte wie $HTTP_REFERER etc. Benutze je nach Bedarf $HTTP_GET_VARS, $HTTP_POST_VARS und die Funktion getenv().

      Aber mit der Zeit solltest du selbst ein Gespuehr dafuer entwickeln
      und "wissen", was sicher oder unsicher ist.

      Genau. Meminisse: Sicherheit ist kein Ziel, sondern ein Weg. Es ist nicht möglich, ein System _sicher_ zu machen - Du kannst es nur immer _sicherer_ gestalten. Von Anfang an bei jedem Schritt am Ball zu sein ist das Geheimnis.

      Cheatah

      1. Hoi,

        • Variablen *immer* initialisieren! Nicht-Initialisierte
            Variablen koennen in PHP zu unvorhergesehenen Ergebnissen
            fuehren (Stickwort: Importierung von URL-Parametern in den
            globalen Namensraum).

        Insbesondere heißt das: *Kompletter* Verzicht auf "magische"
        Variablen mit nicht allgemein(!) feststehendem Namen, besonders auf
        die schon erwähnten URL-Parameter, aber auch Environment-Werte wie
        $HTTP_REFERER etc. Benutze je nach Bedarf $HTTP_GET_VARS,
        $HTTP_POST_VARS und die Funktion getenv().

        Nun, in Bezug auf die GET- und POST-Parameter das sehe ich etwas
        anders. Ich glaube, es reicht, die User-Eingaben (also die GET- und
        POST-Variablen) zu validieren. Allerdings muss ich dir recht geben,
        wenn du sagst, Scripte, die $HTTP_POST_VARS, $HTTP_GET_VARS und
        $HTTP_POST_FILES benutzen, sind besser lesbar. Dasselbe gilt IMHO
        fuer $HTTP_SESSION_VARS und getenv().

        Aber mit der Zeit solltest du selbst ein Gespuehr dafuer
        entwickeln und "wissen", was sicher oder unsicher ist.

        Genau. Meminisse: Sicherheit ist kein Ziel, sondern ein Weg.

        Netter Spruch ;-)

        Gruesse aus dem schoenen LH,
         c.j.k

        1. Sup!

          Also, ich kenne eine PHP Seite, die bastelt das Seiten-Layout mit einem PHP-Skript, den jeweiligen Inhalt der Seite kann man per Parameter angeben. Dieser Parameter sollte eigentlich auf eine lokale Seite zeigen, aber entfernte URLs gehen auch - damit kann man beliebigen PHP-Code mit den Rechten der PHP-Seite ausführen lassen... tja... seit einigen Tagen stehen merkwürdige Nachrichten in den News dieser Seite...

          Gruesse,

          Bio

          1. Hoi,

            Also, ich kenne eine PHP Seite, die bastelt das Seiten-Layout mit
            einem PHP-Skript, den jeweiligen Inhalt der Seite kann man per
            Parameter angeben. Dieser Parameter sollte eigentlich auf eine
            lokale Seite zeigen, aber entfernte URLs gehen auch

            Der fdopen-Wrapper schlaegt zu ;-)

            • damit kann man beliebigen PHP-Code mit den Rechten der PHP-Seite
              ausführen lassen... tja... seit einigen Tagen stehen merkwürdige
              Nachrichten in den News dieser Seite...

            Darum sage ich, man muss *alle* Parameter validieren.

            Gruesse aus dem schoenen LH,
             c.j.k

          2. Sup!

            Also, ich kenne eine PHP Seite, die bastelt das Seiten-Layout mit einem PHP-Skript, den jeweiligen Inhalt der Seite kann man per Parameter angeben. Dieser Parameter sollte eigentlich auf eine lokale Seite zeigen, aber entfernte URLs gehen auch - damit kann man beliebigen PHP-Code mit den Rechten der PHP-Seite ausführen lassen... tja... seit einigen Tagen stehen merkwürdige Nachrichten in den News dieser Seite...

            :-)
            Tja sowas passiert. Ich weis von einer Seite wo man die Möglichkeit hat, als Besucher Bilder hochzuladen - Das ist zumindest das, was man damit machen soll. Pech nur, das auch PHP Dateien beliebiger sorte hochladbar sind. Es kamen dann z.B. erstaunliche Meldungen im Forum vor, von Leuten, die es entweder gar nicht gab, oder aber die steif und fest behaupten niemals einen derartigen Text geschreiben zu haben. Das Forum benutzt eine MySQL Datenbank...

            Wie man nun die Möglichkeit PHP Dateien hochzuladen und auszuführen nutzt um an den Benutzernamen und das Passwort des Datenbankusers für das Forum zu gelangen, überlasse ich dem Ideenreichtum des Lesers...

            Dann gab es noch die eine oder andere Änderung an Bildern und sonstigen Inhalten der Seite...

            Alles nur wegen eines schlecht gemachten Upload-scripts...

            bye
            ich

      2. Gudde!

        • Variablen *immer* initialisieren! Nicht-Initialisierte Variablen
            koennen in PHP zu unvorhergesehenen Ergebnissen fuehren (Stickwort:
            Importierung von URL-Parametern in den globalen Namensraum).

        Insbesondere heißt das: *Kompletter* Verzicht auf "magische" Variablen mit nicht allgemein(!) feststehendem Namen, besonders auf die schon erwähnten URL-Parameter, aber auch Environment-Werte wie $HTTP_REFERER etc. Benutze je nach Bedarf $HTTP_GET_VARS, $HTTP_POST_VARS und die Funktion getenv().

        Ich komme mir gerade irgendwie bloede vor, weil ich seit zwei Jahren mit PHP programmiere, aber irgendwie die obenstehenden Zeilen ueberhaupt nicht raffe, wahrscheinlich habe ich immer einfach zu lax programmiert. Ich waere aber doch ziemlich froh ueber ein klitzekleines Quelltext, was denn "magische", "nicht-initialisierte" und Variablen mit "nicht _allgemein_ feststehenden Namen" gemeint sind. Redet ihr von den $$vars?

        Und was bieten sich denn dort fuer Sicherheitsluecken?

        Gruesse

        gr@phics.de