
CVE-2026-97286 के लिए तकनीकी सलाह और प्रूफ़ ऑफ़ कॉन्सेप्ट, जो WordPress Strong Testimonials प्लगइन में एक प्रमाणित स्टोर्ड XSS है, जिसमें हमला श्रृंखला, PoC और पैच विश्लेषण शामिल है।
एक प्रमाणित Contributor WordPress Strong Testimonials प्लगइन में हमलावर-नियंत्रित प्लेटफ़ॉर्म फ़ोटो मेटाडेटा संग्रहीत कर सकता है। संस्करण 3.3.12 से पहले, प्लगइन संग्रहीत मान को संदर्भ-आधारित एस्केपिंग के बिना एक इमेज src एट्रिब्यूट के अंदर रेंडर करता था। एक व्यवस्थापक द्वारा तैयार किए गए टेस्टिमोनियल और उसे प्रदर्शित करने वाले एक पोस्ट को प्रकाशित करने के बाद, पेलोड उन आगंतुकों के लिए निष्पादित होता है जो उस पोस्ट को खोलते हैं, जिनमें अप्रमाणित आगंतुक भी शामिल हैं।
यह शोध एक अधिकृत स्थानीय लैब में किया गया और सार्वजनिक रिलीज़ से पहले Patchstack के माध्यम से प्रकट किया गया।
| फ़ील्ड | मान |
|---|---|
| CVE | CVE-2026-97286 |
| उत्पाद | Strong Testimonials |
| विक्रेता | WP Chill |
| प्लगइन स्लग | strong-testimonials |
| भेद्यता | प्रमाणित संग्रहीत क्रॉस-साइट स्क्रिप्टिंग |
| प्रभावित संस्करण | <= 3.3.11 |
| पैच किया गया संस्करण | 3.3.12 |
| आवश्यक विशेषाधिकार | Contributor या उच्चतर |
| CWE | CWE-79: वेब पेज जनरेशन के दौरान इनपुट का अनुचित न्यूट्रलाइज़ेशन |
| CVSS v3.1 | 6.5 मध्यम — CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L |
| शोधकर्ता | Rully Miftahur Rozaq |
| रिपोर्ट किया गया | 16 सितंबर, 2026 |
| सार्वजनिक प्रकटीकरण | 30 सितंबर, 2026 |
Patchstack सलाहकार को निम्न प्राथमिकता के रूप में वर्गीकृत करता है, भले ही आवंटित CVSS v3.1 आधार गंभीरता मध्यम है।
टेस्टिमोनियल संपादक एक custom अनुरोध ऐरे स्वीकार करता है और प्रत्येक सबमिट की गई कुंजी को पोस्ट मेटाडेटा के रूप में संग्रहीत करता है। कॉन्फ़िगर की गई कस्टम-फ़ील्ड परिभाषा में मौजूद नहीं होने वाली कुंजियाँ sanitize_text_field() पर गिर जाती हैं। यह एक Contributor को अपने स्वामित्व वाले टेस्टिमोनियल को संपादित करते समय platform और platform_user_photo जैसे प्लगइन-आरक्षित मेटाडेटा सबमिट करने की अनुमति देता है।
समर्थित सोशल प्लेटफ़ॉर्म के लिए, प्लगइन platform_user_photo प्राप्त करता है, सत्यापित करता है कि URL HTTP 200 प्रतिक्रिया लौटाता है, और फिर मूल संग्रहीत स्ट्रिंग को <img src="https://raw.githubusercontent.com/rully2212/cve-2026-97286/main/..."> एट्रिब्यूट में इंटरपोलेट करता है। HTTP स्थिति सत्यापन किसी स्ट्रिंग को HTML एट्रिब्यूट के लिए सुरक्षित नहीं बनाता है। URL फ़्रैगमेंट में एक उद्धरण चिह्न src को समाप्त कर सकता है और एक इवेंट हैंडलर पेश कर सकता है।
सत्यापित हमला श्रृंखला है:
इंजेक्शन प्रमाणित है। जो आगंतुक पहले से प्रकाशित पेलोड को ट्रिगर करता है, उसे प्रमाणित होने की आवश्यकता नहीं है।
सफल शोषण उन पृष्ठों पर प्रभावित WordPress ओरिजिन में स्थायी JavaScript निष्पादन प्रदान करता है जो भेद्य थंबनेल पथ के माध्यम से तैयार किए गए टेस्टिमोनियल को रेंडर करते हैं। कोड आगंतुक के ब्राउज़र विशेषाधिकारों और WordPress सत्र के साथ निष्पादित होता है, यदि कोई हो।
पुनरुत्पादित पथ के लिए व्यवस्थापक प्रकाशन की आवश्यकता होती है, जो CVSS UI:R मीट्रिक को स्पष्ट करता है। इस शोध ने अप्रमाणित इंजेक्शन, हर साइट पृष्ठ पर स्वचालित निष्पादन, विशेषाधिकार वृद्धि, कुकी चोरी, या पूर्ण साइट समझौता प्रदर्शित नहीं किया।
प्रूफ़ ऑफ़ कॉन्सेप्ट निम्नलिखित कॉन्फ़िगरेशन के साथ पुनरुत्पादित किया गया था:
| घटक | कॉन्फ़िगरेशन |
|---|---|
| WordPress | 7.1 |
| Strong Testimonials | 3.3.7, निःशुल्क संस्करण |
| थीम | Twenty Twenty-Five |
| डिस्प्ले टेम्पलेट | default-theme |
| थंबनेल | सक्षम |
| PHP / Apache | PHP 8.3.33 / Apache 2.4.68 |
| डेटाबेस | MariaDB 11.4 |
| हमलावर भूमिका | Contributor |
| हमलावर क्षमताएँ | edit_posts=true, publish_posts=false, unfiltered_html=false |
संस्करण 3.3.7 लैब में उपयोग किया गया सटीक संस्करण था। सार्वजनिक CVE रिकॉर्ड 3.3.11 तक के सभी संस्करणों को प्रभावित और संस्करण 3.3.12 को ठीक किया गया के रूप में पहचानता है।
admin/class-strong-testimonials-post-editor.php में, save_details() सबमिट किए गए custom array की प्रत्येक entry पर iterate करता है। एक अपरिचित key generic sanitization branch तक पहुँचती है और फिर update_post_meta() के साथ संग्रहीत की जाती है:
$custom = $_POST['custom'];
foreach ( $custom as $key => $value ) {
// ...
$sanitized_value = sanitize_text_field( $value );
update_post_meta( $post_id, $key, $sanitized_value );
}
वास्तविक हैंडलर nonce जाँच और फ़ील्ड-विशिष्ट सैनिटाइज़ेशन करता है। यह निष्कर्ष उन जाँचों को बायपास करने या किसी अन्य उपयोगकर्ता की प्रशंसापत्र (testimonial) को संपादित करने पर निर्भर नहीं करता। Contributor वैध रूप से अपनी ही प्रशंसापत्र संपादित करता है लेकिन आरक्षित कुंजियाँ platform और platform_user_photo प्रदान करता है।
कमज़ोर संस्करणों में, includes/functions-image.php platform_user_photo को पढ़ता है, wpmtst_is_valid_image_url() के माध्यम से HTTP स्थिति जाँच करता है, और मूल स्ट्रिंग को एक HTML एट्रिब्यूट में सम्मिलित करता है:
$platform_user_photo = get_post_meta( $post_id, 'platform_user_photo', true );
if ( ! $platform_user_photo || ! wpmtst_is_valid_image_url( $platform_user_photo ) ) {
return $img;
}
return sprintf(
'<img src="https://raw.githubusercontent.com/rully2212/cve-2026-97286/main/%25s" %s %s/>',
$platform_user_photo,
$width ? "width='{$width}'" : '',
$height ? "height='{$height}'" : ''
);
URL का fragment भाग HTTP सर्वर को नहीं भेजा जाता, लेकिन यह उस स्ट्रिंग में बना रहता है जिसे बाद में PHP द्वारा रेंडर किया जाता है। इसलिए सर्वर एक हानिरहित URL को HTTP 200 लौटाते हुए देख सकता है, जबकि ब्राउज़र को एक ऐसा मान प्राप्त होता है जिसमें attribute-breakout अनुक्रम होता है।
default-theme टेम्पलेट wpmtst_get_thumbnail() को कॉल करता है और लौटाए गए इमेज मार्कअप को सीधे उत्सर्जित करता है:
<figure class="wp-block-image wpmtst-testimonial-avatar">
<?php echo $wpmtst_avatar_html; ?>
</figure>
टेम्पलेट मानता है कि हेल्पर पहले से ही सुरक्षित HTML उत्पन्न कर चुका है। प्रभावित संस्करणों में, प्लेटफ़ॉर्म फ़ोटो हेल्पर अपने src संदर्भ के लिए URL को एस्केप नहीं करता था।
इस समस्या को केवल उसी सिस्टम पर पुनरुत्पादित करें जो आपके स्वामित्व में है या जिसे परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है।
<= 3.3.11।default-theme का उपयोग करने वाला एक Strong Testimonials Display व्यू।Contributor के रूप में साइन इन करें और एक नया testimonial ड्राफ़्ट बनाएँ।
एक इंटरसेप्टिंग प्रॉक्सी का उपयोग करके वैध POST /wp-admin/post.php सेव अनुरोध को कैप्चर करें। इसका पूरा फ़ॉर्म बॉडी, सेशन कुकी, ताज़ा WordPress nonce, प्लगइन nonce, और Contributor के स्वामित्व वाले testimonial की ID सुरक्षित रखें।
फ़ॉर्म बॉडी में ये पैरामीटर जोड़ें:
custom[platform]=facebook
custom[platform_user_photo]=http://wordpress/index.php?rest_route=/#" onerror="alert(1)" x="
URL-encoded फ़ॉर्म फ़्रैगमेंट:
&custom%5Bplatform%5D=facebook&custom%5Bplatform_user_photo%5D=http%3A%2F%2Fwordpress%2Findex.php%3Frest_route%3D%2F%23%22%20onerror%3D%22alert%281%29%22%20x%3D%22
wordpress होस्टनाम स्थानीय लैब में उपयोग किया जाने वाला Docker सेवा नाम है। किसी अन्य अधिकृत वातावरण में, इसे एक शोधकर्ता-नियंत्रित परीक्षण एंडपॉइंट से बदलें जो WordPress से पहुँच योग्य हो और HTTP 200 लौटाता हो। तृतीय-पक्ष या संवेदनशील आंतरिक सेवाओं को लक्षित न करें।