Paperclip имеет «магическую» (как и все в рельсах) систему адаптеров. Если на входе объект типа File, то берется файловый адаптер, если строчка то сверяется по разным паттернам. Если строчка типа URL http://* то делается запрос по этому URL чтобы выкачать файл.
io_adapters/uri_adapter.rb содержал следующий код:
@original_filename = @target.path.split("/").last
@original_filename ||= "inde.html"
self.original_filename = @original_filename.strip
@content_type = @content.content_type if @content.respond_to?(:content_type)
@content_type ||= "tet/html"
Заметьте, контент тайп берется из хедера ответа сервера, которому доверять нет никакого смысла. Вот я создал URL возвращающий картинку http://ift.tt/1bbmerX но имеющий .htm в расширении.
Paperclip думает что мы дали ему картинку, так как Content-Type вернулся image/jpg и сохраняет файл как file.jpg.htm. Но если веб сервер (apache/ngin) сервит этот файл то смотрит уже на .htm в конце и отвечает внутренностями нашего файла и Content-Type=tet/html. Браузеры парсят ответ как обычную HTML страницу.
Ах да, нашу нагрузку мы спрячем в EXIF хедеры, так что файл все еще будет валидным JPG (на случай если на сервере есть какие то resize операции).
ÛßÙ4Ù¬ıPıfiˆmˆ˚˜ä¯ ¯®˘8˘«˙W˙Á˚w¸ ¸ò˝)˝∫˛K˛‹ˇmˇˇˇ· ‚EifII*
Ü å ¢ ™( 1 ≤2 «£ €iá ¯CanonCanon DIGITAL IXUS 70¥ ¥ f-spot version 0.3.52008:09:08 11:29:26<img src= onerror=alert(0)> öÇ Z ùÇ b 'à Pê 0220
Для RCE (выполнения кода) нужно чтобы сервер выполнял .php/.pl/.cgi файлы, что впринципе редкость для Rails приложений, но я могу ошибаться.
Чтобы проверить уязвимы ли вы, удалите type=file у тэга и пошлите URL.
Баг был зарепорчен 11 декабря и исправлен лишь 2 февраля. Выпущена новая мажорная версия Paperclip 4, также делающая вайтлистинг content-type-ов обязательным (ранее многие разработчики забывали вообще ограничивать типы файлов для загрузки). Ну и вообще, это может быть интересным вектором для проверки download-by-URL функциональности.
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий