
कमजोरी: प्रमाणित (Contributor+) संग्रहीत क्रॉस-साइट स्क्रिप्टिंग (XSS)
प्रभावित संस्करण: Autoptimize <= 3.1.13
पैच किया गया संस्करण: Autoptimize 3.1.14
फ़ाइल: classes/autoptimizeImages.php
यह कमजोरी classes/autoptimizeImages.php के भीतर create_img_preload_tag() विधि में मौजूद है। यह फ़ंक्शन सामग्री में पाई गई छवियों के लिए <link rel="preload"> टैग उत्पन्न करने के लिए ज़िम्मेदार होता है, जब छवि अनुकूलन या प्रीलोडिंग सक्षम होती है।
संस्करण 3.1.13 में, फ़ंक्शन मूल `` टैग को <link> टैग में बदलने से पहले title, alt, class, id, width, और height जैसे विशिष्ट एट्रिब्यूट्स को हटाने के लिए "ब्लैकलिस्ट" दृष्टिकोण (preg_replace के माध्यम से) का उपयोग करता है। हालाँकि, यह onload या onerror जैसे इवेंट हैंडलर एट्रिब्यूट्स को हटाने में विफल रहता है।
एक प्रमाणित हमलावर (कम से कम Contributor भूमिका के साथ) किसी पोस्ट में एक दुर्भावनापूर्ण `` टैग एम्बेड कर सकता है। जब प्लगइन इस पोस्ट को प्रीलोड लिंक उत्पन्न करने के लिए संसाधित करता है, तो दुर्भावनापूर्ण इवेंट हैंडलर बना रहता है और <link> टैग के अंदर पृष्ठ के <head> में इंजेक्ट हो जाता है। चूँकि <link rel="preload"> onload इवेंट का समर्थन करता है, JavaScript तब निष्पादित होती है जब संसाधन लोड होता है।
// classes/autoptimizeImages.php
public static function create_img_preload_tag( $tag ) {
// ...
// rewrite img tag to link preload img.
$_from = array( '<img ', ' src="https://raw.githubusercontent.com/ciscocamelo/cve-2025-13401-xss-stored/HEAD/," sizes=', ' srcset=' );
$_to = array( '<link rel="preload" as="image" ', ' href=', ' imagesizes=', ' imagesrcset=' );
$tag = str_replace( $_from, $_to, $tag );
// INSUFFICIENT SANITIZATION: Only removes specific attributes
$tag = preg_replace( '/ ((?:title|alt|class|id|loading|fetchpriority|decoding|data-no-lazy|width|height)=".*")/Um', '', $tag );
// ...
return $tag;
}
create_img_preload_tag अक्सर व्यूपोर्ट में पाई गई छवियों या स्पष्ट रूप से प्रीलोड की गई छवियों के लिए ट्रिगर होता है।<img src="https://example.com/image.jpg" onload="alert('XSS_POC_SUCCESS')">
<!-- Malicious Image -->
<img src="https://raw.githubusercontent.com/ciscocamelo/cve-2025-13401-xss-stored/HEAD/wp-content/plugins/autoptimize/classes/external/js/lazysizes.min.js" onload="alert(document.cookie)">
<link rel="preload" as="image" href="/wp-content/plugins/autoptimize/classes/external/js/lazysizes.min.js" onload="alert(document.cookie)">
width, height आदि एट्रिब्यूट हटाए जा सकते हैं, लेकिन onload बना रहता है।<link> टैग को पार्स करता है, संसाधन को प्रीलोड करता है, और onload इवेंट को फायर करता है, जिससे XSS निष्पादित होता है।पैच ब्लैकलिस्ट regex को wp_kses() से बदल देता है, जो उत्पन्न <link> टैग के लिए अनुमत एट्रिब्यूट्स की एक सख्त व्हाइटलिस्ट सक्षम करता है।
// classes/autoptimizeImages.php v3.1.14
$allowed_html = array(
'link' => array(
'rel' => true,
'as' => true,
'href' => true,
'imagesizes' => true,
'imagesrcset' => true,
'type' => true,
'media' => true,
),
);
$tag = wp_kses( $tag, $allowed_html );