Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Уязвимость была обнаружена ребятами из команды 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'] = '/ $(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
Баг можно проэксплуатировать только под учеткой авторизованного пользователя, поэтому для начала нужно войти. Сразу стало немного скучно? Не стоит недооценивать опасность этой уязвимости! Сколько раз в моей практике было так, что креды для доступа к базе данных есть, а шелл залить возможности нет. Теперь таких проблем будет на порядок меньше.
Итак, заглянем почти в самое начало файла 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: }
[/code]
Интересный кусочек кода, не правда ли? По сути, он выполняет включение (include) того, что мы передадим в параметре
target
. Причем делать это можно любыми способами (POST, GET, COOKIE) благодаря глобальной переменной $_REQUEST
. Все, что от нас требуется, — это успешно пройти пять условий, которые проверяются if
.
Условие 1.
! empty($_REQUEST['target']
— тут совсем все просто. Конечно же, мы будем указывать что-то в target
, иначе в чем смысл?
Условие 2.
is_string($_REQUEST['target'])
— ну разумеется, это будет строкой, include
не умеет работать с массивом имен файлов.
Условие 3.
! preg_match('/^index/', $_REQUEST['target'])
— название файла для include не должно начинаться с index
. Хорошо, учтем этот момент.
Условие 4.
! in_array($_REQUEST['target'], $target_blacklist)
— файл не должен находиться в черном списке. Вот как он выглядит:
/index.php
50: $target_blacklist = array (
51:
'import.php', 'export.php'
52: );
[/code]
Окей. Постараемся подобрать другие интересные файлы.
Источник новости - google.com
|
|