• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Riesen Sicherheitslücke!

Witschi262

Blogger
Hallo,
in meinem Loginsystem habe ich eine Fatale SL entdeckt!
Ich habe das Passwort falsch abgeglichen!
Ich habe nicht den Bentuzernamen genommen, und mit dem dazugehörigen Passwort verglichen, sondern Ob der Benutzername exestiert und ob das Passwort exestiert.

PHP:
if (isset ($_REQUEST["login"]))
{
$res = mysql_query("SELECT * FROM benutzer WHERE name LIKE '" . mysql_real_escape_string($name) . "'");
if (mysql_num_rows($res) === 1)
      { $res = mysql_query("SELECT * FROM benutzer WHERE password LIKE '" . mysql_real_escape_string($pw) . "'");
if (mysql_num_rows($res) === 1)
      {
       echo "Du hast dich erfolgreich eingeloggt. ";
       Header("Location: #");
       $_SESSION['login'] = $name;
      echo "Hallo ";
      echo $_SESSION['login'];
      }
       else
      {
      echo " Benutzername oder Kennwort stimmen nicht";
      }
      }
      }
      ?>

Wie mache ich das?
 
öhmm also vlt. so umgefähr : ?
PHP:
<?php 
session_start();
$verbindung = mysql_connect("localhost", "root" , "") or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); 
mysql_select_db("test") or die ("Datenbank konnte nicht ausgewählt werden"); 
$username = mysql_real_escape_string($_POST["username"]); 
$password = mysql_real_escape_string($_POST["password"]); 
$abfrage = "SELECT username, password FROM test WHERE username = '$username' AND password = '$password'"; 
$ergebnis = mysql_query($abfrage) or die("Statement fehlerhaft: ".$abfrage);
$anzahl = mysql_num_rows($ergebnis);
if($anzahl == 1){
    $row = mysql_fetch_object ($ergebnis);
    echo " Login erfolgreich. <br> <a href=\"Geheim.php\">Gesch&uuml;tzer Bereich</a> eingeloggt als  $username<br />";
} elseif($anzahl > 1){
    echo " Es ist ein Fehler aufgetreten.";
 echo $_POST["username"];
    echo $_POST["password"];
} else {
    echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; 
    echo "<br />Ihre eingegebenen Daten :   <br />Benutzername : $username<br />Passwort : $password ";
} 
 
?>

^^ SO hab ich es und es funktioniert
 
du ´hast auch die db pw host tabelle und spalten der tabelle bei dir verändert ? zu dem wie du sie hast ?
Und du hast auch vorher ein html formular in dem username und password verschickt werden ?
PS: falls du das nicht weißt : meine tabelle heist test
 
Klar habe ich das, hier mal der Quellcode:

PHP:
<div id="content">
    <form action="?login" method="post" id="form">
  <div class="form-box">
        <div class="inner">
          <div class="form">
          <form method="post" action="login" />
            <input type="text" name="name"  value="Login" />
          </div>
          <div class="form">
            <input type="password" name="pw" value="Passwort" />
          </div>
          <div class="button"><input type="image" src="images/button-1.jpg" alt="Absenden"></div>
         </form>
<?php
$connection = mysql_pconnect("localhost","ZENSIERT","*ZENSIERT");
mysql_select_db("5ZENSIERT");
$username = mysql_real_escape_string($_POST["name"]);
$password = mysql_real_escape_string($_POST["pw"]);
if(isset($_REQUEST['login']))
{
$abfrage = "SELECT name, password FROM benutzer WHERE name = '$username' AND password = '$password'";
$ergebnis = mysql_query($abfrage) or die("Statement fehlerhaft: ".$abfrage);
$anzahl = mysql_num_rows($ergebnis);
if($anzahl == 1){
    $row = mysql_fetch_object ($ergebnis);
    echo " Login erfolgreich.";
} elseif($anzahl > 1){
    echo " Es ist ein Fehler aufgetreten.";
 echo $_POST["username"];
    echo $_POST["password"];
} else {
    echo "Benutzername und/oder Passwort waren falsch.";
}
}

?>
 
Warum so kompliziert. Du brauchst einfach nur deinen ersten obigen Code verwenden und beide WHERE-Parts verbinden:
PHP:
if (isset ($_REQUEST["login"]))
{
$res = mysql_query("SELECT * FROM benutzer WHERE name = '" . mysql_real_escape_string($name) . "' AND password = '" . mysql_real_escape_string($password) . "'");
if (mysql_num_rows($res) === 1)
      {
       echo "Du hast dich erfolgreich eingeloggt. ";
       Header("Location: #");
       $_SESSION['login'] = $name;
      echo "Hallo ";
      echo $_SESSION['login'];
      }
       else
      {
      echo " Benutzername oder Kennwort stimmen nicht";
      }
      }
      }
      ?>

