• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Атака на сайт с WordPress через JavaScript и XSS

pablo

(L2) cache
Пользователь
Регистрация
01.02.2019
Сообщения
433
Реакции
1 524
Особенность вектора заключается в специфике работы самого WordPress — возможность редактировать файлы тем через админ-панель, позволяя незаметно для администратора внедрить вредоносный код.

Пейлоад, представленный в виде JS, размещается на сайте через XSS-уязвимость, после чего ждет своего исполнения. Отработанный на стороне администратора веб-ресурса, код модифицирует содержимое файла темы WordPress (header.php), позволяя злоумышленнику закрепиться в системе и полностью скомпрометировать веб-приложение.

Первым делом код проверяет, есть ли у жертвы cookie, содержащие какие-нибудь значения из wp-settings, wp-admin и т.д. Если их нет, то выполняется переадресация на некоторые сайты.

9abc633e6174c2fd90d9afcb0831f320.png

Если cookie существуют, то создается несколько переменных. Например, в переменной e хранится имя домена, а в a — полезная нагрузка. В переменной p будет храниться XML-запрос.
4bc3988994a1f271b771a95efcb9a8fa.png


Когда переменные созданы, выполняется GET-запрос на адрес из переменной t, в которой в это время хранится путь для редактирования темы в файле header.php. В нашем случае содержимое переменной будет выглядеть так: example.com/wp-admin/theme-editor.php?file=header.php

Если код ответа на GET-запрос равен 200, переменные t, p, d, i будут установлены, а если их нет — установятся или переопределятся. В переменную t попадет текст ответа, а переменные p, d, i заносят в массив данные согласно регулярным выражениям на основе информации, хранящейся в переменной t.

1cad3715e8b726d9d0f6bd321c0c4b5c.png

При этом, если переменные p, d, i не равны null, то скрипт ищет в 1-ом элементе массива переменной p значение chr(109).chr(46).chr(116).chr(120).chr(116). Если находит, то отправляет еще один GET-запрос в виде содержимого переменной e (переменная с доменом) + /wp-content/themes/d[1]/header.php (где первый элемент в массиве d — название темы). Если не находит элемент, то создается переменная r c HTML-элементом textarea, в который помещается значение элемента массива p[1], и создаются переменные:
  • c = a + o + encodeURIComponent(r.value), которая соединяет a (PHP-код), o (загрузку внешнего JS-скрипта), а также закодированное в URI значение переменной r;
  • s = d[1] — первый элемент масива d.
7ba36ee4e98165ca5e2defe4df0ae07a.png

А вот содержимое запроса в переменной m = "nonce=" + encodeURIComponent(h) + "&_wp_http_referer=" + encodeURIComponent("/wp-admin/theme-editor.php?file=header.php") + "&theme=" + encodeURIComponent(s) + "&file=header.php&action=edit-theme-plugin-file&newcontent=" + c, вероятно, больше похоже на добавление/замену в header.php на значение переменной c.
ac992cb0b1aaea0c392a6bf2c43c2349.png

Чтобы продемонстрировать, как это работает, основная полезная нагрузка (для наглядности) была заменена на пейлоад, позволяющий выполнить произвольный код на сервере. Если поместить пейлоад на странице сайта в виде какой-нибудь хранимой XSS, то при посещении страницы авторизованным пользователем сработает скрипт, который, в нашем случае, выполняет внешний JS, находящийся на удаленном сервере evil.lan.
556f96b7d9741ae2a35e18f17f9557db.png

После выполнения скрипта, в header.php вносятся изменения в первую строчку.
381d99e361c8bff484277a0719333a69.png

И, как результат, мы можем выполнить произвольный код на стороне сервера, например, прочитать содержимое файла /etc/passwd.
90f7d2e3085bdc8caf3cd2af4f9c2a51.png


by @Hekpo
defcon.ru
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх