Новости
- Зміст статті Joomla - друга за популярністю система управління сайтами після WordPress. Уразливість,...
- Детальніше про уразливість
- /administrator/templates/hathor/postinstall/hathormessage.php
- /libraries/src/User/User.php
- /libraries/src/User/User.php
- Продовження доступно тільки учасникам
- Варіант 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).
Анонс уразливості в Developer Network
Hathor - це назва одного з попередньо встановлених бекенд-шаблонів адміністративної панелі, з яким поставляється Joomla.
Налаштування шаблонів панелі адміністрування в Joomla
За замовчуванням використовується темплейт isis (про всяк випадок: він названий на честь богині Ісіди, а не забороненої в РФ організації), але користувачеві дозволено вручну змінювати його в налаштуваннях профілю. Знаходиться ця сторінка за адресою
/administrator/index.php?option=com_admin&view=profile&layout=edit Щоб зробити режим поточного користувача
Тепер настав час заритися в нетрі початкових кодів. Але де шукати? Відправну точку, як зазвичай, шукаємо в Ком , Який вирішує проблему.
Комміт з патчем для 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»?