Csrf 대응방안 - csrf daeeungbang-an

https://itstory.tk/entry/CSRF-%EA%B3%B5%EA%B2%A9%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-CSRF-%EB%B0%A9%EC%96%B4-%EB%B0%A9%EB%B2%95

CSRF 공격이란? 그리고 CSRF 방어 방법

CSRF 공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게

itstory.tk

Csrf 대응방안 - csrf daeeungbang-an

https://12teamtoday.tistory.com/10

CSRF란?

CSRF의 기본 개념입니다. CSRF(Cross Site Request Forgery) 개념 : 권한을 도용당한 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록)를 특정 웹사이트에 요청하게 만드�

12teamtoday.tistory.com

Csrf 대응방안 - csrf daeeungbang-an

CSRF(Cross Site Request Forgery)

  1. 개념 : 권한을 도용당한 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록)를 특정 웹사이트에 요청하게 만드는 공격
  2. 방어 기법
    • Referer 검증
      • Back-end에서 request의 referer를 확인하여 Domain(saleson.com)이 일치하는지 검증.
      • 대부분의 CSRF공격 방어가 가능함. 하지만 XSS 취약점이 있는 경우 방어가 불가능해질 수 있음.
    • Security Token 사용(CSRF Token)
      • 사용자의 세션에 임의의 난수값을 저장하고 사용자의 요청마다 해당 난수값을 포함시켜 전송.
      • 이후 Back-end에서 요청을 받을 때마다 세션에 저장된 토큰값과 요청 파라미터에서 전달되는 토큰값이 같은지 검증하는 방법. 이 또한 XSS 취약점이 있는 경우 방어가 불가능해질 수 있음.
    • Double Submit Cookie 검증
      • 웹브라우저의 Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키값을 확인, 수정하지 못한다는 것을 이용한 방어 기법.
      • script 단에서 요청시 난수를 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터에 저장하여 서버에 전송. 서버단에서 쿠키의 토큰 값과 파라미터의 토큰값이 일치하는지만 검사하면 됨. 서버에 토큰값을 저장할 필요가 없어 세션 검증보다 가벼움.
    • Spring Security를 이용하는 방법
      • 사실 Spring Security를 공부하다가 CSRF 개념을 접하게 되었습니다. Spring Security를 이용한 CSRF 방어 방법은 세부 예제와 함께 이어집니다.

https://codediver.tistory.com/148

[Spring Framework] Spring Security CSRF 적용

폼 전송시 아래를 반드시 추가할 것. 상단에 스프링 시큐리티 taglib를 추가하고 <%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %> 를 이용하여도 된다. security-context.xml 에..

codediver.tistory.com

Csrf 대응방안 - csrf daeeungbang-an

Security Token 사용 (A.K.A CSRF Token)

Referrer 검증이 불가한 환경이라면, Security Token를 활용할 수 있습니다. 우선 사용자의 세션에 임의의 난수 값을 저장하고 사용자의 요청 마다 해당 난수 값을 포함 시켜 전송시킵니다. 이후 Back-end 단에서 요청을 받을 때마다 세션에 저장된 토큰 값과 요청 파라미터에 전달되는 토큰 값이 일치하는 지 검증하는 방법입니다. 이 방법도 결국 같은 도메인 내에 XSS 취약점이 있다면 CSRF 공격에 취약해집니다. 아래는 간략한 샘플 코드입니다.

Csrf 대응방안 - csrf daeeungbang-an

Double Submit Cookie 검증은 Security Token 검증의 한 종류로 세션을 사용할 수 없는 환경에서 사용할 수 있는 방법입니다. 웹브라우저의 Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키 값을 확인/수정하지 못한다는 것을 이용한 방어 기법입니다. 스크립트 단에서 요청 시 난수 값을 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터(혹은 헤더)에도 저장하여 서버로 전송합니다. 서버단에서는 쿠키의 토큰 값와 파라미터의 토큰 값이 일치하는 지만 검사하면 됩니다. 서버에 따로 토큰 값을 저장할 필요가 없어 위에서 살펴본 세션을 이용한 검증보다 개발 공수가 적은 편입니다. 피싱 사이트에서는 도메인이 달라 facebook.com 쿠키에 값을 저장하지 못하므로 (조금 전에 언급한 Same Origin 정책) 가능한 방어 기법입니다. 아래는 샘플 코드입니다.

Csrf 대응방안 - csrf daeeungbang-an
Csrf 대응방안 - csrf daeeungbang-an

장치나 인명의 안전을 위한 보안기(arrester)

arrester 피뢰기감동? 받으며IT보안 공부하는 김주원입니다.

Cross-site Request Forgery(CSRF)

1. Cross-site Request Forgery(CSRF)이란?

2. CSRF와 XSS 차이점

3. CSRF 대응방안

4. 참고 문헌

1. Cross-site Request Forgery(CSRF)이란?

https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%9A%94%EC%B2%AD_%EC%9C%84%EC%A1%B0

CSRF 취약점은 사용자가 원하지 않는 데이터 변경 작업 수행을 뜻한다.

데이터 변경에는 데이터 생성, 삭제, 갱신 등이 포함된다. 이러한 공격을 웹 사이트 요청을 통해 진행한다.

● 공격 시나리오

