Ін’єкція «Джумлі»

Joomla 3.7.0, крім безлічі поліпшень і виправлень, принесла в ядро функцію полів користувача і, зокрема, компонент com_fields . Як ти вже, напевно, здогадався, цей новий компонент став причиною проблеми. Так що без зайвих церемоній приступимо до захоплюючої подорожі у вихідниках слідами вразливості.
Деталі вразливості
Насамперед заглядаємо в сам файл контролера.
Відразу ж впадає у вічі умова [32]: якщо view і layout приймають значення fields і modal відповідно, то CMS завантажує адміністраторську версію компонента com_fields . І всі запити від звичайного користувача проксируватимуться в нього.
Що ж це нам дає? Давай подивимося.
Заглянемо всередину методу getListQuery, він займається тим, що збирає запит до бази даних. Нас цікавить частина з рядком, у якому формується сортування (ORDER BY).
Змінна $listOrdering — назва поля у таблиці, за якою потрібно відсортувати запит. Її фільтрує функція escape, яка залежить від драйвера, що використовується на сервері, для роботи з БД. Вона повертає рядок, у якому екрановані спецсимволи, зокрема лапки.
Розглянемо вихідний код цієї функції для драйвера mysqli. Він зустрічається найчастіше, оскільки Joomla при встановленні пропонує саме його.
/libraries/joomla/database/driver/mysqli.php
Для фільтрації використовується функція mysqli_real_escape_string (рядок 246), яка екранує null-байти, перенесення рядків, одинарні та подвійні лапки. Однак у нашому випадку це абсолютно непотрібні дії, тому що в нашій змінній зберігається назва колонки для сортування.
Давай подивимося, якпередати потрібні нам значення $listOrdering . Метод getState успадковується прямо з абстрактного класу JModelLegacy , який є батьком для JModelList , а він, у свою чергу, успадковується нашим FieldsModelFields .