Віддалене видалення. Як захопити контроль над WordPress, змусивши його стерти файл

  1. Зміст статті У WordPress, найпопулярнішою в світі системі публікації, була виявлена ​​серйозна уразливість....
  2. аналіз вразливості
  3. /wordpress/wp-admin/post.php
  4. Продовження доступно тільки учасникам
  5. Варіант 2. Відкрий один матеріал

Зміст статті

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

Баг був виявлений ще 20 листопада 2017 року дослідником Славко Міхайльоскі ( Slavco Mihajloski ) З RIPS Tech, але аж до версії 4.9.7, яка вийшла 5 червня 2018 року, проблема залишалася незапатченной. Тобто протягом семи місяців вона становила серйозну загрозу для безпеки на величезній кількості сайтів по всьому світу і на багатьох з них продовжує представляти.

стенд

Щоб розібрати вразливість, нам спочатку знадобиться уразливий WordPress. Насамперед ставимо контейнер з базою даних.

$ Docker run -d --rm -e MYSQL_USER = "wpdel" -e MYSQL_PASSWORD = "4hicmMRyUq" -e MYSQL_DATABASE = "wpdel" --name = mysql --hostname = mysql mysql / mysql-server

Тепер контейнер, на який поставимо веб-сервер. На ньому буде розташовуватися WordPress.

$ Docker run -it --rm -p80: 80 --name = wpdel --hostname = wpdel --link = mysql debian / bin / bash

Встановимо всі потрібні пакети і розширення PHP.

$ Apt-get update && apt-get install -y apache2 php php7.0-mysqli php-gd nano wget

Вразлива версія CMS під номером 4.9.6, її і скачати.

$ Cd / tmp && wget https://wordpress.org/wordpress-4.9.6.tar.gz $ tar xzf wordpress-4.9.6.tar.gz $ rm -rf / var / www / html / * && mv wordpress / * / var / www / html / $ chown -R www-data: www-data / var / www / html /

Запускаємо сервіс apache2.

$ Service apache2 start

Тепер встановлюємо WordPress, використовуємо наш MySQL-сервер в якості БД.

Тепер встановлюємо WordPress, використовуємо наш MySQL-сервер в якості БД

Інсталяція WordPress 4.9.6

Вразливий механізм видалення завантажених файлів, тому для успішної експлуатації юзер повинен мати привілеї на видалення медіа. Створимо такого користувача.

Створення користувача з привілеями додавання медіафайлів в WordPress 4.9.6

аналіз вразливості

У WordPress, як і в будь-який поважає себе CMS, можна завантажувати довільні файли і вбудовувати їх в публікуємо пости. Найбільш очевидний спосіб застосування - це додавання фотографій. Якщо файл завантаженої картинки більше встановлених в настройках розмірів, то для нього створюються мініатюри (thumbnails). Найдрібнішу з них можна побачити при натисканні на кнопку редагування картинки (в закладці медіа в розділі Thumbnail Settings).

Найдрібнішу з них можна побачити при натисканні на кнопку редагування картинки (в закладці медіа в розділі Thumbnail Settings)

Редагування завантаженої картинки в WordPress

Заглянемо в файл post.php, де знаходиться шматок коду, відповідальний за редагування будь-якого запису в системі. Так, аттачі теж вважаються записами.

/wordpress/wp-admin/post.php

33: if ($ post_id) 34: $ post = get_post ($ post_id); ... 62: switch ($ action) {

У змінній $ action знаходиться дію з запиту, яке потрібно виконати. Оператор switch перенаправляє виконання скрипта в потрібну частину коду. Ось, наприклад, запит на редагування конкретної записи.

GET /wp-admin/post.php?post=25&action=edit HTTP / 1.1 Host: wpdel.visualhack User-Agent: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 67.0.3396.99 Safari / 537.36 Accept: text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, image / apng, * / *; q = 0.8 Accept-Encoding: gzip, deflate Accept- Language: ru-RU, ru; q = 0.9, en-US; q = 0.8, en; q = 0.7, bg; q = 0.6, uk; q = 0.5, hu; q = 0.4

При його обробці виповнюється наступний шматок коду:

062: switch ($ action) {... 098: case 'edit': 099: $ editing = true; ... 122: if (! Empty ($ _GET [ 'get-post-lock'])) {123: check_admin_referer ( 'lock-post_'. $ Post_id); 124: wp_set_post_lock ($ post_id); 125: wp_redirect (get_edit_post_link ($ post_id, 'url')); 126: exit (); 127:} 128: 129: $ post_type = $ post-> post_type; 130: if ( 'post' == $ post_type) {131: $ parent_file = "edit.php"; 132: $ submenu_file = "edit.php"; 133: $ post_new_file = "post-new.php"; 134:} elseif ( 'attachment' == $ post_type) {135: $ parent_file = 'upload.php'; 136: $ submenu_file = 'upload.php'; 137: $ post_new_file = 'media-new.php'; 138:} else {139: if (isset ($ post_type_object) && $ post_type_object-> show_in_menu && $ post_type_object-> show_in_menu! == true) 140: $ parent_file = $ post_type_object-> show_in_menu; 141: else 142: $ parent_file = "edit.php? Post_type = $ post_type"; 143: $ submenu_file = "edit.php? Post_type = $ post_type"; 144: $ post_new_file = "post-new.php? Post_type = $ post_type"; 145:} 146: ... 174: include (ABSPATH. 'Wp-admin / edit-form-advanced.php'); 175: 176: break;

Погулявши трохи по цій гілці коду, можна виявити досить цікавий екшен.

178: case 'editattachment': 179: check_admin_referer ( 'update-post_'. $ Post_id); 180: 181: // Do not let these be changed 182: unset ($ _ POST [ 'guid']); 183: $ _POST [ 'post_type'] = 'attachment'; 184: 185: // Update the thumbnail filename 186: $ newmeta = wp_get_attachment_metadata ($ post_id, true); 187: $ newmeta [ 'thumb'] = $ _POST [ 'thumb']; 188: 189: wp_update_attachment_metadata ($ post_id, $ newmeta);

Особливо цікавий розділ Update the thumbnail filename. Змінна $ newmeta містить метадані записи з зазначеним ID. Ключ thumb містить шлях до мініатюри, і його значення можна змінити за допомогою параметра thumb в POST-запиті. Ці дані йдуть в функцію wp_update_attachment_metadata, яка розташувалася трохи нижче в цьому ж файлі.

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

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

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

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

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


Php?
Php?
Php?
Php?
Ru»?