이용자는 웹사이트에 로그인하여 정상적인 쿠키를 발급받는다

공격자는 다음과 같은 링크를 이메일이나 게시판 등의 경로를 통해 이용자에게 전달한다.

http://www.blackhacker.test.com/csrf

공격용 HTML 페이지는 다음과 같은 이미지태그를 가진다.

<imgsrc="https://traveltest1.com/travel_update?.src=Korea&.dst=Mongolia">

해당 링크는 클릭시 정상적인 경우 출발지와 도착지를 등록하기위한 링크이다. 위의 경우 도착지를 변조하였다.

이용자가 공격용 페이지를 열면, 브라우저는 이미지 파일을 받아오기 위해 공격용 URL을 연다.

이용자의 승인이나 인지 없이 출발지와 도착지가 등록됨으로써 공격이 완료된다. 해당 서비스 페이지는 등록 과정에 대해 단순히 쿠키를 통한 본인 확인 밖에 하지 않으므로 공격자가 정상적인 이용자의 수정이 가능하게 된다.

[그림 1] CSRF 예제 시나리오

위에서 언급한 CSRF 공격 과정을 그림으로 나타내면 [그림 1]과 같다.

사용자는 일반적인 항공권을 예매하고 악성 태그가 있는 사이트를 방문한다. 여기서 공격자가 올린 데이터 변경 이미지를 불러 사용자도 모르게 목적지가 바뀐 상태로 저장된다. 결과적으로 미국으로 가려고 예매 했던 내용은 몽골로 변경되었고 사용자가 꼼꼼하게 확인하지 못하면 몽골행 티켓을 구입하게 되는 경우가 생길 수 있다.

이것은 기본적인 예시이고, 다른 경우로는 자신의 계정으로 원하지 않는 게시글이 생성되거나 작성한 게시글이 삭제 또는 개인정보가 수정되는 경우가 발생할 수 있다.

2. CSRF와 XSS 차이점

https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%9A%94%EC%B2%AD_%EC%9C%84%EC%A1%B0

사이트 간 스크립팅(XSS)을 이용한 공격이 사용자가 특정 웹사이트를 신용하는 점을 노린 것이라면, 사이트간 요청 위조는 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태를 노린 것이다. 일단 사용자가 웹사이트에 로그인한 상태에서 사이트간 요청 위조 공격 코드가 삽입된 페이지를 열면, 공격 대상이 되는 웹사이트는 위조된 공격 명령이 믿을 수 있는 사용자로부터 발송된 것으로 판단하게 되어 공격에 노출된다.

XSS는 공격 대상이 Client

CSRF는 공격 대상이 Server로 보면 된다.

쉽게 말하면 XSS는 스크립트를 이용한 공격

CSRF는 내용 자체 변조를 통한 공격

1. Referrer 검증

백엔드에서 request의 referrer를 확인하여 현재 도메인과 일치하는지 검증하는 방법이다.

같은 도메인 상에서 요청이 들어오지 않는다면 차단하도록 하는 것이다.

보통 referrer 검증만으로 대부분의 CSRF 공격을 방어할 수 있다. 하지만 같은 도메인에서 XSS 취약점이 발견되면

CSRF 공격에 취약하다고 볼 수 있다. 도메인 검증에서 상세하게 검증할 필요가 있다.

2. Security Token 사용(CSRF Token)

Referrer 검증이 불가능하면, 보안 토큰을 이용할 수 있다.

우선 사용자의 세션에 임의 난수 값을 저장하고 사용자의 요청이 있을 경우

해당 난수 값을 포함 시켜 전송한다. 이후 벡엔드에서 요청을 받을 때 세션에 저장된

토큰값과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증하는 방법이다.

샘플 코드는 다음과 같다.

// 로그인시, 또는 작업화면 요청시 CSRF 토큰을 생성하여 세션에 저장한다. session.setAttribute("CSRF_TOKEN", UUID.randomUUID().toString()); // 요청 페이지에 CSRF 토큰을 셋팅하여 전송한다. <input type="hidden" name="_csrf" value="${CSRF_TOKEN}" /> // 파라미터로 전달된 CSRF 토큰 값 String param = request.getParameter("_csrf"); // 세션에 저장된 토큰 값과 일치 여부 검증 if (request.getSession().getAttribute("CSRF_TOKEN").equals(param)) { return true; } else { response.sendRedirect("/"); return false; }

3. CAPTCHA 사용

캡챠를 사용하여 검증을 통해 이용할 수 있도록 지정한다. 해당 기능만 추가해도 마음대로 개인정보가 수정되는 걸 쉽게 막을 수 있다.

4. Double-Submit Cookie Pattern

웹브라우저의 Same Origin 정책으로 공격자가 쿠키값에는 접근할 수 없는것을 이용한다.

1.브라우저는 GET 요청으로 토큰값과 _csrf 값을 서버로 부터 받는다.

2.브라우저에서 write요청시 header에 토큰값을 주고 쿠키값에 시크릿키를 부여하여 서버의 미들웨어에서 토큰값을 decode해서 decode한 시크릿키가 쿠키값과 일치하는지 체크한다.

3. 해당 패턴의 취약점을 막고자 HTTPS로 사이트를 구축한다.