phpMyAdmin — популярнейший веб-менеджер для баз данных MySQL. Возможность его установки есть у большинства хостингов, и примерно на каждом втором сайте можно найти путь, по которому он установлен. Сам понимаешь, насколько это лакомый кусочек — уязвимость в таком продукте. Под угрозой — масса компаний от мала до велика.

Уязвимость была обнаружена ребятами из команды ChaMd5 и позволяет выполнить произвольный код на целевой системе. Найденный баг затрагивает все версии phpMyAdmin ветки 4.8, вплоть до последней — 4.8.1.

 

Подготовка

Первым делом готовим все для демонстрации уязвимости. Так как phpMyAdmin написан на PHP (кто бы мог подумать), то его установка не вызовет никаких проблем даже у твоей прабабушки.

Как обычно, воспользуемся докер-контейнерами для максимально быстрого создания нужной нам инфраструктуры. Мы будем ломать веб-интерфейс для администрирования MySQL, поэтому сначала поднимем сервер MySQL.

$ docker run -d -e MYSQL_USER="pmavh" -e MYSQL_PASSWORD="8Aiu04nOay" -e MYSQL_DATABASE="pmavh" --rm --name=mysql --hostname=mysql mysql/mysql-server

Теперь дело за оставшимися тремя буквами из стека LAMP: Linux, Apache и PHP. Веб-сервер будет на основе Debian.

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

Ставим необходимые сервисы и зависимости.

$ apt-get update && apt-get install -y apache2 php php-mysqli php-mbstring nano wget php-xdebug

Если не хочешь возиться с отладкой, то можешь не устанавливать модуль php-xdebug и не выполнять команды для его настройки.

$ echo "xdebug.remote_enable=1" >> /etc/php/7.0/apache2/conf.d/20-xdebug.ini
$ echo "xdebug.remote_host=192.168.99.1" >> /etc/php/7.0/apache2/conf.d/20-xdebug.ini

Следующим шагом будет загрузка дистрибутива и его распаковка в веб-директорию.

$ cd /tmp && wget https://files.phpmyadmin.net/phpMyAdmin/4.8.1/phpMyAdmin-4.8.1-all-languages.tar.gz
$ tar xzf phpMyAdmin-4.8.1-all-languages.tar.gz
$ rm -rf /var/www/html/* && mv phpMyAdmin-4.8.1-all-languages/* /var/www/html/
$ chown -R www-data:www-data /var/www/html/

Теперь нужно выполнить базовую настройку phpMyAdmin, иначе работа с ним будет невозможна. Для настройки нужно создать или отредактировать конфигурационный файл — ручками или с помощью специального интерфейса.

Я воспользуюсь первым вариантом, так как детальная настройка нас не интересует. Для дефолтной cookie-авторизации нужно указать секретный ключ (blowfish_secret), для шифрования данных сессии.

$ sed -i "s/cfg\['blowfish_secret'\] = '/\0$(tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 | head -n 1)/" /var/www/html/config.sample.inc.php

Ну и необходимо указать адрес сервера MySQL, к которому будет подключение. У нас подключен контейнер под названием mysql, его и запишем.

$ sed -i 's/localhost/mysql/' /var/www/html/config.sample.inc.php

Далее делаем конфиг легитимным, переименовав его.

$ mv /var/www/html/config.sample.inc.php /var/www/html/config.inc.php

Можно запускать Apache, проверять работу нашего инструмента и переходить к поиску и эксплуатации уязвимости.

$ service apache2 start
Установленный phpMyAdmin версии 4.8.1
Установленный phpMyAdmin версии 4.8.1
 

Local File Inclusion (LFI). Детали уязвимости

Баг можно проэксплуатировать только под учеткой авторизованного пользователя, поэтому для начала нужно войти. Сразу стало немного скучно? Не стоит недооценивать опасность этой уязвимости! Сколько раз в моей практике было так, что креды для доступа к базе данных есть, а шелл залить возможности нет. Теперь таких проблем будет на порядок меньше.

Итак, заглянем почти в самое начало файла index.php.

/index.php
54: // If we have a valid target, let’s load that script instead
55: if (! empty($_REQUEST['target'])
56:     && is_string($_REQUEST['target'])
57:     && ! preg_match('/^index/', $_REQUEST['target'])
58:     && ! in_array($_REQUEST['target'], $target_blacklist)
59:     && Core::checkPageValidity($_REQUEST['target'])
60: ) {
61:     include $_REQUEST['target'];
62:     exit;
63: }

Интересный кусочек кода, не правда ли? По сути, он выполняет включение (include) того, что мы передадим в параметре target. Причем делать это можно любыми способами (POST, GET, COOKIE) благодаря глобальной переменной $_REQUEST. Все, что от нас требуется, — это успешно пройти пять условий, которые проверяются if.

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

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


4 комментария

  1. devbutch

    09.07.2018 at 10:06

    Хороший материал!

  2. maltsevvv

    20.07.2018 at 21:14

    При установке LAMP, выводится диалог для создания логина/пароля в mysql.
    Как добавить логин/пароль в этом варианте?

    С уважением Виктор

  3. maltsevvv

    22.07.2018 at 12:03

    При попытке авторизации через форму phpMyAdmin выводятся ошибки:
    Невозможно подключиться к серверу MySQL;
    При попытке авторизации через форму phpMyAdmin выводятся ошибки:
    Невозможно подключиться к серверу MySQL;
    mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password];
    mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client;

    При попытке войти в mysql, так-же происходит ошибка:
    root@pmavh:/tmp# mysql
    bash: mysql: command not found

    Похоже, что контейнер с mysql не коннектится к контейнеру с debian
    Судя по описанию контейнера mysql, на https://hub.docker.com/_/mysql/, все сделано правильно.
    Куда копать?

    • ruslan

      25.07.2018 at 13:55

      Судя по «root@pmavh:/tmp#» ты пытаешься из Дэбы подключитсья к mysql. По дэфу там нет mysql-client, вот тебе и ошибка. Так же, тебе нужно указать host, user, password для правильного подключения не на localhost:3306.

      mysql -h mysql -u pmavh -p 8Aiu04nOay

      Если ты не понимаешь короткую настройку (ту, что автор настраивал руками), используй полную инсталяцию phpmyadmin. Как-то так…

Оставить мнение

Check Also

Атака шифровальщика отключила информационные табло в международном аэропорту Бристоля

Работу международного аэропорта Бристоля едва не парализовала атака вымогателя. Все табло …