Чи вразливі веб-служби JSON до атак CSRF?


82

Я створюю веб-службу, яка використовує виключно JSON для своїх запитів та вмісту відповідей (тобто, ніяких корисних навантажень, закодованих у формі).

Чи є веб-служба вразливою до атак CSRF, якщо наведене нижче відповідає дійсності?

  1. Будь-який POSTзапит без об'єкта JSON найвищого рівня, наприклад, {"foo":"bar"}буде відхилено за допомогою 400. Наприклад, POSTзапит із вмістом 42буде відхилено.

  2. Будь-який POSTзапит із типом вмісту, відмінним від того, application/jsonбуде відхилено за допомогою 400. Наприклад, POSTзапит із типом вмісту application/x-www-form-urlencodedбуде відхилено.

  3. Усі запити GET будуть безпечними і, таким чином, не змінюватимуть будь-які дані на стороні сервера.

  4. Клієнти аутентифікуються за допомогою сеансового файлу cookie, який веб-служба надає їм після того, як вони надають правильну пару ім’я користувача / пароль через POST із даними JSON, наприклад {"username":"user@example.com", "password":"my password"}.

Допоміжне запитання: Чи будь-коли PUTта DELETEзапити вразливі для CSRF? Я запитую, бо здається, що більшість (усіх?) Браузерів забороняють ці методи у формах HTML.

РЕДАГУВАТИ: Додано елемент No4.

РЕДАГУВАТИ: На сьогоднішній день є багато хороших коментарів та відповідей, але ніхто не пропонував конкретної атаки CSRF, на яку вразлива ця веб-служба.


токенізуйте свої запити через спарені значення сеансу та файлів cookie, дезінфікуйте будь-які директиви, які ви ініціюєте, через поданий JSON, додайте сіль для додаткового смаку
Брандт Соловій

Я не думаю, що тут достатньо інформації, щоб дати хорошу відповідь. Який метод автентифікації ви використовуєте? Хто призначений споживачем веб-послуги (тобто, користувачі веб-сайту на тому самому хості, що і ваша послуга?)
McGarnagle

1
Усі ваші поточні перевірки є цілком розумними і дійсно обмежують поверхню атаки, але насправді вони не стосуються нічого спільного з тим, що таке вразливість CSRF.
Cheekysoft


2
@ DavidBalažic Який вектор? Якщо ви говорите про AJAX, політики того самого походження запобігають цьому.
djsmith

Відповіді:


73

Кування довільних запитів CSRF з типами довільній медіа ефективно можливо тільки з XHR, так як метод форми обмежується отримати і POST і А тіло повідомлення POST форми мають також обмежуються три форматів application/x-www-form-urlencoded, multipart/form-dataіtext/plain . Однак за допомогою кодування даних форми text/plainвсе ще можна підробляти запити, що містять дійсні дані JSON .

Отже, єдиною загрозою є атаки CSRF на основі XHR. І вони матимуть успіх лише в тому випадку, якщо вони одного походження, тобто в основному з вашого власного сайту (наприклад, XSS). Будьте обережні, не помилково вимкнувши CORS (тобто не встановивши Access-Control-Allow-Origin: *) як захист. CORS просто заважає клієнтам прочитати відповідь. Весь запит все ще надсилається та обробляється сервером.


9
Коли я коментував вашу пов'язану відповідь, я стверджую, що text / plain дійсно може бути використаний для підробки JSON, якщо сервер не потребує application / json, використовуючи методи, подібні до pentestmonkey.net/blog/csrf-xml-post-request .

8
Ця відповідь правильна до сьогодні, але, ймовірно, незабаром буде помилковою. W3C розглядає можливість додавання enctype = "application / json" до стандарту HTML: darobin.github.io/formic/specs/json Тож не покладайтесь на тип тіла POST для стійкої безпеки, використовуйте маркер anti-CSRF.
LordOfThePigs

@LordOfThePigs Forging дійсний JSON вже можливий з text / plain .
Гамбо

