Было бы глупо предположить, что разработчики не задумывались о способах защиты от уязвимостей при загрузке файлов (
Сегодня поговорим об обходах различных методов защиты.
👎Блеклист
Звучит здорово. Если мы не хотим получить какой-то файл, то просто запретим его. 🎆ГЕНИАЛЬНО!🎆
Но есть нюанс: вы запретили
.html, а вот к вам уже летит .xhtml. Здорово...Обойти блеклист вполне реально - нужно лишь попробовать достаточное количество расширений.
Лучше использовать вайтлисты: Надо - разрешил. Вот и все.
🗿Покажите на что вы способны
Окей, вы используете вайтлист. Молодцы. Защищены ли вы теперь? Нуууу нет. Как так вышло?
При обработке файла может выполняться нормализация пути.
Если валидация происходит до нормализации, то может случиться магия - и вы потеряете часть имени файла.
📌Например:
символ
\0 можно закодировать в URL как %00. Во многих языках программирования он означает конец строки.
Файл с именем
file.py%00.png может пройти вайтлистинг, а при нормализации превратиться в file.py.Защита: проверяйте подозрительные символы в передаваемых путях.
💃Вы хотите веселья? Их есть у меня
Есть такие интересные файлы — полиглоты.
Они изменяют свое поведение в зависимости от того, кто и как их открывает.
Это может сработать, если проверяется не только расширение, но и содержимое (меджик, хедер или футер).
Тема интересная, думаю, стоит поговорить о таких файлах в отдельном посте.
🛡Рекомендуемые способы защиты
➖Проверять расширение по вайтлисту, а не по блеклисту. Проще выбрать допустимые расширения, чем запрещать всё потенциально опасное.
➖Проверять имя файла на наличие подозрительных подстрок.
➖Переименовывать загруженные файлы, чтобы избежать коллизий.
➖Не загружать файлы в постоянную файловую систему, пока они не будут проверены.
➖Использовать встроенные функции проверки файлов, а не писать кастомные.
✍️Самостоятельно попробовать разные обходы можно в данных лабах:
✏️Web shell upload via extension blacklist bypass
✏️Web shell upload via obfuscated file extension
✏️Remote code execution via polyglot web shell upload
➥ ☕️ тг • 🤬чатик • ✍️посты
#web #writeup
