
Тренируем мозг, продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "File upload - ZIP". За решение задачки дают 30 баллов, средний уровень.

Наша цель — прочитать содержимое файла index.php. Всё понятно.
В процессе поиска решения мы столкнёмся в уязвимостью Zip-symlink. Суть уязвимости заключается в том, что в архив можно вложить символьную ссылку, которая ссылается на нужный нам файл системы. При распаковке архива ссылка будет указывать на файл, прописанный в ней. Таким образом можно получить доступ к любому файлу на уязвимом сервере.
Ссылки
Символические и жёсткие ссылки в Linux
Решение
Переходим на страницу задания:
challenge01.root-me.org/web-serveur/ch51/

Нам предлагают загрузить ZIP файл. Создаю текстовый файл 123.txt, запаковываю его в ZIP и загружаю.

Архив загружен, нам дают на него ссылку "File unzipped here". Посмотрим что там.

Прекрасно, здесь наш архив, который здесь же распакован. Хм, а если туда загрузить PHP файл? Попробуем. Создаю какой-нибудь PHP файл, пакую, загружаю архив.

Файл загружен, распакован.

Однако, он нее выполняется. Shell нам загрузить не удастся.
Не расстраиваемся. Само задание нам подсказывает, что уязвимость в самом процессе распаковки ZIP архива. Попробуем воспользоваться уязвимостью Zip-symlink.
ОФФТОПИК: поскольку в задаче у нас Linux, то и ссылку нам нужно будет делать в Linux. Потому как ссылка Windows отличается. Я попробовал, на Linux виндовая ссылка не работает.
Подготовим ZIP архив в любом Linux. Я использую Kali Linux. Создадим ссылку:
ln -s "../../../index.php" ./internet-lab.txt
Здесь:
- "../../../index.php" — относительный путь к файлу, к которому нам нужно получить доступ по устовию задачи.
- internet-lab.txt — имя ссылки
Запакуем ссылку в ZIP архив:
zip --symlinks -r internet-lab.zip ./internet-lab.txt
Здесь:
- --symlinks — атрибут, разрешающий архивировать ссылки.

Загружаем полученный архив.

Архив загрузился, распаковался. И, судя по размеру файла internet-lab.txt, там что-то у нас есть.

По ссылке вместо нашего текстового файла распаковался искомый файл index.php. А в нём флаг. Валидируем.

И зарабатываем 30 баллов.
Безопасность
Уязвимость Zip-symlink — это не баг, а особенность. Просто не распаковывайте в своём коде чужие архивы. И тем более не давайте доступ к результатам распаковки.
Пример работы уязвимости: