Уязвимы ли веб-службы JSON для атак CSRF?


Я создаю веб-службу, которая использует 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 сеанса, который веб-служба дает им после того, как они предоставляют правильный пара имя пользователя / пароль через сообщение с данными JSON, например {"username":"user@example.com", "password":"my password"}.

вспомогательный вопрос: Are PUT и DELETE запросы когда-либо уязвимы для CSRF? Я спрашиваю, потому что кажется, что большинство (все?) браузеры запрещают эти методы в HTML-формах.

изменить: добавлен пункт #4.

EDIT: много хороших комментариев и ответов до сих пор, но никто не предложил конкретную атаку CSRF, к которой эта веб-служба уязвима.

5 58

5 ответов:

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

таким образом, единственная угроза исходит от атак CSRF на основе XHR. И они будут успешными только в том случае, если они либо

если вы можете устранить оба, ваш веб-сервис не уязвим для CSRF. По крайней мере, не те, которые выполняются через веб-браузер.

можно сделать CSRF на основе JSON Restful services с помощью Ajax. Я тестировал это в приложении (используя как Chrome, так и Firefox). Вы должны изменить contentType на text / plain и тип данных на JSON для того, чтобы avaoid предполетный запрос. Затем вы можете отправить запрос, но для отправки sessiondata вам нужно установить флаг withCredentials в вашем запросе ajax. Я обсуждаю это более подробно здесь (ссылки включено):

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

Да, это возможно. Вы можете настроить сервер злоумышленника, который отправит обратно перенаправление 307 на целевой сервер на машину жертвы. Вам нужно использовать flash для отправки сообщения вместо использования формы.

Ссылка:https://bugzilla.mozilla.org/show_bug.cgi?id=1436241

Он также работает на Chrome.

У меня есть некоторые сомнения по поводу пункта 3. Хотя это можно считать безопасным, поскольку это не изменяет данные на стороне сервера, данные все еще могут быть прочитаны, и риск состоит в том, что они могут быть украдены.

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

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

да. Это все-таки по протоколу HTTP.

запросы PUT и DELETE когда-либо уязвимы для CSRF?

да

Кажется, что большинство (все?) браузеры запрещают эти методы в HTML-формах

вы думаете, что браузер-это единственный способ сделать HTTP-запрос?