← Terug naar kennisbank BEVEILIGING

Pharma hack — Viagra-spam in je WordPress site verwijderen

Viagra, Cialis, Kamagra of "buy meds online" in je Google-omschrijving? De pharma hack is één van de oudste WordPress-aanvallen, en juist daarom geraffineerd: hij verstopt zich op plekken waar weinig mensen kijken. Dit is hoe je 'm vindt en weghaalt.

Een trouwe klant belt: hij ziet plotseling Viagra-resultaten verschijnen als hij zijn eigen website googelt. Op de site zelf? Niets te zien. In Google Search Console? Honderden vreemde URL's met namen als /online-pharmacy-2024/. Welkom bij de pharma hack — een cousin van de Chinese spam-hack, maar met eigen verstopplekken en eigen aanpak.

Waar de Chinese hack vooral cloaking gebruikt (andere content tonen aan zoekmachines dan aan bezoekers), is de pharma hack vaak brutaler: hij injecteert spam direct in je posts, in de footer, in widget-areas, en in je database — soms zichtbaar, soms via CSS verborgen. De aanvaller wil een snelle ranking-boost voor pharmacy-keywords door jouw domein-autoriteit te kapen.

Update 2026: Plugin-gebaseerde aanvallen blijven dominant — meer dan 80% van succesvolle WordPress-hacks dit jaar liep via een verouderde of kwetsbare plugin. Pharma-spam injecties zijn daarbij nog steeds een populaire payload, juist omdat ze maandenlang onder de radar kunnen blijven. Het aantal succesvolle aanvallen op Nederlandse mkb-sites stijgt jaar op jaar — voor elk groot incident in het nieuws zijn er tientallen onzichtbare die hun rankings verliezen.

Hoe ziet de pharma hack eruit?

Typische symptomen:

  • Google-zoekresultaten tonen "Buy Viagra cheap online" of "Cialis without prescription" als titel of omschrijving van jouw pagina's
  • Honderden of duizenden nieuwe URL's verschijnen onder jouw domein, vaak met namen als /cheap-medications/, /online-pharmacy/, /buy-viagra-discount/
  • Pagina's bevatten plotseling onzichtbare tekst (gemaakt onzichtbaar via CSS: display:none, position:absolute; left:-9999px, witte tekst op witte achtergrond)
  • De footer van je site bevat plotseling onzichtbare links naar pharmacy-sites
  • Veel nieuwe spam-comments met links naar twijfelachtige medicatie-verkopers
  • Plotselinge daling in organische ranking voor je echte zoekwoorden
  • Soms: een waarschuwing in Search Console over "hacked content: pharmaceutical content"

Verschil met de Chinese spam-hack

Beide hacks hebben hetzelfde doel — jouw domein-autoriteit kapen voor SEO-fraude — maar werken anders:

  • Chinese hack: gebruikt cloaking. Bezoekers zien je normale site, alleen bots krijgen de spam. Lastig te detecteren.
  • Pharma hack: vaak direct in je content geïnjecteerd. Soms zichtbaar via "view source", soms verborgen via CSS, maar wél in de pagina aanwezig. Detectie is daarom relatief makkelijker.

Pharma hacks zijn ook vaker afkomstig van een kwetsbare plugin in plaats van een gestolen credential. Veel oudere plugins (vooral abandonware uit pre-2018) hebben bekende SQL-injection of arbitrary file-upload kwetsbaarheden waar pharma-aanvallers nog steeds dagelijks op scannen.

Stap 1: Bevestig dat het écht de pharma hack is

Test 1: View source op je homepage

Open je site, klik rechtermuisknop → "Bron bekijken" of Ctrl+U (Windows) / Cmd+Option+U (Mac). Zoek met Ctrl+F in de bron naar:

  • viagra
  • cialis
  • pharmacy
  • display:none
  • visibility:hidden
  • left:-9999px

Krijg je hits op pharma-keywords of verdachte CSS? Bevestiging.

Test 2: Bekijk je site als Googlebot

curl -A "Googlebot/2.1 (+http://www.google.com/bot.html)" \
  https://jouwdomein.nl/ | grep -iE "viagra|cialis|pharmacy"

Als hier hits uitkomen die je niet bij gewoon browsen ziet, is er ook nog een cloaking-component aan de hack.

Test 3: Search Console

Ga naar Search Console → Inhoud → Pagina's. Sorteer op "Geïndexeerd". Vergelijk met je werkelijke pagina's. Zie je tientallen of honderden URL's die je nooit hebt gemaakt? Bevestiging.

Onder "Beveiliging en handmatige acties" kan ook expliciet "Hacked: Content injection" of "Pharmacy hack" staan.

Stap 2: Bewijs verzamelen voor je iets weghaalt

Verleidelijk om meteen alle Viagra-tekst weg te halen — niet doen. Verzamel eerst:

  • Screenshots van Google-zoekresultaten met pharma-keywords
  • Volledige HTML van je homepage en 2-3 andere pagina's (rechtermuisklik → "Save as")
  • Lijst van vreemde URL's uit Search Console
  • Server access logs minimaal de laatste 30 dagen
  • Lijst van recent gewijzigde files: find . -type f -mtime -30 -name "*.php" -ls
  • Volledige database export (mysqldump)
  • Lijst van geïnstalleerde plugins met versies (cruciaal — hier zit vaak de aanvalsroute)

Stap 3: Site offline halen tijdens cleanup

Voorkom dat Google nog meer pharma-pagina's indexeert. In .htaccess:

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.89$
RewriteRule .* /maintenance.html [R=503,L]

Vervang 123.45.67.89 met je eigen IP. 503 Service Unavailable vertelt Google "tijdelijk weg, kom later terug" — beter dan 200 of 404 voor je rankings tijdens cleanup. Zie ook het .htaccess artikel voor meer context.

Stap 4: De verstopplekken — waar pharma-spam zit

Pharma hacks hebben favoriete verstopplekken die gedeeltelijk overlappen met andere hacks, maar ook eigen specialiteiten hebben.

4.1 — Posts en pages tabel (wp_posts)

De meest voorkomende verstopplek voor pharma-spam: direct in post_content of post_excerpt van bestaande posts. Soms aan het begin, soms aan het eind, vaak verborgen met inline CSS.

# Zoek pharma-keywords in posts
SELECT ID, post_title, post_status FROM wp_posts
WHERE post_content LIKE '%viagra%'
   OR post_content LIKE '%cialis%'
   OR post_content LIKE '%pharmacy%'
   OR post_excerpt LIKE '%viagra%';

# Zoek hidden CSS in posts
SELECT ID, post_title FROM wp_posts
WHERE post_content LIKE '%display:none%'
   OR post_content LIKE '%left:-9999px%'
   OR post_content LIKE '%visibility:hidden%';

Hits openen, kijken naar de spam-content, en handmatig schoonmaken. Pas op: soms zit de spam-content in elke post — niet één voor één klikken maar via SQL-update opschonen.

4.2 — wp_options tabel

Pharma-aanvallers slaan vaak de payload op in wp_options als geserialiseerde PHP-data. Check op verdachte option_names:

SELECT option_name, LENGTH(option_value) AS size FROM wp_options
WHERE option_name NOT LIKE '\\_%' ESCAPE '\\'
ORDER BY size DESC LIMIT 50;

Verdachte namen: class_generic_support, widget_generic_support, fwp, wp_check_hash. Of options met opvallend veel data (megabytes aan base64-encoded text).

4.3 — Comments tabel

Pharma-aanvallers gebruiken comments graag als injectiekanaal — soms duizenden spam-comments tegelijk:

SELECT comment_ID, comment_author, comment_content
FROM wp_comments
WHERE comment_content LIKE '%viagra%'
   OR comment_content LIKE '%cialis%'
   OR comment_author_url LIKE '%pharmacy%';

# Bulk delete spam-comments (eerst zelf controleren!)
DELETE FROM wp_comments WHERE comment_approved = 'spam';

4.4 — Theme functions.php

Pharma-aanvallers plaatsen graag injectie-code in wp-content/themes/jouw-theme/functions.php. Patronen om naar te zoeken:

  • add_action('wp_footer', ...) hooks die HTML met spam-links uitspuwen
  • add_filter('the_content', ...) die content modificeren
  • eval(base64_decode(...)) klassiekers
  • Verwijzingen naar $_GET of $_COOKIE in vreemde context

Vergelijk altijd je functions.php met de originele theme — verschillen die jij niet hebt gemaakt = verdacht.

4.5 — Plugins (vooral oudere)

Pharma hacks komen disproportioneel vaak binnen via:

  • Plugins die jaren niet zijn geüpdatet
  • "Premium" plugins waar je geen licentie meer voor hebt en dus geen updates krijgt
  • Plugins van het WordPress.org repository die zijn verwijderd wegens kwetsbaarheden (WP-Statistics, oudere versies van Yuzo Related Posts, Total Donations, etc.)
  • Random plugins die jij niet hebt geïnstalleerd maar plotseling in /wp-content/plugins/ staan

Loop alle plugin-mappen door:

ls -la wp-content/plugins/

Plugins die jij niet kent of niet zelf hebt geïnstalleerd zijn altijd verdacht.

4.6 — Random PHP files in webroot of submappen

Pharma payloads hebben favoriete verstopnamen:

  • wp-cache.php, wp-info.php, wp-class.php in de webroot
  • license.php, db.php, setup.php ergens in plugin/theme mappen
  • Files met willekeurige hex-namen zoals a3f9c2.php
  • PHP-files in wp-content/uploads/ (mag normaal alleen images hebben!)
# Recent gewijzigde PHP files
find . -type f -name "*.php" -mtime -30 -ls

# PHP in uploads (altijd verdacht)
find wp-content/uploads -name "*.php"

# Files met base64 of eval patterns
grep -rl "eval(base64_decode" .
grep -rl "preg_replace.*\/e" .

