Небезопасная загрузка файлов: полное руководство по поиску продвинутых уязвимостей при загрузке файлов
- Что такое уязвимости загрузки файлов?
- Выявление уязвимостей при загрузке файлов
- Эксплуатация простых уязвимостей загрузки файлов
- Продвинутая эксплуатация уязвимостей при загрузке файлов
- Заключение
Уязвимости в загрузки файлов интересны для поиска, они по своей природе имеют большое влияние и в некоторых случаях могут даже привести к удаленному выполнению кода. В наши дни большинство разработчиков осведомлены о небезопасных реализациях загрузки файлов, однако на практике всё ещё может случиться так, что будет внесена потенциальная уязвимость.
В этой статье мы рассмотрим как простые, так и продвинутые уязвимости загрузки файлов. Кроме того, мы уделим внимание особым случаям, которые могут быть использованы в специфических условиях.
Что такое уязвимости при загрузке файлов?
Уязвимости при загрузке файлов возникают из-за небезопасной реализации функционала загрузки файлов, особенно если система проводит недостаточную или вообще не проводит проверку загружаемых файлов.
Такое поведение может позволить злоумышленникам загружать вредоносные файлы, такие как PHP- или ASP-скрипты, и пытаться выполнить код на целевом сервере.
Из-за этого уязвимости загрузки файлов обычно имеют серьезные последствия и могут привести к множеству других уязвимостей, от сохраненного XSS до удаленного выполнения кода через загрузку специально созданного файла-полезной нагрузки.
В этой статье мы рассмотрим простые, продвинутые и сложные случаи уязвимостей при загрузке файлов.
Идентификация уязвимостей загрузки файлов
Не все реализации загрузки файлов подвержены вышеуказанным уязвимостям. Чтобы успешно эксплуатировать уязвимость загрузки файлов, сначала должно быть выполнено несколько условий.
Вы должны иметь доступ к загруженному вами файлу. Большинство компаний используют специальные хранилища или конечные точки, но, в общем, вам нужно знать, где ваш файл хранится, чтобы затем его можно было запустить.
Тип содержимого не должен быть фиксированным. Если компонент, обрабатывающий загруженные файлы, переопределяет ваш тип содержимого, например, на application/octet-stream, может возникнуть ситуация, при которой вы никогда не сможете заставить целевой сервер или веб-браузер (в случае XSS) выполнить содержимое вашего файла.
Эксплуатация простых уязвимостей загрузки файлов
ПОДСКАЗКА! Ни один бэкенд не похож на другой. Все цели используют разные подходы к реализации загрузки файлов. Мы рекомендуем вам комбинировать методы описанные ниже, чтобы добиться желаемого результата по выявлению уязвимостей загрузки файлов.
Этот случай более распространен в старых компонентах и реализациях загрузки файлов. Компонент загрузки файлов не имеет ограничений на загружаемые файлы. Это делает его чрезвычайно легким для эксплуатации.
Вы можете загрузить shell-файл, который позволит вам выполнять системные команды удаленно на целевом устройстве. Если бэкенд написан на PHP, убедитесь, что вы загружаете PHP Shell. Если бэкенд написан на Java, попробуйте загрузить JSP shell и т.д.
POST /Api/FileUpload.aspx HTTP/2 Host: console.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq Accept: */* ------WebKitFormBoundary3RwPFJztxaJvrqAq Content-Disposition: form-data; name="file"; filename="intigriti.php" Content-Type: application/x-php <?php echo system($_GET['e']); ?> ------WebKitFormBoundary3RwPFJztxaJvrqAq--
СОВЕТ! Всегда следуйте рекомендациям программы! Некоторые программы не позволяют загружать вредоносные файлы (или бэкдоры). Однако, если это разрешено, попробуйте использовать случайное имя для вашего вредоносного файла, чтобы только вы могли получить к нему доступ.
Обход ограничения на стороне клиента.
Другим способом, с помощью которого разработчики пытаются ограничить определенные типы файлов, является внедрение ограничений на стороне клиента. Одним из них является HTML-атрибут "accept" в полях формы ввода. Это может помешать обычному пользователю загрузить файл неправильного типа. Однако этот подход неэффективен против злоумышленников, использующих прокси-перехватчики, которые находятся между клиентом и сервером.
Самый простой способ эксплуатации в таком контексте заключается в загрузке корректного файла, перехвате запроса и замене содержимого загружаемого файла на вредоносный.
Обход чёрного списка расширений файлов
Чёрные списки — это ещё один подход, который разработчики часто используют для ограничения загрузки файлов. И, даже если разработчик, возможно, учёл все вредоносные расширения файлов, всегда найдётся одно малоизвестное расширение, о котором почти никто не знает.
Давайте рассмотрим некоторые распространённые способы обхода:
В идеале, вам следует попробовать все эти методы, понять, как серверная часть обрабатывает ваши данные, и подтвердить, выполняет ли она какую-либо нормализацию, чтобы попытаться загрузить вредоносный файл.
СОВЕТ! Не знаете, имеете ли вы дело со списком исключений или списком разрешений? Попробуйте загрузить файл со случайным расширением, если оно было принято, вы, скорее всего, имеете дело с черным списком, в противном случае, это, скорее всего, строго определенный список разрешенных файлов.
Обход белого списка расширений файлов
Подход к обходу белого списка немного отличается от вышеупомянутого случая. Здесь нам нужно будет воспользоваться существующим списком разрешений, который имеет строго определенные расширения, или найти какие-либо недостатки в методе синтаксического анализа или шаблоне регулярных выражений, которые были использованы.
Давайте рассмотрим еще несколько обходных путей, в том числе со специальными кодировками, позволяющими использовать преимущества любого шаблона регулярных выражений с ограниченной областью действия:
Если реализация загрузки файла определяет тип вашего файла по типу содержимого, вы также можете попытаться загрузить файл с расширением, внесенным в белый список, но с вашим типом вредоносного содержимого:
POST /Api/FileUpload.aspx HTTP/2 Host: console.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq Accept: */* ------WebKitFormBoundary3RwPFJztxaJvrqAq Content-Disposition: form-data; name="file"; filename="intigriti.png" Content-Type: application/x-php <?php echo system($_GET['e']); ?> ------WebKitFormBoundary3RwPFJztxaJvrqAq--
Обратите внимание на filename и Content-Type в приведенном выше примере запроса.
Как и прежде, вам следует попытаться выявить любые изменения, происходящие в серверной части, и попытаться использовать их в своих интересах.
Давайте теперь перейдем к более продвинутым способам обхода ограничений на загрузку файлов.
Продвинутая эксплуатация уязвимостей при загрузке файлов
Обход ограничений по типу контента
Другой подход, применяемый разработчиками для ограничения доступа к вредоносным файлам, заключается в проверке типа содержимого загружаемого вами файла. В этом случае мы можем попытаться установить для типа содержимого любой разрешенный MIME-тип, оставив в качестве расширения файла желаемый тип файла:
POST /Api/FileUpload.aspx HTTP/2 Host: console.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq Accept: */* ------WebKitFormBoundary3RwPFJztxaJvrqAq Content-Disposition: form-data; name="file"; filename="intigriti.php" Content-Type: image/png <?php echo system($_GET['e']); ?> ------WebKitFormBoundary3RwPFJztxaJvrqAq--
В зависимости от уязвимого компонента, возможно, что при извлечении файла тип файла будет определяться расширением файла, а не типом содержимого файла.
СОВЕТ! Примените то же самое и здесь и попытайтесь воспользоваться любыми существующими ошибками синтаксического анализа и проверки. Проверьте, как ведет себя ваш целевой объект при отправке нескольких типов контента, не отправляйте его вообще или полностью удалите параметр content-type.
Первые несколько байт (символов) содержимого файла определяют и идентифицируют тип файла. Они также называются магическими байтами, магическими числами или сигнатурами файлов в целом.
Разработчики используют их для проверки документа и игнорируют другие параметры, такие как тип содержимого или расширение файла. К счастью для нас, мы можем загрузить файл, который проходит эту проверку, с нашей вредоносной полезной нагрузкой.
Это магические байты для обычного изображения (PNG) в шестнадцатеричном формате:
89 50 4E 47 0D 0A 1A 0A
Если мы уверены, что фильтр ограничения доступа к файлам основан на магических байтах, мы можем просто использовать их в нашем вредоносном файле:
POST /Api/FileUpload.aspx HTTP/2 Host: console.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq Accept: */* ------WebKitFormBoundary3RwPFJztxaJvrqAq Content-Disposition: form-data; name="file"; filename="intigriti.php" Content-Type: application/x-php ‰PNG␍␊␚␊ <?php echo system($_GET['e']); ?> ------WebKitFormBoundary3RwPFJztxaJvrqAq--
Наш загруженный файл пройдет проверку, поскольку сначала он будет распознан как изображение. Однако, когда мы позже запросим файл PHP, может оказаться, что наш вредоносный код запускается и выполняется на сервере.
Взгляните на список задокументированных сигнатур файлов в Википедии: https://en.wikipedia.org/wiki/List_of_file_signatures
СОВЕТ! Используйте комбинацию нескольких методов обхода, чтобы избежать более агрессивных фильтров!
Перезапись файлов конфигурации сервера
Если не было введено строгих ограничений или имя файла не было правильно проверено, в некоторых случаях мы можем просматривать файловые каталоги или даже перезаписывать файлы конфигурации сервера, просто загружая файл с соответствующим именем.
Давайте рассмотрим простой пример.
Предположим, что ваш целевой объект использует Apache для передачи контента по протоколу HTTP. Apache поддерживает файлы конфигурации .htaccess. После того, как мы выяснили, где хранятся наши файлы, мы можем попытаться либо перезаписать существующий файл конфигурации .htaccess, либо создать новый.
POST /Api/FileUpload.aspx HTTP/2 Host: console.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq Accept: */* ------WebKitFormBoundary3RwPFJztxaJvrqAq Content-Disposition: form-data; name="file"; filename="../../../.htaccess" Content-Type: text/plain # Your server configuraton rules ------WebKitFormBoundary3RwPFJztxaJvrqAq--
Благодаря этому мы могли бы изменить текущие конфигурации сервера, и в большинстве случаев это может привести к выполнению кода на целевом сервере.
Мы рекомендуем вам иметь список служб и технологий, работающих на вашем целевом сервере, и разработать полезную нагрузку специально для вашего целевого сервера.
Уязвимости при загрузке файлов критичны по своей природе, поэтому стоит потратить время и включить тесты на эти типы уязвимостей. Вам следует попробовать загрузить все возможные полезные данные, выявить потенциальные слабые места и ошибки в процессах проверки файлов и воспользоваться этим для загрузки вредоносных файлов.
Вы только что узнали кое-что новое об использовании расширенных уязвимостей при загрузке файлов… А теперь самое время проверить свои навыки!