P.S. Nutze bei solchen Abfragen annstatt des LIKE-Operators lieber den =-Operator, das vergleicht 'genauer'.
</span>
 
Bitte speichere Passwörter nie als solche ab. Wenn ein Angreifer an die Daten aus der Datenbank kommt, kann er sich in jeden Account einloggen. Du trägst immer eine gewisse Verantwortung. Die meisten Menschen sind faul und verwenden ein Passwort für viele Dienste. Bekommt der Angreifer dieses Passwort hat er möglicherweise die Chance intime Dienste auszuspioneren oder zu mißbrauchen.

Die Lösung des Problems sind hash's. Eine PHP Hashfunktion wie hash() verschlüsselt das Passwort, diesen Hashwert speicherst du in der Datenbank. Wenn ein Hacker nun an die Daten kommt kann er nichts mit dem Hash anfangen. Die einzige Chance ist diesen nicht berechenbaren Hash mit einer sogenannten Rainbow Table zu vergleichen, dass bedeutet er prüft ein Hashwert auf einen unverschlüsselten String. Insbesondere bei Reinzahlen und Passwörtern aus dem Wörterbuch ist das verschlüsselte Passwort schnell entschlüsselt.

Auch hier gibt es eine Lösung. Du als Webmaster kannst das Passwort noch "salzen", indem du an das Passwort mit einem weiteren String erweiterst.

Beispiel:
PHP:
<?php
$passwort = 'passwort123';
//Der Salt der an das Passwort gehängt wird:
$salt = '(/üö#[]';
//Nun wird das ganze mit der hash Funktion verschlüsselt:
$hash = hash('sha512', $passwort.$salt);
?>

Das Passwort ist nicht mehr berechenbar, es sei denn der Hacker bekommt den salt raus, darum muss dieser immer geheim bleiben.

Es gibt viele weitere Salt-Möglichkeiten um ein Login sichere zu machen. Du musst einfach ein bisschen googeln.

Dem Angreifer bleibt noch eine Angriffsmöglichkeit. Er kann dein Login mit allen Passwortkombinationen durchlaufen lassen. Mit modernen Computern sind kurze Passwörter schnell geknackt. Bei dieser sogenannten Brute-Force Attacke entscheidet nur das Glück, also kann es sein, dass der erste Versuch ein Treffer ist. Auch für diese Angriffsmethode gibt es eine Möglichkeit sich zu schützen. Wenn du bemerkst, dass bei einem Account in kurzer Zeit (z.B 15min) viele Falsche Passwörter eingegeben wurden, kannst du diesen Account für kurze Zeit sperren. Der Angriff braucht zu lange für den Hacker und lohnt sich wirtschaftlich nicht.

Beim sperren immer Serverseitig sperren, niemals über Cookies oder dergleichen.



Mit den genannaten Stichwörtern sollte es möglich sein sich das meiste zuergooglen.
 
Zuletzt bearbeitet:
Hallo,
es funktioniert.

Allerdings, gibt sagt er immer das Kennwort wäre falsch, dabei ist der User bereits eingeloggt.
Script ist das vorher gepostete
 
PHP:
if (isset ($_POST['login']))
{
$name = $_POST['username'];
$password = $_POST['password']; 
$res = mysql_query("SELECT name, password FROM benutzer WHERE name = '" . mysql_real_escape_string($name) . "' AND password = '" . mysql_real_escape_string(md5($password)) . "'");
if (mysql_num_rows($res) === 1)
      {
       echo "Du hast dich erfolgreich eingeloggt. ";
       Header("Location: #");
       $_SESSION['login'] = $name;
      echo "Hallo ";
      echo $_SESSION['login'];
      }
       else
      {
      echo " Benutzername oder Kennwort stimmen nicht";
      }
      }
      }
      ?>
Wenn du deine Passwörter in MD5 gespeichert hast, musst du die Eingabe im Loginformular auch in MD5 umwandeln und so beide MD5 Werte miteinander vergleichen.
 
Gibt viele Möglichkeiten.

Man kann auch das Passwort mit string_split() zerlgen und zwischen den einzelnen Stücken einen Salt einfügen und dann das ganze als sha512 abspeichern.
 
Vermutlich (!) wird das Statement nicht mal ausgeführt, wodurch die Bedingung in den else-Zweig führt. Das Statement enthält "password" was ein SQL-Begriff ist. Escape den mit Backticks, dann sollte es klappen.

Code:
`password`
 
Zurück
Oben