Een WordPress-installatie bestaat uit ruim duizend bestanden die u normaal nooit ziet. Ze doen hun werk, worden bij een update vervangen en verder laat u ze met rust. Precies daarom zijn ze aantrekkelijk voor iemand die ongemerkt iets wil verstoppen. Een paar regels extra code in een bestand dat toch niemand opent, en een aanvaller heeft een achterdeur die maandenlang onopgemerkt blijft.

Het geruststellende is dat u dit kunt controleren. De originele bestanden van elke WordPress-versie zijn openbaar, dus alles wat afwijkt, valt op te sporen. In dit stappenplan laten wij zien hoe u vaststelt of er WordPress-bestanden gewijzigd zijn, hoe u de uitkomst leest en welke afwijkingen onschuldig zijn.

Waarom gewijzigde bestanden zo’n sterk signaal zijn

Malwarescanners zoeken naar bekende patronen: stukjes code waarvan bekend is dat ze kwaadaardig zijn. Dat werkt goed voor veelvoorkomende besmettingen, maar minder goed voor iets nieuws of iets wat speciaal is aangepast. Een vergelijking met het origineel werkt anders. Die vraagt niet “is dit kwaadaardig?” maar “hoort dit hier?”. Elk bestand dat afwijkt van de officiële versie is verdacht, ongeacht wat erin staat.

Dat maakt de methode betrouwbaar voor de kernbestanden en de meeste plugins uit de officiële bibliotheek. Voor thema’s en premium plugins ligt het lastiger, omdat u het origineel niet altijd bij de hand heeft. Daar komen wij verderop op terug.

Stap 1: de kern vergelijken

De eenvoudigste route loopt via WP-CLI, de opdrachtregel voor WordPress. Als uw hostingpartij die aanbiedt (veel Nederlandse partijen doen dat via SSH), logt u in en voert u uit:

wp core verify-checksums

WordPress downloadt dan de controlesommen van uw versie en vergelijkt elk kernbestand. Krijgt u “Success: WordPress installation verifies against checksums”, dan is de kern intact. Krijgt u een lijst met waarschuwingen, dan wijkt elk genoemd bestand af of hoort het er niet thuis.

Heeft u geen opdrachtregel, dan bieden beveiligingsplugins zoals Wordfence en Solid Security dezelfde controle in het beheer. Ze tonen meestal ook het verschil tussen origineel en huidig bestand, wat het beoordelen makkelijker maakt. Een derde manier is handmatig: download de exacte versie van wordpress.org, pak uit en vergelijk met een programma zoals WinMerge of Beyond Compare. Omslachtig, maar het werkt altijd, ook op een site waar u geen plugin meer durft te installeren.

Stap 2: plugins en thema controleren

Voor plugins uit de officiële bibliotheek werkt hetzelfde principe:

wp plugin verify-checksums –all

Premium plugins en betaalde thema’s staan niet in die bibliotheek en kunnen dus niet automatisch worden vergeleken. Hier bewaart u zelf het origineel. Wij slaan van elke premium plugin en elk thema het zipbestand op dat bij de licentie hoort, met versienummer. Bij twijfel pakt u dat uit en vergelijkt u.

Het thema verdient extra aandacht. Het bestand functions.php van het actieve thema is een geliefde plek voor kwaadaardige code, omdat het bij elke pagina wordt uitgevoerd en omdat het legitiem is dat er maatwerk in staat. Kijk daar met eigen ogen naar, ook als een scanner niets meldt. Verdacht zijn lange onleesbare tekenreeksen, functies als base64_decode of eval, en verwijzingen naar domeinen die u niet kent.

Stap 3: de uitkomst duiden

Niet elke afwijking is een inbraak. Deze meldingen zien wij regelmatig en zijn meestal onschuldig:

  • wp-config.php en .htaccess horen af te wijken; die zijn per site verschillend. Lees ze wel even door.
  • readme.html en license.txt worden door sommige beveiligingsplugins bewust verwijderd of aangepast.
  • Bestanden in wp-content/uploads vallen buiten de controle, maar daar horen géén PHP-bestanden te staan. Vindt u die wel, dan is dat vrijwel altijd fout.
  • Vertaalbestanden (.mo en .po) worden los bijgewerkt en geven soms waarschuwingen.

Deze meldingen zijn wél ernstig: gewijzigde bestanden in wp-admin of wp-includes, onbekende bestanden met willekeurige namen in de hoofdmap, en PHP-bestanden op plekken waar alleen afbeeldingen horen. Ook een index.php in de hoofdmap die groter is dan een paar honderd bytes verdient argwaan; het origineel is een handvol regels.

Vindt u iets ernstigs, ga dan niet zelf bestanden verwijderen en verder werken. Een aanvaller die één bestand heeft kunnen wijzigen, heeft er meestal meer neergezet. Lees ons artikel over backdoors in WordPress voordat u aan de slag gaat, en maak eerst een volledige kopie van de besmette site voor onderzoek.

Stap 4: er een gewoonte van maken

Eén controle is een momentopname. De waarde zit in herhaling. Wat wij aanraden:

  1. Draai de controle direct na elke update, zodat u een schoon vertrekpunt heeft.
  2. Laat een beveiligingsplugin of monitoringdienst dagelijks controleren en u mailen bij afwijkingen. De meeste tools kunnen dat.
  3. Stel de melding zo in dat bekende, onschuldige afwijkingen niet elke dag terugkomen, anders leest u de mails na een week niet meer.
  4. Controleer bij elk vreemd verschijnsel (onbekende gebruikers, trage site, spam vanaf uw domein) direct opnieuw.

Een fictief maar realistisch voorbeeld: een accountantskantoor in Breda kreeg elke ochtend om zes uur een controlerapport, meestal leeg. Op een dinsdag meldde het rapport één nieuw bestand in wp-includes. De site werkte gewoon, niemand had iets gemerkt. Het bleek een achterdeur die twee dagen eerder was geplaatst via een lek in een verlaten formulierplugin. Omdat het zo snel werd gezien, was het herstel een kwestie van uren en was er geen spoor van misbruik. Zonder die dagelijkse controle was het waarschijnlijk pas opgevallen toen Google de site als gevaarlijk had gemarkeerd.

Wat u zelf doet en wanneer u hulp inschakelt

De controle zelf is prima zelf te doen, zeker via een plugin. Het beoordelen van de uitkomst vraagt enige ervaring, en het opruimen na een bevestigde inbraak vraagt meer dan dat: alle toegangen wissen, sleutels vernieuwen, de oorzaak dichten en nadien blijven kijken of het rustig blijft. Wie daar geen tijd of zin in heeft, kan dat onderbrengen bij een partij die malwarescans en bestandscontrole als vast onderdeel van het onderhoud uitvoert. WebMaintor doet dat bijvoorbeeld dagelijks, met een back-up vóór elke ingreep.

Begin in elk geval vandaag met één keer controleren. Het kost een kwartier, en het antwoord “alles klopt” is meer waard dan het lijkt.