Ankündigung

Einklappen
Keine Ankündigung bisher.

eval()

Einklappen

Neue Werbung 2019

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

  • eval()

    Hallo,

    ich weiß natürlich das eval() absolut unschön ist und das man dies aus gutem Grund nicht verwenden sollte.
    Leider kann ich mir das Aktuell grade nicht aussuchen, daher würde mich jetzt Interessieren ob folgendes Beispiel eventuell Angreiffbar ist.

    PHP-Code:
    <form action="" method="post">
      <input type="test" name="hack" />
      <input type="submit" name="submit" value="Greif mich an" />
    </form>
    <?php
    $php 
    'echo "<pre>";
    print_r($_POST);
    echo "</pre>";
    if(isset($_POST["submit"])){
      echo "</br>Absenden erfolgreich<br />";
      echo($_POST["hack"]);
    }'
    ;
    eval(
    $php);
    Also mich Interessiert jetzt genau genommen ob irgendwer in der Lage wäre z.B. den PHP Code der durch eval ausgeführt wird zu manipulieren.

  • #2
    Ja.

    Nie, ich wiederhole: NIE, benutzergenerierten Content ohne vorhergehende ausreichende Validierung weiternutzen, geschweige denn zur Ausführung bringen.
    Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

    Kommentar


    • #3
      Nie, ich wiederhole: NIE, benutzergenerierten Content ohne vorhergehende ausreichende Validierung weiternutzen, geschweige denn zur Ausführung bringen.
      Das ist mir schon klar, dass ich eingaben validieren muss, aber in wie weit muss ich hier z.B. $_POST["hack"] validieren.
      Normalerweise würde ich prüfen ob es empty ist etc. also auf Logik überprüfen. Und dann natürlich mit z.B. mysql_real_escape_string in die schreiben. Bei der Ausgabe solcher Daten dann auch Escapen.

      Aber was müsste ich genau machen um zu verhindern das eval zu einem Sicherheitsproblem wird?

      Kommentar


      • #4
        Gut, in deinem Fall ist das vielleicht so nicht ganz korrekt, da der User-Input nicht direkt ausgeführt wird, aber du solltest dennoch nie irgendwelche POST- oder GET-Inhalte in eval() schreiben. Ein Fehler und schon übernimmt ein findiger Bösewicht dein System.

        Mich würde aber mal interessieren, warum du hier um eval() nicht herumkommst. Dieses Beispiel sieht irgendwie nach einem ziemlich überflüssigen Gebrauch von eval() aus.
        Im Übrigen solltest du vor der Ausgabe noch ein htmlspecialchars() anwenden.
        Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

        Kommentar


        • #5
          Das ist schwierig. Ich würd gar nicht erst versuchen da weiter zu machen, schreib deine Anwendung sauber, überleg dir wie du dein Problem anders lösen kannst, ich wette es gibt definitiv eine bessere Lösung.

          Kommentar


          • #6
            Zitat von Creator Beitrag anzeigen
            ich weiß natürlich das eval() absolut unschön ist und das man dies aus gutem Grund nicht verwenden sollte.
            Leider kann ich mir das Aktuell grade nicht aussuchen, daher würde mich jetzt Interessieren ob folgendes Beispiel eventuell Angreiffbar ist.
            Gerade dann, wenn dir das Gefahrenpotential nicht bewusst ist, solltest du absolut die Finger davon lassen.

            Dein gezeigter Code ist nur deshalb nicht direkt angreifbar, weil
            PHP-Code:
              echo($_POST["hack"]); 
            innerhalb eines mit Hochkommata begrenzten Strings steht, und deshalb $_POST["hack"] nicht durch den Wert ersetzt wird, sondern die Zeichen so da stehen bleiben.

            Sobald du aber
            PHP-Code:
            ' ... echo('.$_POST["hack"].'); ...' 
            daraus machst - und das wirst du ja vermutlich beabsichtigt haben, dass der Wert der Variablen dort eingesetzt wird - ist das extrem gefährlich.

            Übermittle für $_POST["hack"] doch einfach mal aus dem Formular heraus die Zeichenkette
            Code:
            unlink('index.php')
            ... und, was passiert wohl?


            Also, absolut Finger weg von eval, wenn die Grundkenntnisse noch so gering sind, dass du diese Frage in der Form überhaupt stellen musst.
            [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

            Kommentar


            • #7
              Aber was müsste ich genau machen um zu verhindern das eval zu einem Sicherheitsproblem wird?
              User-Code NICHT ausführen.

              Es kann beliebiger Code eingefügt werden. Es ist dann auch nicht mehr abhängig von nicht-escapten Spezialzeichen, um den Code einzuschleusen, sondern er IST bereits drin - und dann kann er alles machen: Dateien löschen, Inhalte/Viren/Trojaner aus dem Netz nachladen, Passwörter ausspähen, etc.

              Der "Schutz" gegen Injections beruht darauf, es nicht soweit kommen zu lassen, das jemand Code einschleust - dein Code ist ein himmelweit geöffnetes Tor.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                und für was brauchst du an der Stelle eval? lässt sich doch auch ohne machen
                DevBlog|3D Online-Shopping|Xatrium

                Kommentar


                • #9
                  Ich arbeite sauber und brauche eval nie.
                  Jetzt bin ich einfach in der Situation, das ich ein bestehendes System erweitern muss.
                  Das System baut auf XML, XSL etc auf. und PHP Code ( meine erweiterungen ) werden Stumpf durch eval gejagt. Mir gefällt das absolut nicht.
                  Aber es geht leider nicht immer nach dem was einem gefällt oder nicht.

                  Kommentar


                  • #10
                    PHP-Code:
                    ' ... echo('.$_POST["hack"].'); ...' 
                    Ist das Beispiel nicht etwas unsinnig?
                    Ich übergebe reinen PHP Code an eval und bau den PHP code nicht erst zusammen!
                    Damit ist doch eigentlich sichergestellt, dass eingaben wie unlink('index.php') nicht funktionieren, weil es ein String ist. Als Angreifer müsste ich in der Lage sein den String ( PHP Code ) erst zu unterbrechen mit ' oder " das ist er aber doch nicht.
                    Also kann der eingegeben Code auch nie ausgeführt werden.

                    Kommentar


                    • #11
                      Ich verstehe trotzdem noch nicht wieso es keinen anderen Weg gibt. Du machst irgendwas mit XML und XSL ... aber wo brauchts dann eval()? Vlt. erläuterst du uns das ein bisschen genauer, dann können wir dir vlt. einen alternativen Weg aufzeigen.

                      Kommentar


                      • #12
                        Zitat von Creator Beitrag anzeigen
                        PHP-Code:
                        ' ... echo('.$_POST["hack"].'); ...' 
                        Ist das Beispiel nicht etwas unsinnig?
                        K.A. - ich ging davon aus, dass deins unsinnig wäre ...

                        Ich übergebe reinen PHP Code an eval und bau den PHP code nicht erst zusammen!
                        Na ja, wozu dann überhaupt das Formular im Beispiel?
                        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                        Kommentar


                        • #13
                          Na ja, wozu dann überhaupt das Formular im Beispiel?
                          Zeigt das Beispiel irgendwo das der PHP Code erst zusammengebaut wird?
                          Das Form war eigentlich da um zu testen ob man es schafft den String ( PHP Code ) der an eval übergeben wird unterbrechen kann um dann seinen eigenen Code ein zu binden.

                          Kommentar


                          • #14
                            Wenn der String nicht verändert werden kann (weil keine Variablen drin vorkommen) dann natürlich nicht. Die Frage ist nur wieso sollte man dann einen statischen String in PHP verwenden, da kannste gleich den Code reinschreiben.

                            Sobald der Code aber nicht mehr als String eingetragen ist sondern wo anders her kommt wirds sehr gefährlich, heißt wenn er irgendwo übergeben wird (Datenbank, XML) und da der User rumpfuschen kann ...

                            Kommentar

                            Lädt...
                            X