Помните, как можно было загружать файлы с произвольными именами и содержимым между доменами ? Метод имел одно, но принципиальное ограничение — это
не включал никаких учетных данных . Другими словами, сообщение POST будет отправлено на сервер без каких-либо cookie / HTTP-аутентификации, поэтому оно, скорее всего, будет отклонено атакованным приложением. Вы можете загрузить файл (точнее, это загрузка файла CSRF), но в большинстве случаев принимающее приложение удалит его. До нынешнего момента ?
Я могу испечь печенье!
Я до сих пор не знаю, как я это пропустил, но это всего лишь изменение в одну строку:
1 xhr.withCredentials = "true";
Вот это . С этим установленным флагом:
- Простые запросы CORS будут включать куки / HTTP-аутентификацию
- Предварительно просматриваемые запросы CORS будут запрашивать разрешение на их включение.
К счастью для злоумышленников (и, к сожалению, для Интернета), POST-запрос с MIME-типом
multipart / form-data и учетными данными все еще находится в «простом» ведре. Таким образом, точная атака CSRF CORS File Upload работает так:
- Журналы потерпевших в на зараженный .whatever.com сайт
- Он получает сессионный cookie для будущих запросов
«Отнеси эти куки своей бабушке», — сказал The Browser.
- В том же сеансе браузера (например, 2-я вкладка) он посещает сайт злоумышленника .reallybad.ly
- Код Javascript в атакующем молча подготавливает запрос загрузки файла CORS с объектом XMLHttpRequest в домен жертвы и просит включить учетные данные ( xhr.withCredentials )
«Браузер, мне действительно нужно, чтобы вы отправили этот крошечный безобидный POST жертве »
- Браузер обрабатывает это как простой запрос CORS, поэтому он прикрепляет к нему файл cookie для домена жертвы и отправляет его.
«Эй, JS! Это запрос к другому домену — что ты задумал? О, просто запрос POST? Нет пользовательских заголовков? Конечно, вот куки, и я желаю тебе приятного путешествия!»
- victim app receives the POST file upload with the cookie, so it processes the upload and responds.
«What’s this weird Origin header pointing to attacker.reallybad.ly? It must be the new kid in town, but who am I to know?»
- Browser looks at the response and, not having appropriate CORS response headers, discards the response.
«Oh dear! No Access-Control-Allow-Origin header at all! You bad Javascript! I won’t give you the response, and you’ll get spanked with an exception! Surely that was one nasty hack attack I prevented. Luckily I follow the CORS specification, good work, CORS guys!»
Да, именно. Хорошая работа! Теперь загрузка файла CSRF очень проста. Я обновил
на
примеры с новым кодом.