Mailinglisten-Archive |
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