XML-RPC के बारे में

XML-RPC रिमोट प्रोसीजर कॉल के लिए एक प्रोटोकॉल है, जो डेटा के आदान-प्रदान के लिए XML का उपयोग करता है। XML-RPC में जो क्लाइंट किसी रिमोट मेथड को कॉल करना चाहता है, वह इनपुट पैरामीटर XML के रूप में तैयार करता है और उन्हें HTTP रिक्वेस्ट के ज़रिए XML-RPC प्रोटोकॉल लागू करने वाले रिमोट सर्वर को भेजता है।

WordPress में XML-RPC को समझना

WordPress एक संपूर्ण ब्लॉगिंग प्लेटफ़ॉर्म है। इसे अत्यधिक कस्टमाइज़ करने योग्य और वेबसाइट विकसित करने में आसान बनाया गया है। WordPress XML-RPC की मदद से WordPress ब्लॉगिंग क्लाइंट बनाए जा सकते हैं, साथ ही ऐसे अन्य सॉफ़्टवेयर भी बनाए जा सकते हैं जो किसी फ़ाइल से एक साथ कई पोस्ट बनाने जैसे बैच कार्य करते हैं। WordPress प्लगइन्स की मदद से XML-RPC सिस्टम के व्यवहार को बदलने के लिए उसका विस्तार किया जा सकता है। WP 3.5 के बाद से XML-RPC की सुविधा डिफ़ॉल्ट रूप से चालू रहती है, खासकर मोबाइल डिवाइस और थर्ड-पार्टी डेस्कटॉप ऐप्स के लिए, जो WordPress से संपर्क करने के लिए इसका उपयोग करते हैं।

XMLRPC की समस्या यह है कि इससे CPU और मेमोरी की अत्यधिक खपत हो सकती है और साइट का डेटाबेस खुले कनेक्शनों की अधिकतम संख्या तक पहुँच सकता है। इससे असुरक्षित साइट (और सर्वर) कुछ समय के लिए बंद हो सकता है, जिससे आपकी वेबसाइट की उपलब्धता प्रभावित होती है।

WP के XML-RPC API का दुरुपयोग हमलावर चार तरीकों से कर सकता है:

  • जानकारी जुटाना — हमलावर लक्ष्य के आंतरिक नेटवर्क में विशिष्ट पोर्ट की जाँच कर सकता है
  • पोर्ट स्कैनिंग — हमलावर आंतरिक नेटवर्क के होस्ट को पोर्ट-स्कैन कर सकता है
  • DoS हमले — डेटा ट्रांसफ़र के अलावा, xmplrpc.php पिंगबैक और ट्रैकबैक सक्षम करने के लिए भी ज़िम्मेदार है। ये वे सूचनाएँ हैं जो आपको तब मिलती हैं जब कोई ब्लॉग या थर्ड-पार्टी वेबसाइट आपकी वेबसाइट से लिंक करती है। हालाँकि इसकी जगह नई सुविधाएँ आ चुकी हैं, फिर भी कुछ वेबसाइटें पुराने सिस्टम के साथ संगतता के लिए XML-RPC.php का उपयोग करती हैं। यदि आप भी उनमें से एक हैं, तो हैकर बड़ी संख्या में पिंगबैक भेजकर xmlrpc.php पर DDoS हमले कर सकते हैं और आपकी साइट को ठप कर सकते हैं, यानी उसे आपके उपयोगकर्ताओं के लिए अनुपलब्ध बना सकते हैं।
  • राउटर हैकिंग — हमलावर नेटवर्क के किसी आंतरिक राउटर को दोबारा कॉन्फ़िगर कर सकता है
  • ब्रूट-फ़ोर्स हमले - XML-RPC (XML-remote processing call) HTTP के माध्यम से भेजे जाने वाले एन्कोड किए गए रिमोट कॉल की अनुमति देता है, जिससे आप अपनी WordPress वेबसाइट पर कोई फ़ाइल या सामग्री दूर से पोस्ट, संपादित या हटा सकते हैं। हर अनुरोध के साथ xmplrpc.php प्रमाणीकरण की जानकारी भेजता है। इससे एक बार में बड़ी मात्रा में डेटा भेजना आसान हो जाता है। लेकिन एक बार में बड़ी मात्रा में डेटा भेजने की इस क्षमता का अर्थ यह भी है कि हैकर भी इसमें कई पासवर्ड भेज सकते हैं। यदि कोई हैकर यूज़रनेम और पासवर्ड के अलग-अलग संयोजनों के साथ पर्याप्त प्रमाणीकरण अनुरोध भेजता है, तो संभव है कि वह अंततः सही संयोजन पता कर ले, और परिणामस्वरूप आपकी साइट से समझौता हो जाए।

जाँचें कि आपके ब्लॉग पर XML-RPC पहले से अक्षम है या नहीं

आगे बढ़ने से पहले हमें एक सरल जाँच करनी होगी कि आपके ब्लॉग पर XML-RPC सक्षम है या नहीं। यह जाँचने के लिए अपने ब्राउज़र में इस URL को खोलकर xmlrpc.php फ़ाइल तक पहुँचने का प्रयास करें https://domain.com/xmlrpc.php (domain.com के स्थान पर अपना डोमेन नाम लिखें)।

यदि यह अक्षम है, तो आपको “403 – Forbidden” संदेश दिखाई देगा। यदि कोई अन्य संदेश दिखाई देता है, तो बचाव के विकल्प समझने के लिए आगे पढ़ें।

कोड आधारित बचाव या वैकल्पिक उपाय

1. यदि आप XML-RPC सुविधा का किसी भी काम के लिए उपयोग नहीं कर रहे हैं, तो किसी भी कमज़ोरी से सुरक्षा के लिए .htaccess में नीचे दी गई पंक्तियाँ जोड़ें:

# protect xmlrpc
<IfModule mod_alias.c>
RedirectMatch 403 /xmlrpc.php
</IfModule>

2. xmlrpc.php के अनुरोधों को किसी कस्टम पेज पर रीडायरेक्ट करने के लिए RedirectMatch को इस प्रकार बदलें:

# protect xmlrpc
Redirect 301 /xmlrpc.php http://example.com/custom-page.php

3. xmlrpc.php तक सभी पहुँच को अस्वीकार करना:

# protect xmlrpc
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>

4. xmlrpc.php तक पहुँच केवल चुनिंदा IP पतों के लिए अनुमत करें।

# protect xmlrpc
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
Allow from <IP>
Allow from <IP>
</Files>

यदि आप अपनी साइट के लिए XML-RPC अक्षम करना चाहते हैं, तो आप अपनी wp_config.php में require_once(ABSPATH . ‘wp-settings.php’); पंक्ति के बाद निम्नलिखित कोड भी जोड़ सकते हैं।

add_filter('xmlrpc_enabled', '__return_false');