In dit artikel leggen we uit waarom en hoe WordPress websites gehackt worden. Daarnaast geven we een stappenplan om malware te verwijderen en je gehackte WordPress website op te schonen.

Tip

Waarom worden WordPress websites gehackt?

De belangrijkste motivatie voor de meeste hackers is geld. De gehackte websites worden ingezet om commerciële websites te promoten, vooral in de sferen van gokken, seks en geneesmiddelen. Door het hacken van een website kunnen er bijvoorbeeld duizenden spam e-mails gestuurd worden. Of er worden links op je website geplaatst waardoor Google wordt misleid en de commerciële websites hoger in de zoekresultaten komen. Af en toe zijn hacks ook ideologisch/politiek gemotiveerd.

Hoe kom je erachter dat je WordPress website gehackt is?

  • Er verschijnen links op de website die er niet horen. Vaak zijn dit links naar websites die te maken hebben met pornografie, gokken, drugs, illegale geneesmiddelen, et cetera . Soms zijn de links opgenomen in de kleur van de achtergrond van de website, zodat ze voor bezoekers niet zichtbaar zijn, maar wel voor zoekmachines.
  • Wanneer je zoekt naar je eigen website op Google (bijvoorbeeld ‘sowmedia.nl’ als zoekterm), verschijnt er informatie over de website die niet van jou afkomstig is.
  • Bezoekers van je website worden geredirect naar een andere website. Soms zelfs alleen je mobiele bezoekers.
  • Je website wordt gebruikt om spam te versturen. In zo’n geval krijg je meestal een melding van je hostingbedrijf dat er onnatuurlijk veel e-mail worden verstuurd vanaf je website.
  • Organische zoekverkeer daalt doordat Google jouw WordPress website niet meer in de zoekresultaten toont.

Hoe kan je WordPress website gehackt worden?

Om de controle over je WordPress website over te nemen, is het voor hackers noodzakelijk om op de één of andere manier een bestand op je server te kunnen uploaden of bewerken. Over het algemeen zijn er vier mogelijke ingangen die de hacker toegang geven tot je website:

  1. Onveilige wachtwoorden; de meeste WordPress hacks die wij tegenkomen hadden voorkomen kunnen worden door veiligere wachtwoorden te kiezen.
  2. Update-beleid; wanneer je WordPress, je plugins en je thema niet of zelden updated, vergroot je aanzienlijk de kans om gehackt te worden.
  3. Onveilige thema’s/plugins; soms kan je website up-to-date zijn, maar alsnog een onveilig thema/plugin bevatten. Schaf een plugin/thema daarom altijd aan vanaf een betrouwbare website.
  4. Slechte hosting; je kunt je website zelf helemaal beveiligd hebben, maar als het bij je hostingpartij bijvoorbeeld mogelijk is om bestanden te verplaatsen tussen je verschillende websites, dan is het slecht geregeld met de beveiliging.

Lees meer over de stappen om te voorkomen dat je WordPress website wordt gehackt.

Liever de video-uitleg om WordPress op te schonen?

We hebben ook een video-handleiding gemaakt waarin we stap voor stap uit leggen hoe je je gehackte WordPress website kunt opschonen. Je kunt deze hieronder bekijken, of dit artikel verder lezen.

Je WordPress website hackvrij maken

Tip

Het verwijderen van malware is een complex proces. Wij bieden je de informatie om het zelf te doen. Je kunt ook het verwijderen van malware aan ons uitbesteden.

Wanneer een hacker toegang heeft gehad tot je website, zijn mogelijk bestanden toegevoegd/gewijzigd, wachtwoorden aangepast en mogelijks zelfs nieuwe gebruikers toegevoegd. Wanneer je één van deze acties niet detecteert en opschoont, hebben alle andere acties geen zin, want de hacker kan zich dan nog steeds toegang verschaffen en opnieuw schade aanrichten. Het opschonen dient dus grondig te gebeuren.

We proberen alle stappen zo eenvoudig mogelijk uit te leggen, maar enige technische kennis is wel een vereiste. Zorg dat je in elk geval een beheerders-account hebt in WordPress, dat je FTP-toegang hebt (en dat je weet hoe FTP werkt), en dat je met een programma zoals phpMyAdmin of Adminer bij de database kunt komen. De stappen die we gaan nemen zijn:

Tip

