Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] include() von absolutem Pfad

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] include() von absolutem Pfad

    Hallo,

    ich bin Neuling und nun meine erste Frage in diesem Forum. Ich bitte um Nachsicht, wenn ich nicht alle (strengen) Forenregeln eingehalten habe.

    Ich sorge mich darum, ob ein Hacker Zugriff auf PHP-Dateien mit sensiblen Inhalten (z.B. Datenbank-Connect inkl. Passwort) bekommen könnten. Wenn es gelingt den PHP-Parser auszutricksen, werden die Dateien ja lesbar zum Download angeboten.

    Ich habe nun solche Dateien in ein Verzeichnis oberhalb des Stammverzeichnisses der Webseite abgelegt und binde sie mit
    PHP-Code:
    include('/irgendwas/nochwas/includes/sensible_datei.php'
    in die index.php ein.

    Zwei Fragen:

    1. Ist das Austricksen des PHP-Parsers im Stammverzeichnis wahrscheinlich (z.B. durch Einschleusen einer .htaccess mit php_value engine off)?

    2. Bietet meine Lösung wirklich höhere Sicherheit oder öffne ich neue Lücken (z.B. wenn jemand den absoluten Pfad auslesen kann)?

    Bin gespannt, wie sich hier die Tipps ergeben. Danke schon mal.


  • #2
    Zitat von HeinrichK Beitrag anzeigen
    Ich sorge mich darum, ob ein Hacker Zugriff auf PHP-Dateien mit sensiblen Inhalten (z.B. Datenbank-Connect inkl. Passwort) bekommen könnten. Wenn es gelingt den PHP-Parser auszutricksen, werden die Dateien ja lesbar zum Download angeboten.

    Ich habe nun solche Dateien in ein Verzeichnis oberhalb des Stammverzeichnisses der Webseite abgelegt und binde sie mit
    PHP-Code:
    include('/irgendwas/nochwas/includes/sensible_datei.php'
    in die index.php ein.

    Zwei Fragen:

    1. Ist das Austricksen des PHP-Parsers im Stammverzeichnis wahrscheinlich (z.B. durch Einschleusen einer .htaccess mit php_value engine off)?
    Wenn sowas auf Deinem Server/Webspace möglich ist, ist das "austricksen" von PHP Dein geringstes Problem!

    2. Bietet meine Lösung wirklich höhere Sicherheit oder öffne ich neue Lücken (z.B. wenn jemand den absoluten Pfad auslesen kann)?

    Wenn die sensiblen Daten in einer anderen Datei (vorteilhaft ist außerhalb Dokument-Root) liegen. würde bei deaktivierten PHP der Code angezeigt werden der diese einbindet. Das ist natürlich kein wirkliches Sicherheitsproblem, da nach nicht wirklich was von extern damit anfangen kann.

    Allerdings impliziert Dein Posting, das bereits jemand in Deinen Server/Webspace unberechtigt eingedrungen ist um eine Datei/Config zu platzieren. Da erübrigt sich natürlich das nachdenken darüber, da das bereits das schlechtest mögliche Szenario ist und in sochen fällen sicher kein PHP parser erst genutzt wird um zu schauen ob da irgendwo sensible Daten sind.

    Zitat von HeinrichK Beitrag anzeigen
    Bin gespannt, wie sich hier die Tipps ergeben. Danke schon mal.
    Da gibts eigentlich nicht sonderlich viel zusagen. Ist ja bereits worst case.

    MfG, Ulf
    PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

    Kommentar


    • #3
      Wenn die sensiblen Daten in einer anderen Datei (vorteilhaft ist außerhalb Dokument-Root) liegen. würde bei deaktivierten PHP der Code angezeigt werden der diese einbindet.
      Bei deaktiviertem PHP würde ein include gar nicht erst funktionieren und somit auch die Inhalte der einzubindenden Dateien NICHT im Klartext angezeigt.
      Somit ist ausserhalb von WebRoot sinnvoll, da zum indest über HTTP die Dateien nicht direkt aufgerufen werden können.

      EDIT
      Bei nochmaligem Lesen der zitierten Sätze, fällt mir auf, daß das, was ich schrieb vermutlich damit gemeint war...
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

      Kommentar


      • #4
        Danke für eure Antworten!

        @Ulfikado

        ja, es gab Eindringlinge in zwei meiner Webseiten. Das hier von mir genannte Ablegen von sensiblen Dateien außerhalb des Webroot ist ein Teil der Absicherung.

        Ich werde in Kürze nochmal Fragen stellen, wie gescheit meine anderen Maßnahmen sind (z.B. §_GET / §_POST-Eingaben kontrollieren).

        Wobei ich glaube, dass das Loch wohl eher beim alten (bisher verwendeten) FCKEditor (Filemanager) lag. Der ist rausgeflogen.

        Kommentar


        • #5
          Ich werde in Kürze nochmal Fragen stellen, wie gescheit meine anderen Maßnahmen sind (z.B. §_GET / §_POST-Eingaben kontrollieren).
          Das ist nicht nur gescheit, sondern Deine Pflicht als Programmierer!
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #6
            Das sehe ich wie du, Arne! Die Frage ist nur, ob's auch gescheit gemacht ist. Hier mein Verfahren.

            Ich prüfe, ob ein erlaubter $_GET-Parameter verwendet wird.

            PHP-Code:
            // Vorhandene URL-Parameter
            $param_allowed = array("id""tit""pol_id""op");
            // eingebene
            $key parse_str($_SERVER['QUERY_STRING'], $key_array);
            foreach (
            $key_array as $param => $wert) {
                    if (!empty(
            $param) and !in_array($param$param_allowed)) {             
                    echo 
            "<p>falsche Eingabe</p>";
                    echo 
            "<a href='"._URL."' target='_self'><h3>Zur Hauptseite</h3></a>";
                    exit;
                    }

            Gibt nun jemand was anderes ein, als im Array $param_allowed notiert, bricht das Script ab.

            Dann prüfe ich die Werte der Parameter.
            PHP-Code:
            // FUNKTION Anti-SQL-Injection
            function param_check($id$tit$pol_id$op) {

            // Parameter "tit"
                
            $such mysql_query("SELECT titel FROM ".TAB_BUCH." GROUP by titel;");
                 
                       while (
            $zeile mysql_fetch_object($such)) {
                       
            $titel $zeile->titel;               
                           if (!empty(
            $titel)) {
                        
            $array_titel[] = $titel;
                           }
                       }
                
            $tit=preg_replace('/["\'<>]/'''strip_tags($_GET['tit']));
                if (!empty(
            $tit) and !in_array($tit$array_titel)) {                     
                echo 
            "<p>Not allowed</p>";
                exit;
               }
               
            //Parameter "id"
                
            if (!empty($id) and !is_numeric($id) or !empty($id) and strlen($id)>"2") {             
                echo 
            "<p>Not allowed</p>";
                exit;
               }
               
            // Parameter "pol_id"
                
            if (!empty($pol_id) and !is_numeric($pol_id) or !empty($pol_id) and strlen($pol_id)>"2") {             
                echo 
            "<p>Not allowed</p>";
                exit;
               }
               
            // Parameter "op"
                
            if (!empty($op) and !is_numeric($op) or !empty($op) and strlen($op)>"2") {             
                echo 
            "<p>Not allowed</p>";
                exit;
               }    
            // Ende FUNKTION Anti-SQL-Injection 
            Also einmal mit Whitelist, alle anderen, ob sie numerisch sind und nicht mehr als zweistellig (reicht bei meiner überschaubaren Webseite). Die function wird in der index.php als allererstes aufgerufen.

            Die $_POST-Eingaben prüfe ich mit:
            PHP-Code:
            $eintrag=preg_replace('/["\'<>]/'''strip_tags($_POST['eintrag'])); 
            Nun die spannende Frage, ob das ausreichend hilft, böse Buben fern zu halten. Danke schon mal für Tipps.

            Kommentar


            • #7
              Zitat von HeinrichK Beitrag anzeigen
              Danke für eure Antworten!

              @Ulfikado

              ja, es gab Eindringlinge in zwei meiner Webseiten. Das hier von mir genannte Ablegen von sensiblen Dateien außerhalb des Webroot ist ein Teil der Absicherung.

              Ich werde in Kürze nochmal Fragen stellen, wie gescheit meine anderen Maßnahmen sind (z.B. §_GET / §_POST-Eingaben kontrollieren).

              Wobei ich glaube, dass das Loch wohl eher beim alten (bisher verwendeten) FCKEditor (Filemanager) lag. Der ist rausgeflogen.
              Bist du Jurist? §_GET ist absolut sicher, das gibt immer einen Syntax Error

              Zu deinen Sicherheitsbestrebungen:
              Also nutze erst einmal mysqli oder besse gleich pdo und nutze die prepaired Statements, die sind am sichersten. Integer Werte sind ungefählrich wenn du sie mit (int) castest. Strings mit mysqli_real_escape_string oder so, oder eben prepaired Statements.
              gegen XSS einfach alle ausgaben, die vom User stammen mit htmlentitis escapen und dann kann auch nichts passieren
              Fatal Error: Windows wird gestartet

              Wie administriert man ein Netzwerk: Beispiel

              Kommentar


              • #8
                Danke Unlikus!

                Aber was sollen mir diese Worte sagen (ich bin auch kein Pfarrer)?
                Bist du Jurist? §_GET ist absolut sicher, das gibt immer einen Syntax Error
                Mit dem mysql-Thema muss ich mich noch befassen. Nur habe ich gelesen, dass mysqli erst ab PHP 5.5. unterstützt wird. Mein Hoster fährt allerdings nur 5.3. und 5.4. Sehe ich's richtig, dass ich noch Zeit habe, mich schlau zu machen?

                Kommentar


                • #9
                  Zitat von HeinrichK Beitrag anzeigen
                  Danke Unlikus!

                  Aber was sollen mir diese Worte sagen (ich bin auch kein Pfarrer)?
                  Anstelle von §_GET nimm $_GET, ersteres kennt PHP nicht, das braucht das Dollar-Zeichen.

                  Kommentar


                  • #10
                    Oh Gott, jetzt werde ich doch Pfarrer - das ist ein Schreibfehler hier im meinem Post - gewiss nicht in meinen Scripten.

                    Bisserl mehr inhaltliche Rückmeldung zu meinen geposteten Scriptteilen wäre schon schön. (wobei ich dass von Unlikus bez. mysql und htmlentities schon berücksichtigen werde)

                    Kommentar


                    • #11
                      mysqli wird auch schon seit 5.0 unterstützt, mysql ab 5.5 oder so gar nicht mehr. (ohne gewähr, aber 5.3 unterstützt es auf jeden Fall)
                      Fatal Error: Windows wird gestartet

                      Wie administriert man ein Netzwerk: Beispiel

                      Kommentar


                      • #12
                        Hast recht Unlikus, ich werde mich mal mit mysqli befassen.

                        Bin aber weiterhin an Rückmeldungen zur eigentlichen Frage interessiert - nämlich ob meine Komtrollen der $_GET- / $_POST-Parameter gescheit sind. Danke!

                        Kommentar


                        • #13
                          kompliziert ist immer etwas heikel. Sicherheit muss einfach sein. Und das wären prepaired Statements. Oder auch einfach klassisch mysqli_real_escape_string(), oder bei integern (int).
                          Fatal Error: Windows wird gestartet

                          Wie administriert man ein Netzwerk: Beispiel

                          Kommentar


                          • #14
                            Ich wüsste nicht, was an is_numeric() und die Länge des strings auf 2 zu begrenzen so kompliziert ist. Und eine Whitelist zu verwenden, ist wohl das sicherste Mittel überhaupt.

                            Aber lassen wir's dabei, solange niemand konkret sagt, in meinen Lösungen sei eine Lücke (und dann bitte auch welche). "immer heikel" ist nicht sehr hilfreich.

                            Insgesamt aber dank ich dir für deine Hinweise; da kann ich schon was dazu lernen.

                            Kommentar


                            • #15
                              mir ist deine Funktion einfach ein bischen suspekt, weil kompliziert. Sag mal genau, was du als Wert erwartest (was valid ist), und ich glaube das kann man schneller und einfacher implementieren
                              Fatal Error: Windows wird gestartet

                              Wie administriert man ein Netzwerk: Beispiel

                              Kommentar

                              Lädt...
                              X