Het begint vaak onschuldig. Een klant laat je weten dat hij via je website ineens op een online casino terechtkwam. Je hostingprovider meldt per mail dat je pakket is geblokkeerd wegens het versturen van spam. Of in Google staat onder je zoekresultaat de zin „Deze site is mogelijk gehackt.” Dan is het wel duidelijk: iemand heeft zich toegang verschaft tot je WordPress. Dat is vervelend, maar geen ramp. Waar het nu om gaat, is de juiste volgorde. Wie in paniek alles weggooit en zomaar een oude backup terugzet, heeft het probleem vaak een week later opnieuw. Deze noodchecklist loodst je door de eerste uren, door het opschonen en door de tijd daarna.
Hoe herken je dat je WordPress gehackt is?
Niet elke hack valt meteen op. Veel aanvallers doen zelfs hun best om ervoor te zorgen dat je niets merkt. Ze gebruiken je server liever in alle rust voor spam, voor doorverwijzingen of om hun eigen pagina's hoger in Google te krijgen. Deze signalen moet je serieus nemen:
- Doorverwijzingen naar vreemde sites: Bezoekers belanden op pagina's over gokken, op datingsites of in nepwebshops. Vaak gebeurt dat alleen op een smartphone, of alleen als iemand via Google binnenkomt.
- Waarschuwingen van Google of de browser: Chrome toont in plaats van je website een rode waarschuwingspagina, in de zoekresultaten staat „Deze site is mogelijk gehackt.” of Search Console meldt een beveiligingsprobleem.
- Onbekende pagina's in de index: Een zoekopdracht naar
site:jouwdomein.nlbrengt pagina's met Japanse tekens, potentiemiddelen of spotgoedkope merkartikelen aan het licht die je nooit hebt aangemaakt. Beveiligingsexperts noemen dat de Japanese Keyword Hack of de Pharma Hack. - Onbekende gebruikers: In de gebruikerslijst staat een beheerder die niemand kent. Soms is dat account daar zelfs verborgen en alleen in de database te zien.
- Bericht van je hostingprovider: Je provider meldt dat er spam wordt verstuurd of dat de server ongewoon zwaar wordt belast, of heeft je pakket al geblokkeerd.
- Vreemde bestanden en wijzigingen: Bestanden met cryptische namen, onbekende code bovenaan
index.php, plugins die je nooit hebt geïnstalleerd, of een login waarbij je wachtwoord ineens niet meer werkt.
Eén ding zet veel mensen op het verkeerde been: zelf zie je vaak helemaal niets. Goed gemaakte malware herkent ingelogde beheerders aan hun cookie en toont hun gewoon de normale website. Test je site daarom in een privévenster, het liefst op je smartphone via mobiele data. Open hem één keer rechtstreeks en één keer via een zoekopdracht in Google.
WordPress gehackt, wat nu? Dit doe je in het eerste uur
In het eerste uur hoef je de kwaadaardige code nog niet te vinden. Het gaat erom de schade te beperken zonder sporen uit te wissen. Werk deze punten op volgorde af:
- Haal diep adem en verwijder nog niets. De reflex om meteen alles te wissen of blind een backup terug te zetten, is begrijpelijk. Maar daarmee vernietig je precies de sporen die je later vertellen hoe de aanvallers zijn binnengekomen.
- Leg vast wat je ziet. Maak screenshots van doorverwijzingen en waarschuwingen, noteer de tijdstippen en bewaar de mails van je hostingprovider en van Google. Dat helpt je bij het zoeken naar de oorzaak en later bij een eventuele melding aan de privacytoezichthouder.
- Maak een kopie van de geïnfecteerde website. Download alle bestanden en een export van de database en bewaar beide apart, duidelijk gemarkeerd als geïnfecteerd. Deze kopie zet je nooit meer terug. Die is alleen bedoeld als bewijs en om mee te vergelijken.
- Haal de website offline. Dat is vooral een must als bezoekers naar oplichterssites worden doorgestuurd of als je webshop betaalgegevens verwerkt. Een onderhoudsplugin helpt hier weinig, want die draait zelf in het gehackte WordPress. Blokkeer de website liever op serverniveau en laat alleen je eigen IP door. Draait je website op Apache, dan zijn drie regels helemaal bovenaan in
.htaccessgenoeg:
Vervang het adres door je eigen IP. Statuscode 503 vertelt Google dat de site maar tijdelijk niet bereikbaar is. Voor korte tijd kost dat je geen posities in Google. Gebruikt je server nginx of twijfel je, dan helpt je hostingprovider je verder.RewriteEngine On RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.10$ RewriteRule ^ - [R=503,L] - Wijzig de belangrijkste toegangsgegevens. Stel nieuwe wachtwoorden in voor je klantaccount bij de hostingprovider, voor SFTP of SSH en voor de database. Doe dat vanaf een apparaat dat je vertrouwt. Zijn de inloggegevens op je eigen computer buitgemaakt, bijvoorbeeld door een trojan die de in FileZilla opgeslagen wachtwoorden uitleest, dan hebben nieuwe wachtwoorden geen zin zolang die computer besmet is. Wijzig ook je eigen wachtwoord in WordPress. De andere gebruikers en de beveiligingssleutels zijn na het opschonen aan de beurt, want zolang er nog een achterdeur openstaat, kan de aanvaller nieuwe wachtwoorden gewoon meelezen.
- Licht je hostingprovider in. Veel providers hebben een eigen beveiligingsteam, malwarescanners en vooral de toegangslogs van de server. Vraag gericht naar de logs van de afgelopen weken en naar backups. Sommige providers bewaren die langer dan je denkt.
- Informeer de mensen die het moeten weten. Als bureau breng je je klant op de hoogte. Hebben nog meer mensen toegang tot de website, dan horen zij daar ook bij. En zodra er mogelijk persoonsgegevens bij betrokken zijn, loopt er een wettelijke termijn. Daarover verderop meer.
Hoe komen hackers binnen in WordPress? Zo vind je de zwakke plek
Deze stap slaan veel mensen over, en juist daarom worden zoveel websites twee keer gehackt. Vind je het lek niet, dan ruim je op en komt de aanvaller een paar dagen later via dezelfde deur weer binnen. Vaak niet eens doelbewust, maar omdat een bot het internet automatisch afzoekt naar precies dit lek.
Dit zijn de meest voorkomende manieren waarop aanvallers binnenkomen:
- Verouderde plugins en thema's: Dit is verreweg de meest gebruikte route. Volgens de jaarrapporten van Patchstack zit het overgrote deel van de bekende beveiligingslekken rond WordPress in plugins, een klein deel in thema's en vrijwel niets in WordPress zelf. Extra riskant zijn plugins die niemand meer onderhoudt of die uit de plugindirectory van WordPress.org zijn verwijderd.
- Nulled plugins en thema's: Illegale kopieën van premiumplugins van dubieuze downloadsites. Ze kosten niets, maar bevatten verrassend vaak een ingebouwde achterdeur.
- Zwakke of gestolen wachtwoorden: Bots proberen dag en nacht combinaties van gebruikersnamen en wachtwoorden uit. Wie hetzelfde wachtwoord ook bij andere diensten gebruikt, is bij het volgende datalek de klos.
- Buren in hetzelfde hostingpakket: Staat er in hetzelfde pakket nog een oude testinstallatie, een vergeten webshop of de website uit 2016 in een submap, dan kan de aanvaller van daaruit alle andere websites in het pakket bereiken.
- Besmette computers: Malware op de pc van een beheerder kan opgeslagen inloggegevens uitlezen en naar de aanvallers sturen.
Zo kom je de oorzaak op het spoor:
- Vergelijk je plugins en thema's met een database van beveiligingslekken, zoals Wordfence Intelligence, Patchstack of WPScan. Waar het om gaat, is of er voor precies de versie die jij hebt geïnstalleerd een lek bekend is.
- Bekijk de toegangslogs van de server. Verdacht zijn verzoeken via POST naar bestanden die in WordPress helemaal niet bestaan, of naar bestanden in de map
wp-content/uploads. De tijdstippen verraden vaak wanneer het allemaal begon. - Controleer wanneer verdachte bestanden zijn aangemaakt. De datum is een aanwijzing, maar geen bewijs, want aanvallers vervalsen tijdstempels graag.
Hoe verwijder je malware uit WordPress?
Nu is het tijd om op te ruimen. Daarvoor zijn er twee manieren.
Een schone backup terugzetten gaat het snelst. Dat werkt alleen als je zeker weet dat de backup ouder is dan de inbraak. En dat is lastiger dan het klinkt. Tussen de eigenlijke inbraak en de eerste zichtbare gevolgen zitten vaak weken, soms maanden, omdat aanvallers eerst een achterdeur plaatsen en die pas later gebruiken. Bovendien verlies je alle inhoud, bestellingen en reacties sinds de backup, en het lek staat daarna nog steeds open. Kies je deze weg, update dan direct na het terugzetten alle plugins en thema's en werk de punten hieronder toch af.
De website met de hand opschonen duurt langer, maar is grondiger. Het veiligst werk je daarbij in een kopie en niet op de live website. Zo pak je het aan:
- Vervang WordPress volledig. Verwijder de mappen
wp-adminenwp-includesen vervang ze door verse kopieën van dezelfde versie van WordPress.org. Hetzelfde geldt voor de bestanden in de hoofdmap, met uitzondering vanwp-config.php. Of daarna alles klopt, controleer je via de opdrachtregel van WordPress:
De opdracht vergelijkt elk bestand met de officiële checksums van WordPress.org en meldt ook bestanden die daar helemaal niet thuishoren.wp core verify-checksums - Installeer plugins en thema's opnieuw. Verwijder elke plugin en elk thema en installeer ze opnieuw vanuit een betrouwbare bron. Wat je niet gebruikt, komt er gewoon niet meer op. Voor plugins uit de officiële directory is er ook een controle:
Premiumplugins kan de opdracht niet controleren, omdat WordPress.org daar geen checksums van heeft. Die download je opnieuw, rechtstreeks bij de aanbieder.wp plugin verify-checksums --all - Doorzoek de map uploads. Daar horen afbeeldingen, pdf's en andere media thuis, maar geen PHP. Met deze opdracht vind je bestanden die daar niet thuishoren:
Een uitzondering zijn lege bestanden met de naamfind wp-content/uploads -type f -name "*.php"index.php, die sommige plugins aanmaken zodat niemand de inhoud van een map kan bekijken. Al het andere bekijk je nauwkeurig. - Controleer alles wat je niet opnieuw kunt installeren. Daaronder vallen
wp-config.php,.htaccess(daar verstoppen zich graag doorverwijzingen die alleen gelden voor bezoekers die via Google of op een smartphone komen), je eigen thema met zijnfunctions.phpen de mapwp-content/mu-plugins. Wat daarin staat, laadt WordPress automatisch, en in het dashboard kun je het niet deactiveren. Typisch voor kwaadaardige code zijn functies alseval,base64_decodeofgzinflatein combinatie met lange, onleesbare tekenreeksen. Voor een eerste zoektocht volstaat deze opdracht:
Een resultaat is nog geen bewijs, want ook betrouwbare plugins gebruiken sommige van deze functies. Het laat je wel zien waar je beter moet kijken.grep -rlE "eval\(|base64_decode\(|gzinflate\(|str_rot13\(" wp-content/ - Ruim de database op. Kwaadaardige code zit niet alleen in bestanden. Vraag eerst een lijst van alle beheerders op:
De twee opties aan het eind zorgen ervoor dat WordPress daarbij geen plugins en geen thema laadt en dus ook geen kwaadaardige code uitvoert die daar misschien nog in zit. Verwijder elk account dat je niet kunt thuisbrengen. Controleer daarnaast in de tabelwp user list --role=administrator --skip-plugins --skip-themeswp_optionsofsiteurlenhomenog naar je eigen domein wijzen. Geïnjecteerde scripts in berichten en pagina's vind je zo:
Gebruikt je installatie een ander prefix danSELECT ID, post_title, post_type FROM wp_posts WHERE post_content LIKE '%<script%';wp_, pas dan de tabelnamen aan. Widgets staan trouwens ook inwp_optionsen zijn eveneens een blik waard. - Controleer de geplande taken. Aanvallers zetten graag cronjobs klaar die de kwaadaardige code regelmatig opnieuw aanmaken. Kijk zowel naar de cronjobs van WordPress als naar de cronjobs in het klantpaneel van je hostingprovider.
Scanners zoals Wordfence of de gratis Sucuri SiteCheck vinden veel bekende malware en zijn een goede aanvulling. Vertrouw er alleen niet blind op. Een externe scanner ziet alleen wat er in de browser aankomt, en ook een plugin vindt alleen wat hij al kent. Nieuwe of goed verstopte achterdeuren glippen erdoorheen.
Hoe beveilig je WordPress na een hack?
Is de website schoon? Dan volgt het deel dat bepaalt of dat ook zo blijft.
- Overal nieuwe wachtwoorden: voor elke gebruiker in WordPress, voor de database (de nieuwe waarde zet je daarna in
wp-config.php), voor SFTP en voor je klantaccount bij de hostingprovider. Denk ook aan toegangssleutels voor externe diensten die in plugins zijn opgeslagen, bijvoorbeeld voor het versturen van mail of voor betaalproviders. - Nieuwe beveiligingssleutels: Vervang de salts in
wp-config.phpdoor nieuwe waarden uit de officiële generator van WordPress.org. Daarmee worden alle bestaande logins ongeldig, ook de logins die een aanvaller misschien nog als cookie heeft. - Het lek dichten: Update WordPress, alle plugins en alle thema's. Vervang plugins die niet meer worden onderhouden. Hoe je dat blijvend onder controle houdt, lees je in onze gids Hoe houd je plugins in WordPress bijgewerkt en veilig.
- Logins beveiligen: Stel voor alle beheerders een tweede factor bij het inloggen in (wat 2FA is en hoe het werkt) en beperk het aantal beheerders tot het hoogst noodzakelijke.
- Bestandseditor uitschakelen: Met deze regel in
wp-config.phpkan niemand meer via het dashboard code in plugins en thema's aanpassen:
Meer instellingen vind je in onze handleidingen wp-config.php in WordPress beveiligen en Bestandsrechten in WordPress correct instellen.define( 'DISALLOW_FILE_EDIT', true ); - Een firewall ervoor: Een Web Application Firewall houdt veel aanvallen op bekende lekken tegen voordat ze WordPress zelfs maar bereiken.
- Backups die echt werken: automatisch, dagelijks, buiten de server opgeslagen en minstens 30 dagen terug in de tijd. En één keer bij wijze van test teruggezet, voordat je ze in een noodgeval nodig hebt.
Houd de website daarna een paar weken goed in de gaten. Duikt de kwaadaardige code na een paar dagen weer op, dan heb je een achterdeur over het hoofd gezien of staat het lek nog open. Een overzicht van alle beveiligingsmaatregelen vind je in onze beveiligingschecklist voor WordPress.
„Deze site is mogelijk gehackt”: hoe kom je van de waarschuwing in Google af?
Google haalt de waarschuwing niet vanzelf weg zodra je hebt opgeruimd. Je moet zelf in actie komen:
- Log in bij Google Search Console. Heb je je website daar nog niet toegevoegd, doe dat dan nu.
- Open onder „Beveiliging en handmatige acties” het rapport „Beveiligingsproblemen”. Daar zie je wat Google heeft gevonden, vaak met een paar getroffen URL's als voorbeeld.
- Kijk bij de instellingen wie er als gebruiker of eigenaar staat ingeschreven. Aanvallers voegen zichzelf daar soms toe om hun spampagina's sneller in de index te krijgen. Verwijder onbekende gebruikers en het bijbehorende verificatiebestand in de hoofdmap van je website.
- Vraag via de knop in het rapport een beoordeling aan en beschrijf kort wat je hebt gevonden en opgelost. Volgens Google duurt de beoordeling bij malware meestal een paar dagen, bij phishing ongeveer een dag en bij gehackte spampagina's soms enkele weken.
De spampagina's zelf moeten na het opschonen statuscode 404 of 410 teruggeven. Dan verdwijnen ze geleidelijk uit de index. Heb je haast, dan helpt de tool voor het verwijderen van URL's in Search Console. Dien daarna je echte sitemap opnieuw in. Heeft je server spam verstuurd, controleer dan ook of je IP op een blacklist voor mail is beland. Je hostingprovider helpt je om daar weer af te komen.
Moet je een hack als datalek melden volgens de AVG?
Dat hangt ervan af of er mogelijk persoonsgegevens bij betrokken zijn. Bij een webshop, een ledenomgeving of opgeslagen berichten uit het contactformulier is dat al snel het geval. Zelfs de gebruikerstabel van WordPress bevat namen en mailadressen.
Volgens artikel 33 AVG moet je zo'n datalek binnen 72 uur melden bij de bevoegde toezichthouder, in Nederland de Autoriteit Persoonsgegevens en in België de Gegevensbeschermingsautoriteit. De termijn begint zodra je ervan op de hoogte bent. Melden hoeft alleen niet als het datalek waarschijnlijk geen risico oplevert voor de betrokkenen. Is het risico hoog, bijvoorbeeld omdat betaalgegevens of wachtwoorden kunnen zijn buitgemaakt, dan moet je volgens artikel 34 AVG ook de betrokkenen zelf informeren.
Ook als je uiteindelijk niet meldt, moet je het incident en je beslissing vastleggen. Dat staat in artikel 33, lid 5. De meeste toezichthouders bieden voor de melding een online formulier aan. Heb je een functionaris voor gegevensbescherming, betrek die er dan meteen bij. Dit gedeelte vervangt geen juridisch advies.
Wanneer laat je een gehackte website door een professional opschonen?
Veel uit deze checklist kun je zelf, als je de weg weet in bestanden, databases en servers. In sommige gevallen is professionele hulp toch de betere keuze:
- Je webshop verwerkt betaalgegevens en er is een vermoeden dat kaartgegevens zijn buitgemaakt.
- De website raakt na elke schoonmaak opnieuw besmet.
- Er is geen bruikbare backup, en de opdrachtregel is niet echt jouw ding.
- Het gaat om de website van een klant en je moet later precies kunnen aantonen wat er is gebeurd.
Je eerste aanspreekpunt is vaak je hostingprovider. Veel providers bieden een schoonmaak aan als betaalde dienst. Daarnaast zijn er gespecialiseerde diensten, bijvoorbeeld van Wordfence of Sucuri. Vraag vooraf of het zoeken naar het lek bij de prijs is inbegrepen. Alleen de kwaadaardige code verwijderen helpt je maar tot de volgende aanval.
Hoe InspectWP je helpt na een hack
Eerst dit: InspectWP is geen malwarescanner en vervangt geen schoonmaak. Het rapport helpt je wel op twee punten die in de drukte vaak ondersneeuwen: bij het vinden van het waarschijnlijke lek en bij de controle achteraf.
Zelfs het gratis rapport toont de plugins en thema's die het op je website herkent, en markeert welke daarvan uit de plugindirectory van WordPress.org zijn verwijderd of al meer dan een jaar geen update hebben gekregen. Het laat zien of je een verouderde versie van WordPress gebruikt en of er van buitenaf bestanden bereikbaar zijn die daar niets te zoeken hebben, zoals een openbare debug.log, backups van de database of een bestand met de naam .env. Daarnaast controleert het of je login beschermd is tegen het massaal uitproberen van wachtwoorden en of gebruikersnamen van buitenaf uit te lezen zijn.
In de abonnementen Premium en Agency zie je ook de geïnstalleerde versies van je plugins en de bekende beveiligingslekken daarin. Zo vind je de meest waarschijnlijke oorzaak vaak binnen een paar minuten. Met de InspectWP WordPress Connector zie je bovendien of bestanden van WordPress zelf zijn gewijzigd (de Connector vergelijkt ze met de checksums van WordPress.org), hoeveel beheerders er zijn en of belangrijke mappen schrijfbaar zijn.
Na het opschonen zijn automatische rapporten de moeite waard. InspectWP controleert je website dan regelmatig en stuurt je desgewenst een mail. Als je twee rapporten vergelijkt, zie je in één oogopslag wat er is veranderd, bijvoorbeeld een nieuwe plugin die zogenaamd niemand heeft geïnstalleerd. Je eerste gratis rapport heb je binnen een paar minuten.