La API REST de WordPress (/wp-json) es una puerta de entrada que, por defecto, expone información valiosa que los atacantes pueden explotar para reconocimiento y planificación de ataques. Indicamos cómo bloquear este acceso y evitar exponer esta información en un sitio web WordPress.
- Información filtrada y explotación con REST API de WordPress.
- Proteger acceso a REST API de WordPress.
- Mejoras adicionales para máxima seguridad: Bloquear también en
.htaccess.
Información filtrada y explotación de REST API de WordPress
Información sensible que filtra por defecto con el REST API de WordPress
- Estructura completa del sitio: nombres de temas, plugins activos y sus versiones, accediendo a https://tu-sitio.com/wp-json.

- Listado de endpoints: revela qué plugins están instalados (AIOSEO, MonsterInsights, WooCommerce, etc.).
- Rutas de usuarios: /wp-json/wp/v2/users expone nombres de usuario, facilitando ataques de fuerza bruta.

- Tipos de contenido personalizados: revela la arquitectura de datos del sitio.
- Configuración del sitio: zona horaria, estructura de URLs, etc.
Cómo explotan esta información los atacantes:
- Footprinting (reconocimiento): Escanean /wp-json para mapear la infraestructura.
- Identificación de CVE: Detectan plugins vulnerables por sus endpoints expuestos.
- Ataques dirigidos: Con los nombres de usuario, realizan ataques de fuerza bruta.
- Ingeniería inversa: Estudian la estructura para diseñar exploits personalizados.
Ejemplo de consulta maliciosa:
|
1 2 3 4 |
# Un atacante puede obtener tu lista de usuarios con: curl https://tusitio.com/wp-json/wp/v2/users # Resultado: expone nombres de usuario, IDs, enlaces a sus publicaciones... |
Proteger acceso a API REST de WordPress
Hay varios métodos para proteger el acceso al API REST de WordPress, a continuación explicamos uno de ellos, modificando el fichero functions.php del tema visual actual para redirigir el acceso (si es un usuario no autenticado) a la página princial.
Paso 1: Acceder al archivo functions.php
En primer lugar, necesitaremos acceder al fichero functions.php del tema de WordPress, esto lo podemos hacer de varias formas:
Desde el administrador de archivos del hosting:
- Accede a cPanel o al panel de control de del hosting donde esté alojada la web.
- Accedemos al «Administrador de Archivos» (o herramienta similar).
- Navegaremos a la carpeta :
public_html/wp-content/themes/tu-tema-activo/ - Localizamos el archivo
functions.php.
Vía FTP (con cliente FTP como FileZilla o desde línea de comandos)
Podemos usar clientes como FileZilla en modo gráfico o bien, desde la línea de comandos:
|
1 2 3 4 5 |
# Nos conectamos por FTP o SFTP ftp> open servidor_web.com ftp> cd /public_html/wp-content/themes/tu-tema-activo/ ftp> get functions.php # Editamos en local y lo subimos por FTP |
Desde el panel de WordPress (menos seguro, solo si no hay otra opción)
- Desde
Apariencia → Editor de archivos de tema. - Selecciona
functions.phpde la lista. - En el editor realiza las modificaciones.
Paso 2: Implementar el código de redirección en functions.php
IMPORTANTE: Si no usas un tema hijo, crea uno primero, NO es recomendable editar el tema padre directamente.
Añade este código al final del archivo functions.php, antes del ?> si existe:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/** * ============================================================ * SEGURIDAD: Redirección de la REST API para usuarios NO logueados * Previene el footprinting y reconocimiento malicioso * ============================================================ */ add_filter( 'rest_authentication_errors', function( $access ) { // Verificar si el usuario NO ha iniciado sesión if ( ! is_user_logged_in() ) { // Registrar intento de acceso no autorizado (opcional pero recomendado) if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) { error_log( 'Intento de acceso no autorizado a REST API desde: ' . $_SERVER['REMOTE_ADDR'] . ' a ' . $_SERVER['REQUEST_URI'] ); } // Redirigir a la página principal (código 302 = temporal) wp_redirect( home_url(), 302 ); exit; // Detener la ejecución inmediatamente } // Usuarios autenticados: permitir acceso normal return $access; }); // Eliminar enlaces a la API en cabeceras HTTP (reduce exposición) remove_action( 'wp_head', 'rest_output_link_wp_head', 10 ); remove_action( 'template_redirect', 'rest_output_link_header', 11 ); |
Paso 3: Verificar sintaxis (crítico para no romper el sitio)
Antes de guardar, es muy recomendable comprobar la sintaxis del fichero functions.php, porque si hay errores, el sitio web «se romperá»:
|
1 2 |
# Si tienes acceso SSH al servidor web, puedes verificar con: php -l functions.php |
Una vez revisado el fichero funtions.php, vuelve a subirlo.
Paso 4: Probar la implementación
Desde navegador web
Accede al sitio web sin loguear, lo más fiable es abriendo una ventana de incógnito/privada:
- Abre una ventana de incógnito/privada
- Visita
https://tusitio.com/wp-json - Resultado esperado: debe redirigir automáticamente a
https://tusitio.com
Desde terminal (simulando atacante)
|
1 2 3 4 5 6 |
# Intento de acceso no autenticado curl -I https://tusitio.com/wp-json # Resultado esperado: # HTTP/2 302 Found # location: https://tusitio.com/ |
Verificar que con usuario logueado sí hay acceso
- Inicia sesión como administrador
- Visita
https://tusitio.com/wp-json - Resultado esperado: Muestra el JSON completo de la API
Mejoras adicionales para máxima seguridad: Bloquear también en .htaccess
Si se quiere una doble capa de seguridad, se puede añadir también el bloqueo al REST API desde el fichero .htaccess, añadiendo este contenido:
|
1 2 3 4 |
# Redirigir wp-json para no autenticados a nivel servidor RewriteCond %{REQUEST_URI} ^/wp-json/?$ RewriteCond %{HTTP_COOKIE} !wordpress_logged_in RewriteRule ^(.*)$ / [R=302,L] |