Paperclip это самый популярный джем для загрузки файлов/аватарок в рельсах. В нем был найден довольно простой логический баг, ведущий к загрузке произвольного файла на сервер, то есть с произвольным extension: file.html, file.php, file.cgi и так далее.
Paperclip имеет «магическую» (как и все в рельсах) систему адаптеров. Если на входе объект типа File, то берется файловый адаптер, если строчка то сверяется по разным паттернам. Если строчка типа URL http://* то делается запрос по этому URL чтобы выкачать файл.
io_adapters/uri_adapter.rb содержал следующий код:
@original_filename = @target.path.split("/").last
@original_filename ||= "index.html"
self.original_filename = @original_filename.strip
@content_type = @content.content_type if @content.respond_to?(:content_type)
@content_type ||= "text/html"
Заметьте, контент тайп берется из хедера ответа сервера, которому доверять нет никакого смысла. Вот я создал URL возвращающий картинку www.sakurity.com/img.jpg.htm но имеющий .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 функциональности.
Автор: Chikey