31 lines
2.9 KiB
Markdown
31 lines
2.9 KiB
Markdown
**Уязвимость загрузки файлов** возникает тогда, когда сервер позволяет пользователям загружать файлы в свою файловую систему без надлежащей проверки имени файла, типа, размера и содержимого файла. Неспособность должным образом применить ограничения означает, что даже самая базовая функция загрузки изображения может быть ипользована для загрузки и эксплуатации опасных файлов.
|
|
|
|
В некоторых случаях, сам факт загрузки файла может нести в себе опасность. Некоторые атаки могут включать последующий HTTP запрос на иполнение файла.
|
|
|
|
## Как возникает уязвимость?
|
|
|
|
Учитывая довольно очевидную опасность, редко встретишь сайт без ограничений на загрузку файлов. Например, разработчики могут создать blacklist для опасных типов файлов, но не учитывать расхождения в анализе при проверке расширения файла. Как и в любом черном списке, легко можно опустить менее явные типы файлов, которые всё еще могут быть опасными.
|
|
|
|
## Использование неограниченную загрузку файлов для вызова консоли
|
|
|
|
Самый худший сценарий - когда сайт дает возможность загружать и запускать файлы php, js, python.
|
|
|
|
Поэтому стоит попробовать залить файл на сервер и выполнить его (через запрос в url)
|
|
|
|
```php
|
|
<?php echo file_get_contents('/path/to/target/file'); ?>
|
|
```
|
|
|
|
Если стоит ограничение на **Content-type**, проверить можно ли подменить его в заголовке.
|
|
|
|
```http
|
|
|
|
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="example.jpg" Content-Type: image/jpeg [...binary content of example.jpg...]
|
|
---------------------------012345678901234567890123456 Content-Disposition: form-data; name="description" This is an interesting description of my image.
|
|
---------------------------012345678901234567890123456 Content-Disposition: form-data; name="username" wiener
|
|
``` |