2014-10-22 2 views
3

Мы создаем приложение с поддержкой Java Spring/Hibernate, работающим в JBoss. Внешний интерфейс AngularJS.Достаточно ли Access-Control-Allow-Origin предотвращать атаки XSRF?

Мы еще ничего не сделали для установки токенов XSRF на сервере. У нас также нет (пока еще нет) требования предоставить другим доменам доступ к нашим веб-ресурсам.

Я решил, что постараюсь выяснить, был ли наш сайт уязвим для атаки XSRF, поэтому я установил вредоносный Webapp для публикации в одном из наших настоящих приложений, используя URL-адрес Angular $ http.post(). Я вошел в реальное приложение, а затем попытался отправить сообщение из вредоносного приложения.

В браузере я получил 401 ответа и увидел ошибку:

XMLHttpRequest cannot load http://localhost:8080/user/delete. No 
'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:6543' is therefore not allowed access. The response 
had HTTP status code 401. 

на стороне сервера не настроен для установки Access-Control-Allow-Origin на ответ, таким образом, выше ошибки.

Итак, мой вопрос: просто ли исключить Access-Control-Allow-Origin из заголовка ответа, достаточного для предотвращения атак XSRF?

Есть ли способ, которым я все еще мог бы атаковать XSRF на моем сайте, даже если Access-Control-Allow-Origin не установлен? Если да, то как? Я бы хотел продемонстрировать эту атаку.

Спасибо.

ответ

5

Нет, этого недостаточно. Несмотря на то, что браузер дает ошибку 'Access-Control-Allow-Origin', запрос по-прежнему выполняется браузером. Если withCredentials указан на странице атакующей:

$http.post(url, {withCredentials: true, ...}) 

, этот запрос будет отправлен на ваш домен с печеньем аутентификации жертвы, а это означает, что запрос на http://www.example.com:8080/user/delete удастся.

Кроме того, этот запрос также может быть сделано без XHR с помощью стандартной формы HTML:

<form method="post" action="http://www.example.com:8080/user/delete"> 

и JavaScript просто использовать для отправки формы, а не делать сам запрос.

Простым способом защиты вашей системы от CSRF является проверка для настраиваемого заголовка, такого как X-Requested-With или заголовок Origin. X-Requested-With не может быть отправлен через перекрестный домен без включения сервера CORS. Тем не менее, Synchronizer Token Pattern по-прежнему является самым сильным методом предотвращения CSRF, поскольку это не подвержено ошибкам в плагинах браузера, таких как previous flaw in Flash, которые позволяют отправлять заголовки, которые обычно не могут быть отправлены из браузера.

+0

большой, спасибо. это то, что я искал. – lostdorje

+0

Возможно, я сказал слишком рано. Установка 'withCredentials' в true не повлияла. Я также переработал $ httpProvider.defaults.headers.common ['X-Requested-With'] = 'XMLHttpRequest' в сочетании с 'withCredentials', и я не мог придумать вариант, который сделал запрос успешным. – lostdorje

+0

@lostdorje: Убедитесь, что у вас есть сторонние файлы cookie, включенные в браузере, и вы можете проверить, отправляются ли файлы cookie с использованием прокси-сервера перехвата (некоторые инструменты для разработчиков фактически не показывают файлы cookie из-за той же политики происхождения). Я ответил на очень похожий вопрос на днях (http://security.stackexchange.com/a/71082/8340), однако это было с точки зрения злоумышленника. – SilverlightFox

Смежные вопросы