Передостання крапля. Розбираємо вразливість Drupalgeddon2 в Drupal 7

  1. Зміст статті Нещодавно світ дізнався про серйозну уразливість в системі управління контентом Drupal...
  2. Перші кроки
  3. /index.php
  4. /includes/menu.inc
  5. /includes/menu.inc
  6. Продовження доступно тільки учасникам
  7. Варіант 2. Відкрий один матеріал

Зміст статті

Нещодавно світ дізнався про серйозну уразливість в системі управління контентом Drupal - ми тоді детально писали про це . Однак, розібравши проблему в гілці 8.x, ми залишили за кадром аналогічну пролом в Drupal 7. А адже на цій версії зараз працює куди більше сайтів! Експлуатувати уразливість в ній складніше, але не набагато. Зараз я покажу, як це робиться.

підготовка

Для демонстрації уразливості найпростіше використовувати офіційний репозиторій Drupal на Docker Hub. Розгортаємо контейнер з потрібною версією CMS. Спочатку піднімаємо сервер БД.

$ Docker run -d -e MYSQL_USER = "drupal" -e MYSQL_PASSWORD = "7C4TYVARsy" -e MYSQL_DATABASE = "drupal" --rm --name = mysql --hostname = mysql mysql / mysql-server

Тепер справа за контейнером з CMS. Цього разу беремо найстарішу вразливу версію - 7.57.

$ Docker run -d --rm -p80: 80 -p9000: 9000 --link = mysql --name = drupalvh --hostname = drupalvh drupal: 7.57

Тепер через веб-інтерфейс встановлюємо Drupal і перевіряємо, чи все у нас працює.

Тепер через веб-інтерфейс встановлюємо Drupal і перевіряємо, чи все у нас працює

Установка Drupal 7.57

Ще непогано було б завести відладчик. Для цього я додатково встановлю розширення Xdebug.

$ Pecl install xdebug $ echo "zend_extension = / usr / local / lib / php / extensions / no-debug-non-zts-20151012 / xdebug.so"> /usr/local/etc/php/conf.d/php- xdebug.ini $ echo "xdebug.remote_enable = 1" >> /usr/local/etc/php/conf.d/php-xdebug.ini $ echo "xdebug.remote_host = 192.168.99.1" >> / usr / local / etc / php / conf.d / php-xdebug.ini $ service apache2 reload

Не забудь поміняти IP-адреса 192.168.99.1 на свій і зверни увагу на шлях до скомпіленной бібліотеки xdebug.so. Після перезавантаження конфігов Apache можеш запускати свій улюблений дебагер. У роботі я як і раніше використовую PhpStorm і розширення Xdebug helper для Chrome.

Тепер завантажуємо вихідні CMS , Слухаємо 9000-й порт - і вперед, до перемог.

Перші кроки

Перейдемо на сторінку створення нового облікового запису. У сьомій версії вона значно аскетичний, ніж в восьмий.

У сьомій версії вона значно аскетичний, ніж в восьмий

Створення нового облікового запису в Drupal 7
Створення нового облікового запису в Drupal 7   Створення нового облікового запису в Drupal 8 Створення нового облікового запису в Drupal 8

Через те, що відсутня можливість завантажити аватар, стандартний вектор експлуатації тут не спрацює. Значить, потрібно знайти новий! Суть бага все та ж - це впровадження елементів в Renderable Arrays, які будуть оброблені за допомогою Render API. Існують спеціальні елементи, які викликають функцію call_user_func з кастомними параметрами.

Для початку подивимося, як обробляються Рауса в додатку. Якщо у тебе на сервері включені семантичні URL , То URI перенаправляються на файл index.php як GET-параметр q.

/index.php

19: require_once DRUPAL_ROOT. '/Includes/bootstrap.inc'; 20: drupal_bootstrap (DRUPAL_BOOTSTRAP_FULL); 21: menu_execute_active_handler ();

/includes/menu.inc

510: function menu_execute_active_handler ($ path = NULL, $ deliver = TRUE) {... 521: if ($ page_callback_result == MENU_SITE_ONLINE) {522: if ($ router_item = menu_get_item ($ path)) {

Наприклад, для відображення сторінки http: //drupal.vh/user/register буде виконаний запит http: //drupal.vh/index.php? Q = user / register.

Обробка Рауса в Drupal 7

/includes/menu.inc

455: function menu_get_item ($ path = NULL, $ router_item = NULL) {456: $ router_items = & drupal_static (__ FUNCTION__); 457: if (! Isset ($ path)) {458: $ path = $ _GET [ 'q']; 459:} 460: if (isset ($ router_item)) {461: $ router_items [$ path] = $ router_item; 462:}

Далі шлях розбивається за допомогою функції array_slice і виконується запит до бази даних для вибірки шляхів з таблиці з Рауса. За замовчуванням menu_router.

473: $ parts = array_slice ($ original_map, 0, MENU_MAX_PARTS); 474: $ ancestors = menu_get_ancestors ($ parts); 475: $ router_item = db_query_range ( 'SELECT * FROM {menu_router} WHERE path IN (: ancestors) ORDER BY fit DESC', 0, 1, array ( ': ancestors' => $ ancestors)) -> fetchAssoc ();

У таблиці зберігаються колбекі, які потрібно виконувати при зверненні до відповідних шляхах.

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

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

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

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

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


Php?
Ru»?

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

rss
Карта