2016-09-02 8 views
2

Я работаю над веб-приложением и попросил запустить VAPT против него перед выпуском.Как request.getHeader («Происхождение») предотвращает атаки Cross Site Request Forgery?

Тогда я скачал Vega и быстро просмотрел мой веб-приложение и наткнулся на вопрос VAPT следующим образом:

Vega обнаружил, что ресурс установлен небезопасный Cross-Origin совместного использования ресурсов (CORS) контроль доступа , CORS предоставляет механизмы, позволяющие серверу ограничить доступ к ресурсам для межсайтовых запросов до определенных доверенных доменов. Сервер, о котором идет речь, разрешил ресурс из любого источника, установив значение ответного заголовка «Access-Control-Allow-Origin» в значение подстановочного знака. Это представляет угрозу безопасности, поскольку любой сайт может выдавать запросы на ресурсы доступа, независимо от их происхождения.

Тогда я начал находить решение, чтобы исправить это и наткнулся на this пост и реализовал filter как это было предложено в ответ следующим образом:

@Component 
public class CORSFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse response = (HttpServletResponse) res; 
     HttpServletRequest request = (HttpServletRequest) req; 
     response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); 
     response.setHeader("Access-Control-Allow-Methods", 
       "POST, GET, OPTIONS, DELETE"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 
     chain.doFilter(request, response); 
    } 

    public void destroy() { 
    } 
} 

Теперь, когда я снова просмотрел Vega против веб-приложение, он еще не перечислил ту же проблему, которая, как я считаю, спасла мой webapp от атак CSRF.

Теперь, после прочтения this пост, я имею в виду о том, как request.getHeader("Origin") предотвращает Cross Site Request Forgery attacks, так как независимо от происхождения либо https://webapp.com или https://evil.com, запрос всегда справедливо для применения как я собирание "Access-Control-Allow-Origin" из самого запроса заголовка.

Может ли кто-нибудь помочь мне в понимании концепции, как настройка request.getHeader("Origin") экономит у CSRF attacks?

Спасибо.

Понимание после прочтения @rism ответа и Патрик Grimard post:

Когда клиентское приложение делает запрос AJAX, браузер сначала отправляет предполетный OPTIONS запроса к серверу, чтобы определить, что клиент разрешен делать, для запроса, кроме GET, и поэтому мы должны установить Access-Control-Allow-Origin как для происхождения, так и для определенного домена как часть заголовка ответа.

На примере POST, когда клиент посылает запрос, браузер сначала делает предполетной OPTIONS запрос на сервер и ответ сервера к OPTIONS запросу содержит заголовки, которые инструктируют браузер, для которого всех origin запроса разрешается. Помимо добавления response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); сайт по-прежнему уязвим, поэтому нам необходимо явно указать IP-адреса в Apache (для приложения, развернутого в кластере), как сделано here или в Tomcat, как описано here.

Еще у меня есть одно сомнение, если мы ограничиваем IP-адрес на самом серверном уровне, чем мы на самом деле нужно установить "Access-Control-Allow-Origin" как часть заголовка ответа?

+0

Если вы используете новейшую версию весенней безопасности, там встроена поддержка cors, вам не нужно писать фильтр – xenoterracide

+0

Да, вам все равно нужно будет отправить заголовок ACAO, потому что хотя ограничение IP может ограничить допустимое в связанные диапазоны IP, запрос по-прежнему будет, по-видимому, перекрестным.Поэтому, хотя ограничение IP может выступать в качестве белого списка, вы все еще не можете делать CORS без заголовка ACAO. Даже запрос от a.example.com к b.example.com является перекрестным, и для использования AJAX потребуются заголовки CORS. – rism

+0

Чтобы быть ясным, CORS на самом деле является частью клиентской технологии спецификации HTML5. Итак, я предполагаю, что вы говорите о запросах AJAX от браузеров на стороне клиента? В противном случае, если вы действительно говорите о вызовах сервера к серверу, то CORS не совсем уместен, так как это браузер, который использует политику одного и того же происхождения, а не сервер. – rism

ответ

4

Это помогает понять цель атаки CSRF. Они НЕ о «краже» ваших данных. Они, как следует из названия, говорят о «создании поддельных запросов на разных сайтах», например, в Cross-Site Request Forgery, например CSRF.

Целью является изменение состояния на сервере с каноническим примером, включающим банковский счет. При атаке CSRF мы пытаемся подделать запрос (перевод 100 долларов США) на ваше имя.

Таким образом, простым примером является атакующий, вводящий скрипт или скрытую форму и т. Д. На страницу any site, например. www.cutekittens.com, и этот сценарий предназначен для specific site, например. www.mybank.com, следовательно, термин Cross Site.

Идея состоит в том, что вы, как жертва, одновременно регистрировались на обоих сайтах, а на банковском сайте была обеспечена безопасность. Пока вы смотрите на симпатичных котят на www.cutekittens.com, злоумышленник ввел сценарий атаки на межсайтовый сайт на одну или несколько его страниц. Цель этого скрипта - отправить запросы от вашего имени в ваш банк, www.mybank.com, на перевод 100 долларов США.

Снова обратите внимание, что злоумышленник не крадет ваши данные, вместо этого они пытаются сделать поддельные запросы от вашего имени, чтобы украсть ваши деньги/что угодно. Это не атака man in the middle (MITM), это попытка подделки запроса. В CSRF злоумышленник не видит или не видит ваши данные, они просто находят способ действовать так, как если бы они были вами. Дальнейшая цель этого может быть связана с вашими данными, например, сменить пароль и т. Д., Но сама атака заключается в создании поддельных запросов, а не о перехвате.

Таким образом, один из способов, которым банк может обеспечить себя и своих «клиентов», конкретно указывает, какие сайты могут и могут не делать запросы к нему через заголовки CORS.

И если они специально не включают www.cutekittens.com, то даже если злоумышленнику удается внедрить свой вредоносный сценарий в страницу на сайте www.cutekittens.com, и даже если вы, возможно, занимаетесь серфингом как cutekittens и ваш сайт банка, и даже если сценарий атаки будет выполнен, запрос на www.yourbank.com будет удален (после предвыборной кампании для POST), поскольку банк не отправил заголовок в браузер ACCESS-CONTROL-ALLOW-ORIGIN : www.cutekittens.com, чтобы специально разрешить запрос.

Итак, вы правы. Все, что вы сделали, заменив статическое значение * для этого заголовка динамическим request.getHeader("Origin"), это получить Vega со спины. Ваш сайт по-прежнему потенциально уязвим для этой атаки, если он плохо написан, потому что он будет отражать назад www.cutekittens.com, который, по-видимому, не тот, который вы хотите.

Одна из причин, по которой вы должны использовать request.getHeader("Origin") вместо *, - это когда вы хотите отправить учетные данные на сервер. Вы не можете отправлять учетные данные, например. cookie и т. д. в запросе CORS AJAX, на сервер, используя только *, и поэтому в этом случае вы динамически отражаете исходный код для клиента.

Но при этом вам действительно нужно убедиться, что вы уменьшаете риск другими способами. В этом случае вы также обычно будете белым списком, что хотите, и не будете отражать его. например портал.mybank.com может быть в списке, но www.cutekittens.com не будет. Таким образом, это будет следующий шаг, который вы можете реализовать, если вы собираетесь использовать динамическое отражение происхождения.

+0

Благодарим вас за подробное и приятное объяснение, основываясь на вашем ответе. Я обновил свой вопрос, пожалуйста, взгляните и поделитесь своими мыслями. – Arpit