passwortschutz mit sessions und mysql db - sicherheitslöcher?

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

  • passwortschutz mit sessions und mysql db - sicherheitslöcher?

    hallo ich bin daran eine seite zu bauen bei dem gewisse bereiche nur für eingeloggte benutzer zugänglich sein sollen. ich habe dieses mit sessions und einer mysql datenbank umgesetzt. das script funktioniert soweit.

    nun weiss ich aber nicht ob es offensichtliche sicherheitslöcher aufweist (oder auch kleinere) und wäre um euer feedback froh :-)

    Hier die indexseite mit dem loginfenster:
    PHP-Code:
    <?PHP
    session_start
    ();
    ?>
    <?PHP
    if(isset($_POST['submit']))
    {
    include(
    "config.php"); // datenbankverbindung

    $abfrage "SELECT * FROM benutzer_tabelle WHERE (benutzerzugang = '".$_POST['benutzer']."') AND (passwortzugang = '".$_POST['passwort']."')";
    $ergebnis mysql_query($abfrage) or die(mysql_error());
    $row mysql_fetch_array($ergebnis);
    if(
    $row['benutzerstatus'] == 1)
        {
        
    $_SESSION['logstatus']=1;
        }
      else
        {
        echo 
    "Keine Zugangsberechtigung!";
        }
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    </head>
    <body>
    <?PHP
    if($_SESSION['logstatus'] != 1)
        {
        include(
    "loginformular.php");
        }
         else
        {
        echo
    "<a href=\"kunde1.php\">zum kundenbereich</a><br>";
        echo
    "<a href=\"logout.php\">logout</a>";
        }
    ?>
    </body>
    </html>
    Das eingesetze formular zum einloggen:
    PHP-Code:
    <form name="form1" method="post" action="<?php print $PHP_SELF?>">
    <input name="benutzer" type="text" id="benutzer" value="<?php print $user?>" size="40" maxlength="40"><br />
    <input name="passwort" type="text" id="passwort" value="<?php print $pass?>" size="40" maxlength="40"><br />
    <input name="submit" type="submit" id="submit" value="Senden"></form>
    Die logout seite:
    PHP-Code:
    <?PHP
    session_start
    ();
    session_destroy();
    ?>
    ausgeloggt.<br>
    <a href="index.php">zur&uuml;ck zur startseite </a>

    Eine der seiten die geschützt sein sollen:
    PHP-Code:
    <?PHP
    session_start
    ();
    if (
    $_SESSION["logstatus"]!=1){
    header("Location:index.php");     
    exit;
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    </head>
    <body>
    kundenseite
    <br>
    <a href="index.php">zur&uuml;ck zur startseite </a>
    </body>
    </html>

    Hier der aufbau der datenbanktabelle
    [COLOR=orange]CREATE TABLE benutzer (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    benutzerzugang VARCHAR(30),
    passwortzugang VARCHAR(30),
    benutzerstatus INT,
    kundenid INT,
    datum DATETIME
    );[/COLOR]

    natürlich werde ich das ganze noch ausbauen. aber ich möchte wissen ob ich bis jetzt keine grosse sicherheitsmängel einprogrammiert habe. danke.
    Zuletzt geändert von kendal; 09.05.2006, 20:49.

  • #2
    Hi!

    Bisher ist das sehr sehr sehr unsicher!

    Ein paar Lücken:

    Du musst Benutzereingaben erst überprüfen, bevor du was mit denen machst (dazu gehören z.b $_POST, $_GET, aber auch $_SESSION, oder $_SERVER!!!!)

    $_POST['passwort'], ein geschickter User kann hier auch "OR 1=1" rein bekommen, und schon loggt er sich bequem ohne Passwort ein.


    -> Zieh dieses Tut mal rein: http://tut.php-q.net/login.html

    Marc

    Kommentar


    • #3
      hallo, besten dank für die zeit die du dir genommen hast mein script zu lesen. da ich anfänger bin und ja auch was lernen möchte noch eine verständnissfrage: was ist OR 1=1 das du erwähnst?

      macht es sinn dass ich an meinem ansatz weiter mache, diesen verbessere, löcher schliesse?
      was wären die ersten schritte die ich tun müsste?
      Zuletzt geändert von kendal; 10.05.2006, 09:19.

      Kommentar


      • #4
        OR 1=1

        Kleine Anregung: Angenommen ein User deiner Seite gibt z.B. als Passwort "irgendetwas OR 1=1" ein. wie würde dann dein SQL-Query aussehen? Stichwort: SQL-injection

        http://de.wikipedia.org/wiki/SQL_Injection
        Mit freundlicher Lichthupe

        **Bastifreee**

        Kommentar


        • #5
          also wenn ich versuche beim passwortfeld irgendetwas OR 1=1 einzugeben klappt das login nicht
          also keine SQL-injection möglich?
          Zuletzt geändert von kendal; 10.05.2006, 11:48.

          Kommentar


          • #6
            Original geschrieben von kendal
            also keine SQL-injection möglich?
            Bei dir wird "magic_quotes On" sein. Schau dir im Manual die Seite http://de3.php.net/manual/en/functio...ape-string.php und da insbesondere den Abschnitt "Example 3. A "Best Practice" query" an.

            Kommentar


            • #7
              also somit für mich kein sicherheitsproblem?

              Kommentar


              • #8
                es ist zu empfehlen die passwordfelder nicht in klahrtext, sondern mit password function abspeichern.
                Slava
                bituniverse.com

                Kommentar


                • #9
                  Original geschrieben von Slava
                  es ist zu empfehlen die passwordfelder nicht in klahrtext, sondern mit password function abspeichern.
                  Nein, letzteres ist ganz und gar nicht zu empfehlen, weil das Manual deutlich darauf hinweist:
                  Note: The PASSWORD() function is used by the authentication system in MySQL Server; you should not use it in your own applications. For that purpose, consider MD5() or SHA1() instead.
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    ich habe vor dies mit MD5 zu lösen.

                    aber ist es richtig das SQL-injection in meinem fall nicht möglich ist.

                    folgende einstellungen auf "meinem" server:
                    magic_quotes_gpc On
                    magic_quotes_runtime Off
                    magic_quotes_sybase Off

                    register_globals On

                    Kommentar


                    • #11
                      Du bist theoretisch geschützt. Siehe hier (Wobei du in deinem Fall einfach mal als Benutzernamen "admin'); #" eingeben solltest, bzw statt admin irgendeinen anderen gültigen Benutzernamen )

                      Kommentar


                      • #12
                        das begreiff ich jetzt nicht. was genau soll ich eingeben und was für probleme soll das verursachen?

                        mhhh mit jeder sache die ich begreiffe kommt wieder eine die nur ??? aufwirft :-(

                        Kommentar


                        • #13
                          Wenn du "admin'); #" als Benutzernamen eingibst, ohne dass vor das einfache Anführungszeichen (') ein Backslash gesetzt wird, kommt folgende Query raus:
                          Code:
                          SELECT * FROM benutzer_tabelle WHERE (benutzerzugang = 'admin'); #') AND (passwortzugang = 'irgendwas')
                          Du kannst dir ja mal überlegen, was diese Query bewirkt.
                          Lies dir am besten das hier durch

                          Kommentar


                          • #14
                            wie ich das jetzt umgehen kann ist mir nicht klar.

                            Kommentar


                            • #15
                              Indem du entweder magic_quotes_gpc auf On hast oder den Benutzernamen und das Passwort erst durch mysql_escape_string() jagst. Dadurch wird aus allen ' ein \', sodass MySQL diese Anführungszeichen sozusagen ignoriert...

                              Kommentar

                              Lädt...
                              X