Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Sicherheit – Brute-Force-Angriff

PHP-Sicherheit – Brute-Force-Angriff

黄舟
黄舟Original
2017-02-20 09:52:092201Durchsuche



Heftiger Angriff

Brute-Force-Angriff ist eine Angriffsmethode, die alle Möglichkeiten ausschöpft, ohne besondere Mittel einzusetzen. Sein formellerer Name ist ein erschöpfender Angriff – ein Angriff, der alle Möglichkeiten ausschöpft.

Für die Zugriffskontrolle besteht ein typischer Brute-Force-Angriff darin, dass ein Angreifer versucht, sich über eine große Anzahl von Versuchen beim System anzumelden. In den meisten Fällen ist der Benutzername bekannt und das Passwort muss nur erraten werden.

Obwohl es bei Brute-Force-Angriffen keine Fähigkeiten gibt, scheint bei Wörterbuchangriffen eine gewisse Fähigkeit vorhanden zu sein. Der größte Unterschied besteht in der Intelligenz bei der Annahme von Vermutungen. Wörterbuchangriffe erschöpfen nur die Liste der wahrscheinlichsten Situationen, anstatt alle möglichen Situationen wie Brute-Force-Angriffe auszuschöpfen.

Das Verhindern von Überprüfungsversuchen oder das Begrenzen der Anzahl zulässiger Fehler ist eine relativ wirksame Sicherheitsmaßnahme. Das Dilemma dabei besteht jedoch darin, Angreifer zu identifizieren und zu blockieren, ohne legitime Benutzer zu beeinträchtigen.

In diesem Fall kann Ihnen eine Konsistenzbestimmung dabei helfen, zwischen beiden zu unterscheiden. Diese Methode ist der in Kapitel 4 beschriebenen Methode zur Verhinderung von Session-Hijacking sehr ähnlich, der Unterschied besteht jedoch darin, dass Sie einen Angreifer und nicht einen legitimen Benutzer identifizieren möchten.

Betrachten Sie das folgende HTML-Formular:

CODE:
 
  <form action="http://example.org/login.php"
method="POST">
  <p>Username: <input type="text"
name="username" /></p>
  <p>Password: <input type="password"
name="password" /></p>
  <p><input type="submit"
/></p>
  </form>


Angreiferwille Überprüfen Sie dieses Formular und erstellen Sie ein Skript, um rechtliche Daten an http://www.php.cn/ zu posten:

CODE:
 
 <?php
 
  $username = &#39;victim&#39;;
  $password = &#39;guess&#39;;
 
  $content =
"username=$username&password=$password";
  $content_length = strlen($content);
 
  $http_request = &#39;&#39;;
  $http_response = &#39;&#39;;
 
  $http_request .= "POST /login.php
HTTP/1.1\r\n";
  $http_request .= "Host: example.org\r\n";
  $http_request .= "Content-Type:
application/x-www-form-urlencoded\r\n";
  $http_request .= "Content-Length:
$content_length\r\n";
  $http_request .= "Connection: close\r\n";
  $http_request .= "\r\n";
  $http_request .= $content;
 
  if ($handle = fsockopen(&#39;example.org&#39;, 80))
  {
    fputs($handle, $http_request);
 
    while (!feof($handle))
    {
      $http_response .= fgets($handle, 1024);
    }
 
    fclose($handle);
 
    /* Check Response */
  }
  else
  {
    /* Error */
  }
 
  ?>


Mit diesem Skript kann der Angreifer auch einfach eine Schleife hinzufügen, um weiterhin verschiedene Passwörter auszuprobieren und nach jedem Versuch die Variable $http_response zu überprüfen. Sobald sich die Variable $http_response ändert, kann davon ausgegangen werden, dass das richtige Passwort erraten wurde.

Es gibt viele Sicherheitsmaßnahmen, die Sie ergreifen können, um diese Art von Angriff zu verhindern. Wir haben festgestellt, dass bei einem Brute-Force-Angriff jede HTTP-Anfrage genau gleich ist, mit Ausnahme des Passworts, das sehr wertvoll ist.

Obwohl das vorübergehende Einfrieren von Konten nach einer bestimmten Anzahl fehlgeschlagener Versuche eine wirksame Verteidigung darstellt, sollten Sie einen deterministischeren Ansatz zum Einfrieren von Konten in Betracht ziehen, damit Angreifer weniger Möglichkeiten haben, den Zugriff legitimer Benutzer auf Ihre Anwendung zu beeinträchtigen.

Es gibt auch Prozesse, die einen Brute-Force-Angriff erschweren und die Erfolgsaussichten verringern können. Ein einfacher Eindämmungsmechanismus kann dies effektiv bewirken:

CODE:
 
 <?php
 
  /* mysql_connect() */
  /* mysql_select_db() */
 
  $clean = array();
  $mysql = array();
 
  $now = time();
  $max = $now - 15;
 
  $salt = &#39;SHIFLETT&#39;;
 
  if (ctype_alnum($_POST[&#39;username&#39;]))
  {
    $clean[&#39;username&#39;] = $_POST[&#39;username&#39;];
  }
  else
  {
    /* ... */
  }
  $clean[&#39;password&#39;] = md5($salt .
md5($_POST[&#39;password&#39;] . $salt));
  $mysql[&#39;username&#39;] =
mysql_real_escape_string($clean[&#39;username&#39;]);
 
  $sql = "SELECT last_failure, password
          FROM   users
          WHERE  username =
&#39;{$mysql[&#39;username&#39;]}&#39;";
 
  if ($result = mysql_query($sql))
  {
    if (mysql_num_rows($result))
    {
      $record = mysql_fetch_assoc($result);
 
      if ($record[&#39;last_failure&#39;]> $max)
      {
        /* Less than 15 seconds since last failure
*/
      }
      elseif ($record[&#39;password&#39;] ==
$clean[&#39;password&#39;])
      {
        /* Successful Login */
      }
      else
      {
        /* Failed Login */
 
        $sql = "UPDATE users
                SET    last_failure = &#39;$now&#39;
                WHERE  username =
&#39;{$mysql[&#39;username&#39;]}&#39;";
 
        mysql_query($sql);
      }
    }
    else
    {
      /* Invalid Username */
    }
  }
  else
  {
    /* Error */
  }
 
  ?>


Beschränken Sie das letzte reguläre Treffen auf das letzte Mal. Wie oft um es nach einer fehlgeschlagenen Authentifizierung erneut mit demselben Benutzer zu versuchen. Wenn Sie es innerhalb von 15 Sekunden nach einem fehlgeschlagenen Versuch erneut versuchen, schlägt die Überprüfung fehl, unabhängig davon, ob das Passwort korrekt ist. Dies ist der Kernpunkt dieses Plans. Es reicht jedoch nicht aus, den Zugriff nach einem fehlgeschlagenen Versuch nur 15 Sekunden lang zu sperren. An diesem Punkt ist die Ausgabe unabhängig von der Eingabe dieselbe und unterscheidet sich erst nach einer erfolgreichen Anmeldung. Andernfalls könnte ein Angreifer einfach die inkonsistente Ausgabe untersuchen, um festzustellen, ob die Anmeldung erfolgreich war.

Das Obige ist der Inhalt von PHP-Sicherheit – Brute-Force-Angriff. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.org). php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn