2016-09-02 2 views
2

웹 응용 프로그램에서 작업 중이며 릴리스 전에 VAPT을 실행해야합니다. 다음과 같이 request.getHeader ("Origin")가 교차 사이트 요청 위조 공격을 방지하는 방법은 무엇입니까?

는 그럼, Vega을 다운로드하고 신속하게 내 웹 애플리케이션을 스캔하고 VAPT 문제를 건너 왔어요 :

베가 자원이 안전하지 않은 크로스 원산지 리소스 공유 (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() { 
    } 
} 

, 다시 내가 웹 애플리케이션에 대해 베가를 스캔 할 때, 그것은 동일한 문제를 다시 열거하지 않았다. 나는 CSRF 공격에 대한 나의 webapp을 저장했다고 생각한다. 내가 요청 헤더 자체에서 "Access-Control-Allow-Origin"을 따기입니다으로 지금

, this 게시물을 읽은 후, 나는 request.getHeader("Origin") 원점 중 하나 https://webapp.com 또는 https://evil.com 무엇이든 같이 Cross Site Request Forgery attacks에서 방지하는 방법을 통해 생각하고, 요청은 항상 응용 프로그램에 대한 유효합니다.

누구나 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")); 사이트를 추가하는 것 외에도 여전히 취약한 사이트이므로 whitelisthere으로 완료되거나 (here) Tomcat에서 IP가 Apache (클러스터에 배포 된 응용 프로그램 용)에서 명시 적으로 필요합니다.

아직도 나는 우리가 서버 수준 자체에서 IP 주소를 제한하는 경우, 하나의 의심이보다 더 우리가 정말 응답 헤더의 한 부분으로 "Access-Control-Allow-Origin"을 설정해야합니까?

+0

최신 스프링 보안 버전을 사용하는 경우에는 cors 지원이 내장되어 있으므로 필터를 쓸 필요가 없습니다. – xenoterracide

+0

예 IP 제한으로 인해 ACAO 헤더를 보낼 필요가 있지만 그래도 ACAO 헤더를 보내야합니다. 바인딩 된 IP 범위의 경우 요청은 여전히 ​​교차 원점이 될 수 있습니다.따라서 IP 제한이 허용 목록으로 작동 할 수는 있지만 ACAO 헤더없이 CORS를 수행 할 수는 없습니다. a.example.com에서 b.example.com으로의 요청조차도 교차 원점이며 AJAX를 사용하는 경우 CORS 헤더가 필요합니다. – rism

+0

CORS는 실제로 HTML5 사양의 클라이언트 측 기술 부분입니다. 클라이언트 측 브라우저에서 AJAX 요청에 대해 이야기하고 있다고 가정합니다. 그렇지 않으면 실제로 서버 대 서버 호출에 대해 이야기하는 경우 CORS는 서버가 아닌 동일한 출처 정책을 적용하는 브라우저이므로 모든 관련이 없습니다. – rism

답변

4

CSRF 공격의 목적을 이해하는 데 도움이됩니다. 그들은 데이터를 "훔치는"것이 아닙니다. 이름에서 알 수 있듯이 "사이트 간 위조 된 요청"을 일명 Cross Site Request Forgery라고도합니다.

목적은 은행 계좌와 관련된 표준 예제를 사용하여 서버의 상태를 변경하는 것입니다. 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 to 특히 요청을 승인하십시오.

그리고 네 말이 맞다. 이 헤더의 정적 * 값을 동적 인 request.getHeader("Origin")으로 바꾸면됩니다. 베가를 등 뒤에서 얻으십시오. 귀하의 사이트는 www.cutekittens.com을 반영 할 것이기 때문에 잘못 작성된 경우에도 여전히이 공격에 취약 할 수 있습니다.

* 대신 request.getHeader("Origin")을 사용하는 이유 중 하나는 서버에 자격 증명을 보내려는 경우입니다. 예를 들어 자격 증명을 보낼 수 없습니다. 쿠키 등 CORS AJAX 요청에 대한 서버에만 *을 사용하고 있으므로이 경우에는 원본을 클라이언트에 역동적으로 반영합니다.

하지만 이렇게하면 다른 방법으로 위험을 완화해야합니다. 이 경우 일반적으로 흰색을 표시하고 다시 반영하지 않을 것입니다. 예 : portal.mybank.com은 목록에 있지만 www.cutekittens.com은 그렇지 않을 수 있습니다. 따라서 동적 원점 리플렉션을 사용한다면 다음 단계로 구현할 수 있습니다.

+0

내 질문에 대한 답변을 바탕으로 상세하고 훌륭한 설명을 해 주셔서 감사합니다. 모양을 가지고 생각을 공유하십시오. – Arpit