Новости

Лапками по «Джумла». Вчимося проводити SQL-ін'єкцію другого порядку на прикладі уразливості в Joomla

  1. Зміст статті Joomla - друга за популярністю система управління сайтами після WordPress. Уразливість,...
  2. Детальніше про уразливість
  3. /administrator/templates/hathor/postinstall/hathormessage.php
  4. /libraries/src/User/User.php
  5. /libraries/src/User/User.php
  6. Продовження доступно тільки учасникам
  7. Варіант 2. Відкрий один матеріал

Зміст статті

Joomla - друга за популярністю система управління сайтами після WordPress. Уразливість, про яку ми поговоримо в цій статті, дозволяє атакуючому без особливих проблем одним запитом підняти свої привілеї в CMS до суперкористувача, від якого до виконання коду один крок.

Проблема зачіпає всі існуючі версії Joomla аж до 3.8.3. Про деталі повідомив дослідник з компанії RIPS Technologies. Уразливість отримала ідентифікатор CVE-2018-6376 . У версії 3.8.4 вона була виправлена ​​розробниками CMS, про що повідомляється в анонсі від 30 січня.

Проексплуатувати вразливість можна, володіючи привілеями менеджера в системі або вище. Сам баг досить цікавий, і його вивчення дозволить нам поговорити про техніку ін'єкцій second order SQL.

стенд

Для тестування експлоїта насамперед готуємо стенд. Зрозуміло, у Joomla є офіційний репозиторій на сайті Docker Hub , Де ти можеш знайти всілякі версії CMS. Але використовувати їх я не буду і підготую свій контейнер, оскільки робиться це лише кількома командами.

Спочатку запускаємо контейнер з Debian 9.

docker run -ti -p80: 80 --rm --name = joomlavh --hostname = joomlavh debian / bin / bash

Ставимо все необхідне: MySQL, Apache 2 і PHP 7.0.

apt-get update && apt-get install -y mysql-server apache2 php php7.0-xml php7.0-mysqli nano wget

Тепер сама CMS. Нам потрібна версія 3.8.3.

cd / var / www / html / wget https://downloads.joomla.org/cms/joomla3/3-8-3/Joomla_3-8-3-Stable-Full_Package.tar.gz?format=gz tar xzf Joomla * chown -R www-data: www-data.

І останнє: стартуємо необхідні послуги і створюємо базу даних для майбутньої установки програми.

service mysql start && service apache2 start mysql -u root -e "CREATE DATABASE joomla; GRANT ALL PRIVILEGES ON *. * TO 'root' @ 'localhost' IDENTIFIED BY 'megapass';"

Після цього необхідно перейти на свежеподнятий веб-сервер і встановити CMS.

Установка Joomla 3.8.3

Створи аккаунт з правами Manager, через нього будемо тестувати експлоїт.

Детальніше про уразливість

З анонсу уразливості можна дізнатися, що корінь проблеми - у відсутності приведення типів змінної в інформаційних повідомленнях темплейта Hathor (Hathor postinstall message).

З анонсу уразливості можна дізнатися, що корінь проблеми - у відсутності приведення типів змінної в інформаційних повідомленнях темплейта Hathor (Hathor postinstall message)

Анонс уразливості в Developer Network

Hathor - це назва одного з попередньо встановлених бекенд-шаблонів адміністративної панелі, з яким поставляється Joomla.

Налаштування шаблонів панелі адміністрування в Joomla

За замовчуванням використовується темплейт isis (про всяк випадок: він названий на честь богині Ісіди, а не забороненої в РФ організації), але користувачеві дозволено вручну змінювати його в налаштуваннях профілю. Знаходиться ця сторінка за адресою

/administrator/index.php?option=com_admin&view=profile&layout=edit /administrator/index Щоб зробити режим поточного користувача

Тепер настав час заритися в нетрі початкових кодів. Але де шукати? Відправну точку, як зазвичай, шукаємо в Ком , Який вирішує проблему.

Комміт з патчем для SQLi

Як бачиш, нам необхідно зазирнути в файл hathormessage.php.

/administrator/templates/hathor/postinstall/hathormessage.php

19: function hathormessage_postinstall_condition () 20: {... 22: $ user = JFactory :: getUser (); ... 39: // Get the current user admin style 40: $ adminstyle = $ user-> getParam ( 'admin_style', ''); 41: 42: if ($ adminstyle! = '') 43: {44: $ query = $ db-> getQuery (true) 45: -> select ( 'template') 46: -> from ($ db-> quoteName ( '#__template_styles')) 47: -> where ($ db-> quoteName ( 'id'). '='. $ adminstyle [0]) 48: -> where ($ db-> quoteName ( 'client_id') . '= 1'); ... 50: // Get the template name associated to the admin style 51: $ template = $ db-> setquery ($ query) -> loadResult ();

Після патча змінна $ adminstyle приводиться до int, значить, вона нам і потрібна. Рядок 40 говорить нам про те, що значення змінної - це результат роботи методу getParam з класу User.

/libraries/src/User/User.php

024: class User extends \ JObject 025: {... 318: public function getParam ($ key, $ default = null) 319: {320: return $ this -> _ params-> get ($ key, $ default); 321:}

Параметри ($ this -> _ params) поточного користувача - це екземпляр класу Registry.

/libraries/src/User/User.php

233: public function __construct ($ identifier = 0, UserWrapper $ userHelper = null) 234: {... 242: // Create the user parameters object 243: $ this -> _ params = new Registry;

При ініціалізації користувача, збереженні даних профілю та інших маніпуляціях з використанням режиму розширеного дані потрапляють в цю змінну. У тому числі і потрібний нам admin_styles. Нам залишається лише задати йому значення. Вище я вже писав, де знаходиться редагування профілю поточного користувача.

Давай включимо сниффер і збережемо дані профілю. У спійманого пакеті буде атрибут з назвою jform [params] [admin_style]. Так як в запит потрапляє перший елемент масиву, то додаємо канонічну лапки.

Продовження доступно тільки учасникам

Варіант 1. Приєднайся до товариства «Xakep.ru», щоб читати всі матеріали на сайті

Членство в співтоваристві протягом зазначеного терміну відкриє тобі доступ до ВСІХ матеріалами «Хакера», збільшить особисту накопичувальну знижку і дозволить накопичувати професійний рейтинг Xakep Score! Детальніше

Варіант 2. Відкрий один матеріал

Зацікавила стаття, але немає можливості стати членом клубу «Xakep.ru»? Тоді цей варіант для тебе! Зверни увагу: цей спосіб підходить тільки для статей, опублікованих більше двох місяців тому.


Gz?
Php?
Але де шукати?
Ru»?

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: