Formularios de contacto secuestrados: la puerta trasera que los hackers usan para robar tus datos
En mi experiencia analizando webs comprometidas, uno de los vectores de ataque más silenciosos y efectivos es el secuestro de formularios de contacto. La mayoría de propietarios de sitios web no se dan cuenta de que sus formularios están siendo manipulados hasta que es demasiado tarde. Los datos de sus clientes —nombres, correos, teléfonos, mensajes privados— ya están en manos de criminales.
Este ataque es particularmente peligroso porque ocurre sin que el usuario lo note. El formulario sigue viéndose normal, funciona correctamente, pero en segundo plano los datos se están duplicando hacia servidores controlados por atacantes. En este artículo te explico cómo funciona este ataque, cómo detectarlo y, lo más importante, cómo blindar tus formularios.
¿Cómo se comprometen los formularios de contacto?
Cuando analizo un sitio WordPress infectado con un backdoor, casi siempre encuentro modificaciones en los archivos que procesan los formularios. Los métodos más comunes son:
1. Inyección en plugins de formularios desactualizados
Plugins como Contact Form 7, WPForms, Gravity Forms o Forminator tienen vulnerabilidades conocidas. Si no actualizas regularmente, los atacantes explotan fallos de inyección SQL, XSS o RFI (Remote File Inclusion) para inyectar código malicioso directamente en el procesamiento del formulario.
Lo que sucede es que el atacante modifica el archivo functions.php del plugin o añade un archivo .php oculto en la carpeta /wp-content/plugins/ que intercepta todos los datos del formulario. Cuando un usuario envía información, se ejecuta este código malicioso antes de procesar el envío legítimo.
2. Modificación del archivo functions.php del tema
Este es el método que más veo en mis auditorías. El atacante accede al panel de WordPress (generalmente por contraseña débil o brute force en wp-login.php) y edita directamente el functions.php del tema activo. Aquí puede añadir un hook de WordPress que captura todos los formularios:
add_action('wp_footer', 'capture_form_data');
Con esta única línea, el atacante intercepta cada envío de formulario antes de que llegue a tu correo. Los datos se guardan en una tabla oculta de la base de datos o se envían a un servidor remoto.
3. Acceso directo a wp-config.php y modificación de credenciales de base de datos
En algunos casos, el atacante va más allá y modifica las credenciales de conexión a la base de datos en wp-config.php. Esto permite que los datos fluyan simultáneamente a dos bases de datos: la tuya y la del atacante. Es prácticamente indetectable sin un análisis forense profundo.
4. Webshells y backdoors en carpetas uploads
He encontrado archivos .php disfrazados de imágenes (foto.jpg.php) o con nombres inocentes (ajax-handler.php) dentro de /wp-content/uploads/. Estos archivos actúan como middleman: reciben los datos del formulario, los procesan, y luego los redirigen al servidor legítimo.
5. Manipulación de hosting o DNS
En ataques más sofisticados, el atacante no modifica tu código, sino que redirige tu dominio a un servidor proxy. El usuario ve tu sitio normal, pero todos los datos pasan por servidores comprometidos antes de llegar a tu hosting real.
¿Cómo detectar si tus formularios han sido secuestrados?
La detección es complicada porque, como dije, el formulario sigue funcionando normalmente. Pero hay señales de alerta que yo siempre busco:
Señales técnicas que indican compromiso
- Archivos .php desconocidos en /wp-content/uploads/ o /wp-content/plugins/. Usa FTP o un gestor de archivos para revisar qué hay realmente. Cualquier .php que no reconozcas es sospechoso.
- Funciones ocultas en functions.php. Abre el archivo y busca código obfuscado: líneas con caracteres extraños, funciones con nombres raros, o código base64.
eval(base64_decode(...))es un clásico. - Tablas extrañas en la base de datos. Accede a phpMyAdmin y revisa todas las tablas. Si ves algo como
wp_x7d8f2omalware_data, es un backdoor. - Usuarios de WordPress no autorizados. En el panel, ve a Usuarios. ¿Hay cuentas que no creaste? Los atacantes crean nuevos admins para mantener acceso.
- Incremento inusual en tráfico de salida. Si tu sitio está enviando datos a servidores remotos, verás picos de ancho de banda. Revisa logs con
netstatolsofsi tienes acceso SSH. - Errores en los logs de WordPress. Activa debug mode en wp-config.php y revisa
wp-content/debug.log. Errores de conexión a bases de datos remotas o fallos al escribir en ficheros pueden indicar actividad maliciosa. - Cambios en timestamps de archivos. Descarga todos los archivos de tu WordPress y verifica fechas de modificación. Archivos editados recientemente que no has tocado son un red flag.
Señales de negocio
- Clientes que se quejan de recibir correos spam o phishing relacionados con tu sitio después de completar formularios.
- Chargeback en pagos: si tienes un formulario de compra, fraudulentos usando datos robados de tus usuarios.
- Tu dominio aparece en bases de datos de breaches (revisa haveibeenpwned.com).
- Google Search Console te muestra warnings de «sitio hacked» o «sitio distribuye malware».
Herramientas para auditar formularios comprometidos
Estas son las herramientas que uso en mis auditorías:
Wordfence Security Scanner
Wordfence CLI es mi aliado número uno. Desde terminal, ejecuto:
./wordfence scan --verbose
Detecta backdoors, archivos maliciosos, cambios no autorizados en plugins y temas. Ofrece un reporte detallado de qué se ha comprometido.
WP-CLI para auditorías manuales
Con WP-CLI puedo listar usuarios, revisar opciones de base de datos y buscar hooks maliciosos:
wp user list — muestra todos los usuarios
wp option get active_plugins — lista plugins activos
MalCare o Sucuri SiteCheck
Estos servicios escanean tu sitio en busca de malware conocido y patrones de inyección. Sucuri SiteCheck es gratuito y muy útil como primer paso.
Análisis de logs con netstat y lsof
Si tengo acceso SSH (que siempre pido), ejecuto:
netstat -tulpn | grep ESTABLISHED
Para ver todas las conexiones activas. Si veo conexiones a IPs o dominios extraños, es que hay datos fluyendo sin autorización.
Cómo blindar tus formularios contra este ataque
La prevención es siempre mejor que la limpieza. Aquí están las medidas concretas que recomiendo:
1. Mantén todo actualizado religiosamente
WordPress, plugins, temas. Sin excepciones. Las vulnerabilidades en Contact Form 7, Gravity Forms o WPForms se parchean regularmente, pero solo funciona si actualizas. Configura actualizaciones automáticas en WordPress:
define('AUTOMATIC_UPDATER_DISABLED', false);
2. Usa contraseñas fuertes y 2FA en wp-login.php
Muchas inyecciones comienzan con un ataque brute force al panel. Una contraseña con 20+ caracteres (mayúsculas, minúsculas, números, símbolos) más Two-Factor Authentication (plugin como Wordfence, Google Authenticator) hace que el acceso no autorizado sea casi imposible.
3. Protege wp-config.php y functions.php
En tu archivo .htaccess (raíz de WordPress), añade:
<files wp-config.php>
Order allow,deny
Deny from all
</files>
Y para proteger la edición de archivos desde el panel (muy importante):
define('DISALLOW_FILE_EDIT', true);
De esta forma, aunque el atacante entre al panel, no puede editar functions.php o plugins desde la interfaz gráfica.
4. Desactiva la ejecución de PHP en carpetas uploads
En /wp-content/uploads/.htaccess, añade:
<FilesMatch ".php$">
Deny from all
</FilesMatch>
Así, aunque un atacante cargue un webshell aquí, no se ejecutará.
5. Implementa Content Security Policy (CSP)
Una política CSP bien configurada impide que código inyectado se ejecute. En tu .htaccess o en el servidor:
Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'"
6. Audita regularmente los logs de acceso
Revisa /var/log/apache2/access.log o el equivalente de tu hosting. Busca patrones anormales:
- Múltiples errores 404 en /wp-admin/ (síntoma de fuzzing).
- Solicitudes POST a archivos php en /uploads/.
- User-agents sospechosos (bots, herramientas de scanning).
7. Usa un Web Application Firewall (WAF)
Servicios como Sucuri WAF, Cloudflare o Wordfence Premium filtran solicitudes maliciosas antes de que lleguen a tu servidor. Un WAF puede bloquear intentos de inyección SQL, XSS y otros ataques en tiempo real.
8. Cambia el prefijo de tablas de WordPress
Por defecto es wp_, lo que los atacantes esperan. En wp-config.php:
$table_prefix = 'mf7x_'; (o cualquier string aleatorio)
Esto complica mucho los ataques que asumen la estructura estándar.
9. Valida y sanitiza todos los datos del formulario
Si usas un formulario personalizado (no un plugin), asegúrate de:
$data = sanitize_text_field($_POST['nombre']);
$email = sanitize_email($_POST['correo']);
WordPress tiene funciones de sanitización integradas. Úsalas siempre.
10. Monitorea la integridad de archivos
Con Wordfence File Integrity Monitoring o AIDE, puedes detectar cuándo un archivo ha sido modificado sin tu permiso. Wordfence te notifica en tiempo real si alguien toca un archivo crítico.
¿Qué hacer si ya has sido víctima de este ataque?
Si sospechas que tus formularios están secuestrados, los pasos son claros pero requieren atención inmediata:
Paso 1: Aísla el sitio
Si es posible, toma el sitio offline o coloca una página de mantenimiento. Notifica a tus usuarios sobre la situación. La transparencia es clave aquí para cumplir con regulaciones de la AEPD en España.
Paso 2: Realiza una copia forense de la base de datos y archivos
Antes de tocar nada, descarga una copia completa. La usarás para investigar y, si es necesario, para análisis forense.
Paso 3: Identifica el vector de entrada
¿Fue un plugin vulnerable? ¿Una contraseña débil? ¿Un acceso compartido? Necesitas cerrar esa puerta.
Paso 4: Limpia el sitio profesionalmente
Aquí es donde recomiendo buscar ayuda especializada. Limpiar un WordPress infectado no es solo eliminar archivos maliciosos. Necesitas:
- Remover backdoors y shells ocultos.
- Limpiar todas las tablas de la base de datos comprometidas.
- Revisar y hardening de permisos de archivos.
- Verificar que no queda código inyectado en functions.php o plugins.
- Cambiar todas las contraseñas (hosting, FTP, base de datos, WordPress).
Paso 5: Notifica a tus usuarios afectados
Según la RGPD y regulaciones españolas (LSSI-CE), estás obligado a notificar a usuarios si sus datos personales han sido comprometidos. Esto debe hacerse en un plazo específico.
Paso 6: Solicita a Google que re-indexe tu sitio limpio
En Google Search Console, marca tu sitio como limpio. Google tardará un tiempo en verificar que ya no distribuye malware.
Casos reales que he visto en mis auditorías
Caso 1: E-commerce de moda (PrestaShop)
Un cliente tenía un formulario de contacto que parecía normal. Tras auditarlo, descubrí que los datos se capturaban en una tabla oculta llamada ps_stolen_data. El atacante accedió mediante un módulo nulled (cracked) de pago que había descargado de un sitio no oficial. La solución fue limpiar el módulo malicioso, hardening del back-office y reinstalar módulos certificados.
Caso 2: Gestoría (WordPress + Gravity Forms)
Formularios de recogida de datos fiscales completamente comprometidos. El atacante explotó una vulnerabilidad XSS en Gravity Forms 2.4.x (ya parchada) para inyectar un backdoor en functions.php. Los datos iban a un servidor en Rusia. Implementamos limpieza completa, actualización forzada de todos los plugins y WAF de Sucuri.
Caso 3: Blog corporativo (WordPress + Contact Form 7)
Un archivo .php llamado mail-handler.php estaba oculto en /wp-content/uploads/. Capturaba todos los formularios, duplicaba los datos a dos servidores remotos y luego permitía que el formulario se enviara normalmente. Sin esta auditoría profunda, habría pasado desapercibido indefinidamente.
Resumen: tu checklist de seguridad para formularios
Para que no se te olvide nada:
- ✓ Actualiza WordPress, plugins y temas cada semana.
- ✓ Usa contraseñas fuertes (20+ caracteres) + 2FA.
- ✓ Desactiva edición de archivos:
define('DISALLOW_FILE_EDIT', true); - ✓ Protege wp-config.php con .htaccess.
- ✓ Bloquea ejecución PHP en /wp-content/uploads/.
- ✓ Revisa funciones ocultas en functions.php regularmente.
- ✓ Audita usuarios de WordPress (elimina los que no reconozcas).
- ✓ Implementa WAF (Sucuri, Cloudflare, Wordfence Premium).
- ✓ Monitorea integridad de archivos con Wordfence.
- ✓ Realiza backups automatizados y verificables.
- ✓ Revisa logs de acceso mensualmente.
Los formularios de contacto son el alma de la interacción con tus clientes. Que estén secuestrados no solo compromete sus datos, sino tu reputación y cumplimiento legal. En mi experiencia, la prevención cuesta una fracción de lo que cuesta una limpieza posterior.
Si tienes dudas sobre si tu WordPress o PrestaShop está comprometido, o si necesitas una auditoría profunda de seguridad, contáctame a través de ManuelFolgar.com. Realizo análisis forenses detallados, limpiezas especializadas y hardening completo de plataformas e-commerce.