Wie man mit einer WordPress wp-comments-post.php SPAM-Attacke umgehen kann

Heute gab es mal wieder einen Angriff auf die WordPress-Website eines unserer Kunden. Die Website war aufgrund einer extrem hohen Serverauslastung (> 53 Load-Average) nicht mehr erreichbar. Es schien, als hätte die Kundenwebsite unter einem WordPress-Kommentar-SPAM-Angriff von hunderten von verschiedenen IP-Adressen zu leiden. Nach ein paar Stunden Nachforschungen, Konfigurationsänderungen und Bereinigungen hatten wir das Problem gelöst. Wir wurden weiterhin angegriffen, aber die Änderungen, die wir vornahmen, haben die Kommentare von SPAM entfernt und die Serverlast wieder auf ein normales Mass reduziert.

Im Folgenden finden Sie eine Chronik, wie wir das Problem untersucht haben, was wir wie aufgeräumt haben und wie man verhindert, dass es erneut passiert.

Analyse

Das erste, was wir machen, wenn Websites Monitoring-Alarme abgeben (wir nutzen u.a. Nagios), besteht darin, sich beim Server anzumelden und seine Auslastung zu überprüfen. Die Last (load bzw. load-average) ist ein Indikator dafür, wie beschäftigt Ihr Server ist. Alles, was größer ist als die Anzahl der CPUs auf Ihrem Server, ist ein Grund für einen Alarm. Die Last auf unseren Servern liegt normalerweise bei 2-4. Als wir uns anmeldeten, war es 53.

Als nächstes überprüften wir, ob mysqld vielleicht die Ursache für die hohe Auslastung war, weil sie 200-1000% der CPU verwendete. Mit SHOW PROCESSLIST in MySQL (über phpMyAdmin oder Navicat mit mySQL connected) haben wir ungefähr 100 Prozesse gesehen, die an der wp_comments Tabelle in der WordPress Datenbank der Kundensite arbeiteten.

Unsere ersten Ahnungen gingen in Richtung SPAM-Angriff, also haben wir sodann das Apache access_log überprüft und in einem Zeitraum von wenigen Stunden fast 16.000 POSTS auf die Datei wp-comments-post.php gefunden. Die POSTs sehen dabei u.a. wie folgt aus:

xxx.xxx.xxx.xxx – – [12/Jun/2018:00:49:46 +0200] “POST /wp-comments-post.php HTTP/1.0” 302 834 “http://beispiel.net/hxxx/sdf-sdfda-altin-sdfsdf/#comment-15509/” “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 YaBrowser/xx.xx.x.1204 Yowser/2.5 Safari/537.36”

Was noch schlimmer war, die SPAMs stammen aus mehr als 350 eindeutigen IP-Adressen. Im Wesentlichen (in der Wirkung) handelte es sich um einen DDoS-Angriff (Distributed Denial of Service):.

Die Website des Kunden hat tausende von POSTS auf wp-comments-post.php gebracht, was Apache und MySQL dazu brachte, sehr viel zu tun zu bekommen und in der WordPress-Datenbank Comments zu speichern. Wir loggten uns in der WordPress Admin-Oberfläche ein, die das Problem ebenfalls verifizierte:

Momentan befinden sich 15.943 Kommentare in Ihrer Spam-Warteschlange. Oh weh !!

Den Angriff stoppen

Das Wichtigste zuerst: Wenn Sie unter einem solchen Angriff stehen, können Sie den Angriff am schnellsten stoppen, indem Sie die Kommentar-Möglichkeit auf Ihrer WordPress-Website deaktivieren. Es gibt ein paar Möglichkeiten, genau das zu tun.

Eine Möglichkeit besteht darin, in ‘Einstellungen’ > ‘Diskussion’ zu gehen und die Option ‘Nutzern erlauben, Kommentare zu neuen Artikeln zu senden’ zu deaktivieren.

Die zweite Möglichkeit besteht darin, wp-comments-post.php umzubenennen, was Spammer direkt verwenden, um Kommentare zu Ihrem Blog hinzuzufügen. Wir haben die Datei wp-comments-post.php vorübergehend nach wp-comments-post.bak umbenannt, damit wir sie später wieder ändern können falls nötig.

Jede dieser Methoden sollte den SPAM-Angriff sofort stoppen. 5 Minuten nachdem wir dies getan hatten, war die Serverlast wieder auf ~ 2.0 gesunken.

Nun, da die Spammer im Wesentlichen Daten an Ihre leere wp-comments-post.php-Datei senden, sollten neue Kommentare nicht in Ihrem Blog erscheinen. Während dies den Overhead des SPAM-Angriffs reduziert, verbrauchen sie immer noch Ihre Bandbreite und Webserver-Verbindungen mit ihren POSTs. Um die Spammer daran zu hindern, ein einzelnes Paket an Ihren Webserver zu senden, können Sie ein kleines Skript erstellen, das automatisch Pakete von IPs löscht, die mehrfach in wp-comments-post.php gepostet werden. Dies kann einfach über ein einfaches Skript, das das Apache-Access-Log scannt erfolgen. Ändere THRESHOLD zu etwas wie 10 und SEARCHTERM zu wp-comments-post.php und man kann automatisch Pakete von IPs blocken, die versuchen, mehr als 10 Kommentare (beispielhaft) pro Tag zu posten.

Aufräumen in der Datenbank

Zu diesem Zeitpunkt hatten wir immer noch einige Tausend SPAMs in der WordPress-Moderationswarteschlange.

Wir versuchten, die SPAM-Kommentare zu entfernen, indem wir zu Kommentare> Spam> Spam leeren gingen, aber wir meinen, es ware zu viele Daten für den Apache und er “stürzte” ab. Besser wäre es, sie stattdessen aus MySQL zu entfernen!

Über phpMyAdmin stellten wir fest, dass nicht nur 16.000+ SPAMs in der Datenbank waren, sondern die wp_comments Tabelle sehr angeschwollen war!

So bereinigen Sie die Tabelle wp_comments von allen Kommentaren, die als SPAM markiert sind:

DELETE FROM wp_comments WHERE 0=0;
(Achtung, nur benutzbar, wenn Sie keine Kommentare haben, wie bei uns der Fall)

Zusätzlich zur Tabelle “wp_comments” enthält die Tabelle wp_commentmeta Metadaten zu allen Kommentaren. Sie können alle Kommentarmetadaten für Kommentare, die nicht mehr vorhanden sind, sicher entfernen:

DELETE FROM wp_commentmeta WHERE Kommentar-ID NOT IN (SELECT Kommentar-ID VON wp_comments)

Für uns wurden ca. 16.000+ Zeilen mit wp_comments entfernt und 95.512 Zeilen mit wp_commentmeta (von 0,9 GB auf nur 133 KB heruntergekommen).