Als je weet wanneer de hack heeft plaatsgevonden, kun je het opschonen overslaan door een backup van vóór de hack terug te zetten. Je verliest mogelijk wel wat reacties en formulier-inzendingen. Ga na het opschonen verder bij stap 5.

Backup je gehackte WordPress website

Je gaat je WordPress website grondig opschonen. Dat betekent dat je ook wel eens teveel kan opschonen en dat je eigenlijk beter opnieuw kunt beginnen. In zo’n geval is het altijd handig om een backup achter de hand te hebben. Zorg ervoor dat je zowel alle bestanden als alle databases toevoegt aan de backup.

Sluit de deuren

Zorg dat je WordPress website tijdelijk niet toegankelijk is van buitenaf. Theoretisch kunnen hackers je website namelijk opnieuw besmetten terwijl je nog bezig bent met het doorlopen van de stappen. Ook voorkom je zo dat je bezoekers nog besmet met mogelijk geïnstalleerde malware op je website.

Via het controlepaneel van je hosting-partij kun je vaak de website blokkeren door middel van een wachtwoord, of met een IP-filter. Als je toegang hebt tot je .htaccess-bestand kun je de volgende regels toevoegen om één specifiek IP-adres toe te laten (achterhaal jouw IP-adres op WhatIsMyIPAddress.com):

order deny,allow
deny from all
allow from 123.456.789.123

Zoek naar de oorzaak van je gehackte WordPress website

google-securityHet is belangrijk om er zo snel mogelijk achter te komen wat de oorzaak van de hack is en hoeveel impact de hack heeft.

  • Zoek je plugins, thema’s en WordPress versie op in de WPScan Vulnerability Database en bekijk of er kwetsbaarheden bekend zijn voor de versies die op jouw website geïnstalleerd staan.
  • Gebruik je Google Webmasters? Ga naar je dashboard en kijk of daar ook melding wordt gemaakt van malware.
  • Controleer je website bij Google: http://www.google.com/safebrowsing/diagnostic?site=www.example.com
  • Veel hosting partijen stellen access logs beschikbaar. Hiermee wordt op serverniveau een regel opgeslagen voor elk opgevraagd bestand. Bestanden die door hackers geplaatst zijn, worden meestal met een ‘POST-request’ opgevraagd. Door te zoeken naar ‘POST’ in je access log, filter je op een lijst waarvan je de php-bestanden nader kunt onderzoeken. Verderop in dit artikel leggen we uit waar je op moet letten als je php-bestanden doorzoekt. Deze bestanden zijn overigens niet per definitie lek; een POST-request wordt bijvoorbeeld ook gebruikt als je een contactformulier invult, of als je inlogt op wp-login.php.
  • We maken soms ook mee dat er nog een oude WordPress website op dezelfde server staat, bijvoorbeeld in de map ‘old’. Vaak wordt deze installatie vergeten en niet meer ge-update, wat als gevolg heeft dat de gehele website kwetsbaar is voor allerlei oude veiligheidslekken.

Bestanden opschonen van je gehackte WordPress website

