phpbar.de logo

Mailinglisten-Archive

[php] "Server-Attacken" lähmen?

[php] "Server-Attacken" lähmen?

Mario Haßler M.Hassler at gmx.de
Mo Apr 19 23:17:35 CEST 2010


Vor einer Weile schrieb ich:

> Ich habe die "Teergrube" nun im Testbetrieb laufen und ergänze den
> "Erfolgsfall" um
>
> error_log("[info] Teergrube: IP = ".$_SERVER['REMOTE_ADDR']." (".gethostbyaddr($_SERVER['REMOTE_ADDR']).") / FILE = ".$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], 0);
>
> damit ich im error.log sehe, wann und wie diese Funktionalität greift.

Für die, die es interessiert, ein kleiner Statusbericht:

  - Im laufenden Monat hat die Teergrube gut 50-mal zugeschlagen.

  - Unter der Annahme, dass jeder "Angreifer" eine Liste mit mehr als
    5 Adressen abklappert, kam es zu folgendem Verhalten:

     - Abbruch nach 1 fehlgeschlagenem Zugriff:   7
     - Abbruch nach 2 fehlgeschlagenen Zugriffen: 3
     - Abbruch nach 5 fehlgeschlagenen Zugriffen: 2
     - Abbruch nach 8 oder mehr fehlgeschlagenen
       Zugriffen (d. h. vermutlich kein Abbruch): 3

  - Von den Angreifern, die es trotz Teergrube mehrfach probiert haben,
    haben nur zwei die vollen 2 Minuten "Zwangspause" eingehalten; alle
    anderen haben nach 6 bis 40 Sekunden Timeout die nächste Anfrage
    geschickt.

  - Einige der Angreifer, die nach 1 oder 2 fehlgeschlagenen Zugriffen
    abgebrochen haben, haben es nach einer Pause von 15 Minuten bis
    mehreren Stunden noch einmal probiert.

Ich bin recht zufrieden und werde das Konzept fortsetzen. Das Prak-
tische daran: Da es in dem Skript zur 404-Fehler-Verarbeitung inte-
griert ist, kann man unbedenklich die Textmuster für die Links er-
weitern, da tatsächlich vorhandene Seiten niemals eine Teergruben-
Antwort zur Folge haben können.

Hier der volle Code aus dem 404-Fehler-Skript:

   if (file_exists("meineteergrube.txt")) {
     foreach (file("meineteergrube.txt") as $line) {
     if (preg_match("|".trim($line)."|", $_SERVER['REQUEST_URI']))
       { $attack = str_replace(array(".*", "\."), array("[...]", "."), trim($line)); }
   }
   if (isset($attack)) {
     $address = gethostbyaddr($_SERVER['REMOTE_ADDR']);
     if ($address == $_SERVER['REMOTE_ADDR'])
       { $address = "ohne Adresse"; }
     error_log("[info] Teergrube (".$attack."): IP = ".$_SERVER['REMOTE_ADDR']." (".$address.") / FILE = ".$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], 0);
     sleep(120);	// 120 Sekunden = 2 Minuten
     // Nur einen der folgenden Header auswählen:
     // header("HTTP/1.0 402 Payment Required");
     // header("HTTP/1.0 403 Forbidden");
     // header("HTTP/1.0 406 Not Acceptable");
     header("HTTP/1.0 421 There are too many connections from your internet address");
     // header("HTTP/1.0 424 Failed Dependency");
     // header("HTTP/1.0 501 Not Implemented");
     // header("HTTP/1.0 509 Bandwidth Limit Exceeded");
   } else {
     // normale 404-Behandlung...
   }

Die Datei "meineteergrube.txt" enthält pro Zeile einen regulären
Ausdruck, z. B.

   /admin/file_manager\.php
   phpmyadmin

der mit der aufgerufenen URL verglichen wird. Bei einem Treffer wird
der Eintrag im error.log um eine Information ergänzt, z. B.

   [Sun Apr 11 08:38:32 2010] [error] dibujo6.montes.upm.es  File does not exist: /phpmyadmin/main.php
   [Sun Apr 11 08:38:32 2010] [error] [info] Teergrube (phpmyadmin): IP = 138.100.127.186 (dibujo6.montes.upm.es) / FILE = /phpmyadmin/main.php

Die Rückmeldung an den Angreifer wird verzögert, und dann wird eine
ungewöhnliche Fehlermeldung zurückgeliefert.

Viele Grüße,

Mario Haßler

php::bar PHP Wiki   -   Listenarchive