Уязвимость в Paperclip (XSS/RCE)

в 16:08, , рубрики: Без рубрики

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

image
Для RCE (выполнения кода) нужно чтобы сервер выполнял .php/.pl/.cgi файлы, что впринципе редкость для Rails приложений, но я могу ошибаться.

Чтобы проверить уязвимы ли вы, удалите type=file у тэга и пошлите URL.
image

Баг был зарепорчен 11 декабря и исправлен лишь 2 февраля. Выпущена новая мажорная версия Paperclip 4, также делающая вайтлистинг content-type-ов обязательным (ранее многие разработчики забывали вообще ограничивать типы файлов для загрузки). Ну и вообще, это может быть интересным вектором для проверки download-by-URL функциональности.

Автор: Chikey

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js