Bij een geslaagde hack kan de hacker een bestand plaatsen of bewerken in mogelijk elke map op je webserver; niet alleen in de map van bijv. de veroorzakende lekke plugin. Dit betekent dat je alle mappen en bestanden zou moeten langslopen, en dat is monnikenwerk. Gelukkig kun je het uitpluis-werk beperken in verschillende stappen. We leggen ze hieronder uit.

  • WordPress core opschonen (wp-admin en wp-includes)

    Log in met FTP en ga naar de map van je WordPress website. In de root (topfolder) van je WordPress website staan minstens drie mappen: ‘wp-admin’, ‘wp-content’ en ‘wp-includes’. In de map ‘wp-content’ worden alle specifieke wijzigingen van jouw website bewaard, maar ‘wp-admin’ en ‘wp-includes’ bevatten puur bestanden van de WordPress core; bestanden die alleen wijzigen als er een nieuwe versie van WordPress uitkomt.

    Om er in één keer zeker van te zijn dat er door hackers geen bestanden meer gewijzigd of geplaatst zijn in de WordPress core, kun je daarom gerust de mappen ‘wp-admin’ en ‘wp-includes’ verwijderen, en een schone variant van deze mappen terugzetten door WordPress opnieuw te downloaden.

    • Weet je niet meer zeker welke WordPress versie je hebt draaien? Kijk dan eerst nog even in ‘wp-includes/version.php’ en je vindt het versienummer op regel 7.
    • Download van deze versie een zip-bestand uit het WordPress release-archief en pak deze uit op je computer.
    • Verwijder via FTP de mappen ‘wp-admin’ en ‘wp-includes’ uit de root van je WordPress website.
    • Upload de mappen ‘wp-admin’ en ‘wp-includes’ van het zojuist uitgepakte zip-bestand.

    Behalve mappen staan er ook nog bestanden in de root van je website. Vervang deze bestanden – op wp-config.php na (!) – met de bestanden uit je uitgepakte zip-bestand.

    Staan er nog andere bestanden en mappen in de root van je website? Loop deze kritisch langs en bedenk of je ze thuis kunt brengen; heb je nog andere software op je website draaien? Zo niet, dan zijn ze misschien door de hacker geplaatst. Overleg bij twijfel met je webhost. Soms wordt een map als ‘stats’, ‘webstats’, ‘logs’ en ‘cgi-bin’ door je webhost voorgeïnstalleerd. Kijk in elk geval altijd even in deze mappen en zoek naar bestanden die eindigen met ‘.php’. Die horen daar namelijk niet zomaar thuis.

  • Plugins opschonen (wp-content/plugins)

    Voor plugins zijn, net als de WordPress core, originele schone versies te vinden in de WordPress plugin repository. Het kan echter zo zijn dat daar niet al je plugins vandaan komen; premium plugins schaf je bijvoorbeeld ergens anders aan. Premium plugins zijn bovendien niet altijd automatisch te updaten. Hoe dan ook, om er zeker van te zijn dat je hele plugin-folder schoon is, zul je alle originelen moeten traceren.

    • Dit is gelijk een goed moment om inactieve en weinig gebruikte plugins te verwijderen. Doe dat eerst.
    • De plugins uit de WordPress plugin repository kun je nu via FTP verwijderen. Download daarna de schone versies vanuit de repository en upload deze via FTP terug. Een plugin als Wordfence kan deze stap eventueel ook voor jou uitvoeren.
    • Van plugins die niet uit de WordPress repository komen, is het ook belangrijk om opnieuw schone versies te verkrijgen. Zorg dat je deze bestanden verkrijgt en herhaal de vorige stap voor deze plugins. Kun de originele plugin-bestanden niet meer vinden? Verwijder de plugin dan in zijn geheel, want het is heel goed mogelijk dat deze plugin dan een (mede-)veroorzaker van de hack is. Bovendien kun je je plugin dan ook niet meer updaten, en dat is funest voor de veiligheid van je website in de toekomst. Vaak kun je wel een alternatieve plugin vinden voor de functionaliteit die je zoekt.

    In deze stap update je gelijk al je plugins naar de nieuwste versie. Dat is veilig, maar kan conflicten opleveren wanneer de WordPress core of je thema bijvoorbeeld nog niet compatible is met de laatste versie van de plugin. Zet in zo’n geval een oudere versie terug van je plugin, of – liever nog – update je thema (zie volgende stap) om te controleren of het probleem daarmee is opgelost.

  • Thema updaten (wp-content/themes)

    WordPress thema’s bevatten soms maatwerk aanpassingen van jezelf of je website bouwer. Die aanpassingen gaan verloren wanneer je je thema updated, tenzij de aanpassingen van je thema in een aparte map zijn bewaard door gebruik van een child thema.

    Bevat je WordPress website geen child thema? Dan heb je in elk geval nog de mogelijkheid om je thema te updaten zoals uitgelegd in de vorige stap, al gaat maatwerk dan wel verloren. Wil je je maatwerk behouden, dan kun je deze gelegenheid aangrijpen om die wijzigingen eerst in een child thema onder te brengen. De child thema handleiding van WordPress legt uit hoe (let op: niet eenvoudig).

    Bevat je WordPress website wel een child thema? In dat geval kun je je WordPress thema prima updaten zoals uitgelegd in de vorige stap. Vervolgens moet je er wel nog voor zorgen dat je child thema-map ook schoon is. Als je zelf nog een lokale kopie van je child thema hebt, kun je die terugzetten (soms werkt een hele oude backup ook prima, als je zeker weet dat je website op dat moment niet gehackt is geweest). Heb je geen kopie meer, dan dien je de map van het child thema met de hand langs te lopen. Lees daarvoor ook de volgende stap.

    Vergeet tot slot niet om eventuele ongebruikte thema’s te verwijderen; daarmee verklein je de kans op problemen in de toekomst.

  • Overige bestanden controleren (wp-content)

    Je hebt nu zoveel mogelijk opgeschoond zonder nauwkeurig te hoeven kijken, maar er zijn altijd wat bestanden en mappen die je met de hand langs moet lopen.

    • Ga op zoek naar .php, .asp, .exe, en .sh bestanden in de map wp-content/uploads. Deze horen er niet en zijn mogelijk door hackers geplaatst. Het kost even tijd, maar vergeet niet om alle submappen te controleren. Met veel FTP-programma’s kun je automatisch zoeken binnen een map.
    • Sommige plugins voegen een eigen map toe aan de wp-contents map. Dit is niet per se erg, maar loop ook deze mappen door op bovenstaande bestanden.
    • Zijn er php-bestanden waarvan je geen origineel meer hebt, dus die je met de hand moet nalopen? Denk aan php-bestanden in de wp-contents map (zoals object-cache.php), je child thema, of wp-config.php in de root. Neem de volgende stappen:
      • Open ze in een tekst-editor en scroll alle kanten op; soms zetten hackers hun code in het bestand ‘buiten beeld’ door deze een heel eind naar rechts te zetten, of een heel eind naar onder.
      • Ga verder op zoek naar verontrustende code. Zoek naar termen als ‘eval’, ‘exec’, ‘base64’, ‘hash’, ‘decode’ en ga na of je code aantreft die er niet hoort te staan.
      • Twijfel je? Kopieer een stukje van de code en zoek er eens naar op Google. Soms stuit je gelijk al op allerlei malware forums, waardoor je weet dat de code geen zuivere koffie is.
  • Controleer wp-config.php

    Het bestand wp-config.php heb je tot nu toe onaangeraakt gelaten, maar moet je nog wel controleren. Dit bestand bevat alle basisconfiguratie voor je WordPress website. Heb je nog een oude backup tot je beschikking? Dan raden we aan om daar de wp-config.php van terug te plaatsen op je website. Pas dan wel het lijstje onder ‘Authentication Unique Keys and Salts’ aan door aan elke regel random code een paar tekens toe te voegen. Zo zorg je er onder andere voor dat ingelogde gebruikers (dus mogelijk ook hackers) niet meer zijn ingelogd.

    Heb je geen backup? Open dan je wp-config.php en vul alle waarden die je ziet staan in bij de wp-config.php generator door alle stappen te doorlopen. Kies bij Authentication Keys & Salts voor ‘Auto Generate’. Klik na de laatste stap op ‘update’ en kopier en plak de code naar je wp-config.php. Zo weet je zeker dat je een schone wp-config.php hebt gegenereerd.

  • Zoeken naar .htaccess

    Een .htaccess-bestand biedt de mogelijkheid om heel veel server-instellingen te configureren. Als een hacker dergelijke bestanden aanpast kan dit dus zeer schadelijk gedrag vertonen. In de root van je WordPress website staat sowieso een .htaccess-bestand, maar in principe kan er in elke map op je website eentje staan. Zoek daarom met een FTP-programma naar ‘.htaccess’ in alle mappen op je website.

    Het .htaccess-bestand in de root van je website bevat in principe enkel de volgende regels:

    # BEGIN WordPress
    
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    
    # END WordPress

    Staat er meer code in je .htaccess-bestand? Dat kan door een plugin zijn toegevoegd, maar het kan ook een hack zijn. Verwijder bij twijfel alle overige code uit je .htaccess-bestand; wellicht werkt een plugin dan niet meer optimaal, maar de meeste plugins kunnen de benodigde code automatisch weer toevoegen aan het .htaccess-bestand als dat nodig is.

    Kom je nog meer .htaccess-bestanden tegen?

    Ga dan na waar ze staan. Staan ze in een plugin of thema map? Dan zijn ze in principe veilig omdat je deze folders al hebt opgeschoond in de vorige stappen. Kom je ze echter tegen in de uploads map, child thema, etc., dan is het wel even de moeite om ze na te kijken. Overigens wordt er soms een .htaccess-bestand geplaatst in wp-content/uploads om te voorkomen dat bezoekers niet zonder toestemming door je upload-mappen kunnen bladeren. In zo’n geval kom je wellicht de volgende regel tegen in je .htaccess-bestand:

    Options -Indexes

    Dit is geen schadelijke regel, dus die kun je gerust laten staan.

Gebruikers opschonen

Nu alle bestanden schoon zijn, is het nog steeds mogelijk dat hackers toegang hebben tot je website. Ze kunnen bijvoorbeeld een extra beheerders-account aangemaakt hebben, of het wachtwoord hebben gewijzigd van één van de andere gebruikers. Bovendien is de kans ook aanwezig dat hackers zijn binnengekomen doordat ze een zwak wachtwoord wisten te raden.

Ga daarom in WordPress naar ‘Gebruikers’ en verwijder alle gebruikers die er niet thuishoren. Stel voor alle overige gebruikers een nieuw (complex!) wachtwoord in. Zo weet je zeker dat een hacker niet kan inloggen met een bestaande account. Leg aan je bestaande gebruikers uit waarom het noodzakelijk is om een complex wachtwoord te gebruiken.

Controleer database

De gevorderden onder ons kunnen nu ook nog eens een kijkje nemen in de database. Met een programma als PhpMyAdmin of Adminer kun je relatief eenvoudig door je database bladeren. Allereerst kun je eens een kijkje nemen in de ‘wp_users’ tabel; zie je nog gebruikers staan die er niet thuishoren? Verwijder deze dan alsnog handmatig. Soms lukt het hackers namelijk om een onzichtbare gebruiker toe te voegen.