4.7 — .htaccess en .htaccess in submappen

Check je .htaccess op vreemde redirects of rewrites die specifieke User-Agents naar spam-URL's sturen. Pharma hacks gebruiken soms ook subdirectory-htaccess files. Check via SSH:

find . -name ".htaccess" -ls

Ga elke gevonden .htaccess handmatig na — meestal is alleen de root-versie nodig.

Klassieke truc: pharma-aanvallers verstoppen vaak een tweede backdoor naast de eerste. Je vindt iets en ruimt het op. Twee dagen later: weer Viagra in Google. Reden: een gemiste backdoor heeft alles geherinjecteerd. Daarom: zoek door tot je elke verdachte file hebt gevonden, niet alleen de eerste.

Stap 5: Grondig opschonen

Nu pas ga je opschonen. Drie principes:

  1. Replace, don't repair: vervang core, plugins en thema's met clean downloads. Vertrouw geen file die ooit besmet is geweest.
  2. Update tijdens cleanup: download de nieuwste versies, niet de versies die je had. Een cleanup is ook een meteen-update-moment.
  3. Verwijder eerst, kopieer dan: verwijder hele mappen voordat je nieuwe content erin zet. Anders blijft een achtergebleven malicious file gewoon staan.

Concrete cleanup:

  1. WordPress core: download huidige versie van wordpress.org. Verwijder wp-admin/ en wp-includes/ volledig en upload schone versie
  2. Plugins: deactiveer alle plugins. Verwijder de hele /wp-content/plugins/ map. Installeer alleen de plugins die je echt nodig hebt opnieuw, vanuit officiële bronnen
  3. Themes: verwijder alle thema's behalve één clean kopie van je actieve. Installeer dat thema vers vanuit een vertrouwde bron
  4. Uploads: scan op PHP-files (find wp-content/uploads -name "*.php" -delete)
  5. Database — schone op:
    -- Verwijder verdachte wp_options
    DELETE FROM wp_options WHERE option_name = 'class_generic_support';
    
    -- Update geïnfecteerde posts (let op: maak eerst backup!)
    UPDATE wp_posts
    SET post_content = REPLACE(post_content,
        '<div style="display:none">[VIAGRA SPAM]</div>', '')
    WHERE post_content LIKE '%display:none%viagra%';
    
    -- Bulk delete spam comments
    DELETE FROM wp_comments WHERE comment_approved = 'spam';
  6. Reset alle WordPress salts in wp-config.php via api.wordpress.org/secret-key/1.1/salt/
  7. Verwijder onbekende admin-users; reset wachtwoorden voor alle bestaande

Stap 6: Hardening na de cleanup

De aanvaller kwam ergens binnen. Voorkom herhaling — loop de 10 beveiligingsstappen door of laat de complete WordPress hardening door mij uitvoeren.

Specifiek voor pharma-vector:

  • Inventariseer welke plugin de aanvalsroute was (kijk naar timestamps in access_log rond moment van eerste injectie)
  • Update of verwijder die plugin definitief
  • Plaats .htaccess in /wp-content/uploads/ die PHP-uitvoering blokkeert
  • Sluit comments uit op oudere posts: Settings → Discussion → "Automatically close comments on posts older than X days"
  • Anti-spam plugin (Akismet of Antispam Bee) tegen comment-pharma
  • 2FA op alle admin-accounts

Stap 7: Herstel bij Google

  1. Submit reconsideration request in Search Console (Beveiliging & handmatige acties → Beoordeling aanvragen). Beschrijf wat er gebeurde, wat je hebt opgelost, en hoe je herhaling voorkomt
  2. Verwijder spam-pagina's: gebruik in Search Console "Verwijderingen" om de meest opvallende pharma-URL's tijdelijk uit Google's index te halen
  3. Force re-crawl van je echte pagina's via URL-inspectie tool
  4. Disavow: heb je merkbaar veel inkomende links uit pharma-spam-netwerken? Overweeg een disavow-bestand in Search Console — al gebruikt Google ze tegenwoordig minder vaak dan vroeger

Wanneer schakel je hulp in?

  • De spam komt binnen 1-2 weken na cleanup terug — je hebt een backdoor gemist die geautomatiseerd reinjecteert
  • Search Console toont meer dan 1.000 vreemde geïndexeerde URL's — handmatig verwijderen wordt onhandelbaar
  • Je vindt de injectiebron niet — de spam blijft maar terugkomen via een mechanisme dat je niet kunt traceren
  • Je hebt geen SSH-toegang en alle cleanup-werk moet via FTP en phpMyAdmin (kost dan 5x zoveel tijd)
  • Site is een live webshop met dagelijkse orders — je kan 'm niet uren offline halen voor cleanup
  • Manual action in Search Console blijft staan ondanks meerdere reconsideration requests — dat vereist specifieke insights waarom Google het nog niet vertrouwt

Pharma hacks zijn vaak hardnekkiger dan ze lijken. Eén gemiste backdoor en je staat over een week weer aan het begin. Een halve cleanup is geen cleanup.