Ankündigung

Einklappen
Keine Ankündigung bisher.

If Statement manipulieren (Login)

Einklappen

Neue Werbung 2019

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

  • If Statement manipulieren (Login)

    Hallo,

    ist es möglich eine einfache Passwortabfrage durch die Nutzereingabe zu manipulieren? Ähnlich wie bei SQL Injections?

    Hier ein Beispiel:

    PHP-Code:
    if($_GET["password"] == 'passwort')
    {
        
    $_SESSION["user"] = true



  • #2
    So nicht - außer ich kenne natürlich deinen Code oder schaffe es, den Server dazu zu bringen, PHP als Text auszuliefen (DDoS, andere Sicherheitslücken im Server)
    Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

    Kommentar


    • #3
      Also das ist eigentlich schon alles. Es wird dann halt nur noch geprüft ob die Session gesetzt ist.

      Sicherheitslücken am Server lassen wir mal vorweg. Geht nur um den Code.

      Kommentar


      • #4
        Anmerkung:
        Wo es geht, sollten keine typeschwachen Stringvergleiche benutzt werden.

        Das modifizierte obige Beispiel:
        PHP-Code:
        if($_GET["password"] == '0x1')
        {
            
        $_SESSION["user"] = true

        macht einen erfolgreiches Login auch wenn nur eine '1' eingegeben wird. Ein typestrenger Vergleich === unterbindet das.

        -> Fallstricke bei typeschwachen Stringvergleichen

        LG jspit
        PHP-Klassen auf github

        Kommentar


        • #5
          Besser: Passwort beidseitig hashen. Dann bringt auch der ausgelieferte Code nicht (wirklich) viel.
          GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

          Kommentar


          • #6
            Anmerkung:
            Wo es geht, sollten keine typeschwachen Stringvergleiche benutzt werden.

            Das modifizierte obige Beispiel:
            PHP-Code:
            if($_GET["password"] == '0x1')
            {
            $_SESSION["user"] = true;
            }
            macht einen erfolgreiches Login auch wenn nur eine '1' eingegeben wird. Ein typestrenger Vergleich === unterbindet das.

            -> Fallstricke bei typeschwachen Stringvergleichen

            LG jspit
            Danke für den Hinweis!

            Besser: Passwort beidseitig hashen. Dann bringt auch der ausgelieferte Code nicht (wirklich) viel.
            Wie ist das gemeint?

            An Anlehnung an SQL Injections - warum würde folgendes nicht funktionieren:
            Usereingabe: 1==1 || 1
            Wie wird hier die Manipulation verhindert?
            PHP-Code:
            if($_GET["password"] == 'password'

                
            $_SESSION["user"] = true;  

            Kommentar


            • #7
              Zitat von _snake Beitrag anzeigen
              warum würde folgendes nicht funktionieren:
              Usereingabe: 1==1 || 1
              Weil im Code dann effektiv folgendes steht:

              PHP-Code:
              if('1==1 || 1' == 'password'

                  
              $_SESSION["user"] = true;  

              was offensichtlich "false" ergibt.

              Bei SQL-Injection mit folgendem Code:

              PHP-Code:
              $query 'SELECT username FROM users WHERE username = "' $_GET['username'] . '" AND password = "' md5($_GET['password']) . '"'
              und der Eingabe " or 1 = 1 --

              Dann folgendes steht:

              PHP-Code:
              $query 'SELECT username FROM users WHERE username = "" OR 1 = 1 --" AND password = "' md5($_GET['password']) . '"'
              Und, da -- einen Kommentar in SQL anfängt, der rest des queries auskommentiert ist, und 1 = 1 immer "true" ergibt, man den SQL string ausgetrickst hat. Die Datenbank führt dann nämlich lediglich den Teil

              Code:
              SELECT username FROM users WHERE username = "" OR 1 = 1
              aus. Und schon bin ich eingeloggt.
              Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

              Kommentar


              • #8
                Weil kein Kontextwechsel stattfindet.
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  @snake: Infos/Lesestoff dazu (Kontextwechsel, Injection, etc..): http://php-de.github.io/#security
                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar

                  Lädt...
                  X