Bekijk verder eens de tabelstructuur en vergelijk deze met de standaard WordPress Database structuur; zijn er tabellen toegevoegd die je niet thuis kunt brengen? Bekijk ze dan eens nader. Overigens voegen sommige plugins ook tabellen toe aan je database. Verwijder dan enkel de tabellen van inmiddels verwijderde plugins.

Wijzig alle wachtwoorden

wordpress-users-veiligheidIn de vijfde stap heb je de wachtwoorden van je gebruikers al gewijzigd, maar wellicht hebben hackers in de achtergrond nog meer wachtwoorden weten te achterhalen. Wijzig daarom in elk geval het wachtwoord van je database, maar ook je FTP-account, het hosting config panel, etc. Zo hoef je niet te twijfelen of je website wel weer helemaal veilig is. Vul het nieuwe database-wachtwoord ook in bij ‘DB_PASSWORD’ in het bestand wp-config.php.

Live zetten en testen

Je bent nu zover om je WordPress website weer live te zetten. Verwijder de blokkade van stap 1 en controleer of je website weer toegankelijk is zonder dat je ingelogd bent, bijvoorbeeld door je website te bezoeken vanaf een ander netwerk, of met je telefoon zonder wifi aan.

Mogelijk krijg je nu nog wel meldingen van Google dat je WordPress website malware bevat. In dat geval kan je WordPress website op een blacklist zijn gezet, waardoor deze ook niet meer in de zoekresultaten van Google wordt weergegeven. Gebruik de mogelijkheden die Google biedt om je WordPress website weer terug in de zoekresultaten te krijgen.

  1. Google Diagnostic Center (vervang www.voorbeeld.nl in de url voor je eigen domein). Met deze tool controleer je of de website op de blacklist van Google staat.
  2. In Google Webmasters wordt aangegeven of en wanneer Google een probleem met je WordPress website heeft geïndexeerd.
  3. Dien met de Google Reconsideration Tool een verzoek in bij Google om je WordPress website opnieuw te laten indexeren.

Updaten

Achter de schermen van WordPress is een grote community van ontwikkelaars continu bezig met het verbeteren van de code. Dit heeft als voordeel dat bekende lekken in WordPress, plugins en thema’s vaak heel snel worden gedicht door het uitbrengen van een nieuwe versie. Zorg er daarom altijd voor dat je website up-to-date. Zo verklein je de kans behoorlijk om opnieuw gehackt te worden én kun je een nieuwe update heel snel uitvoeren omdat het dan vaak maar een kleine wijziging is.

Handige links

Plugins

Onderstaande plugins helpen je om je website te beveiligen. En wanneer je website gehackt is kunnen de plugins je ook helpen om de website op te schonen.

Steve ontwikkelt WordPress websites en houdt zich bezig met nieuwe technieken voor WordPress, online communicatie en website-optimalisatie.

  • Stefan schreef:

    Interessant! 🙂

  • Johan de Jong schreef:

    Goed artikel, helder geschreven !

  • Els Spelt schreef:

    Handig artikel!

    Een vraag: is het oke als dit de eerste twee regels van het .htaccess bestand zijn?
    # BEGIN WordPress

  • Steve Lock schreef:

    Hoi Els,

    Dat is geen probleem!