@Gumbo правильний, але наразі ви не можете встановити тип, application/jsonякий саме використовується для утримання атак CSRF у цій відповіді. Запропонований стандарт дозволить вам встановити enctype application/json, який би перебив перевірку типу вмісту, зазначену у відповіді, і відкрив програму для CSRF.
LordOfThePigs

10
Схоже, що проект попереджує цю атаку. Розділ 5 визначає, що application/jsonдописи у формі повинні відповідати одній і тій же політиці походження, тобто атака не сильніша за XHR.
James_pic

3

Так, це можливо. Ви можете налаштувати сервер зловмисника, який надішле переадресацію 307 на цільовий сервер на машину-жертву. Вам потрібно використовувати flash для надсилання POST замість використання форми.

Довідково: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241

Він також працює на Chrome.


1

Можна зробити CSRF на послугах Restful на основі JSON, використовуючи Ajax. Я перевірив це на додатку (використовуючи як Chrome, так і Firefox). Вам потрібно змінити contentType на text / plain, а dataType на JSON, щоб викликати попередній запит. Тоді ви можете надіслати запит, але для того, щоб надіслати сесійні дані, вам потрібно встановити прапор withCredentials у вашому запиті ajax. Я обговорюю це більш докладно тут (посилання включені):

http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html


Це непотрібно. Якщо сервер читає запити на відкритий текст як JSON, форми, закодованої як відкритий текст, достатньо для підробки такого запиту, як згадував Гамбо. Сервери API повинні просто відхиляти запити відкритого тексту.
Франклін Ю

-1

У мене є деякі сумніви щодо пункту 3. Хоча його можна вважати безпечним, оскільки він не змінює дані на стороні сервера, дані все одно можуть бути прочитані, і існує ризик того, що їх можна вкрасти.

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/


1
Це працює, лише якщо об'єкт верхнього рівня, повернутий API, є масивом JSON, оскільки Javascript дозволяє замінити конструктор Array. Об’єкт верхнього рівня безпечний. Більше на flask.pocoo.org/docs/0.10/security/#json-security .
btubbs

За словами самого автора, " я не думаю, що жоден сучасний браузер вже має цю ваду ".
Франклін Ю

-6

Чи є веб-служба вразливою до атак CSRF, якщо наведене нижче відповідає дійсності?

Так. Це все ще HTTP.

Чи є запити PUT та DELETE коли-небудь вразливими до CSRF?

Так

здається, що більшість (усіх?) браузерів забороняють ці методи у формах HTML

Чи вважаєте ви, що браузер - це єдиний спосіб зробити запит HTTP?


3
Те, що служба використовує HTTP, не робить її вразливою до CSRF. Чи можете ви визначити фактичний вектор атаки CSRF, якому ця служба, як описано, є вразливою? І, звичайно, я не думаю, що браузер - це єдиний спосіб зробити HTTP-запит, але браузер - це найпоширеніший (єдиний?) Для користувача, який піддається обману, щоб зробити підроблений, міжсайтовий запит, який він не зробив очікувати.
djsmith

Іншими словами, покажіть мені конкретний вектор атаки CSRF, який використовує PUT, щоб обдурити користувача подати запит PUT на мою веб-службу (як описано). Я вважаю, що це неможливо.
djsmith

@symcbean: Чи можете ви, будь ласка, розмістити посилання або захистити свою відповідь іншим способом? Я не проголосував за цю відповідь, я б хотів, щоб ти спочатку надійшов. Дякую.
дотанкохен

Google знову не працює? Залишаючи осторонь вмісту, старі версії Flash (новіші версії Flash мають перехресну доміанську модель управління - але вона відрізняється від HTML5) - як щодо контрабанди банок - pseudo-flaw.net/content/web-browsers/corrupted -jars (Java виконується в активному контексті, але може викликати javascript у пасивному контексті). Потім атаки DNS на перев’язування та атаки MITM
symcbean

Плагіни браузера можуть читати ваш файл cookie CSRF і надсилати будь-який заголовок, який їм заманеться, тому навіть стандартні механізми забезпечення CSRF дефакто вразливі до зловмисного плагіна браузера.
djsmith
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.