Post

CSRF 참고

CSRF 참고

CSRF - Cross Site Request Fogery

사용자가 의도치않게 특정한 요청을 직접 보내도록 강제하여 이익 또는 목적을 달성하는 공격

- 어떻게

  1. 공격자는 특정한 HTML태그 또는 자바스크립트를 이용해 조작된 요청을 만든다.
  2. 피해자에게 링크 또는 메일등을 통해 전송한다.
  3. 피해자가 링크를 클릭하거나 메일을 읽으면 피해자의 브라우저에서 요청이 전송되어 공격이 실행된다.

- 공격

다음과 같이 패스워드를 변경하는 요청하는 애플리케이션이 있다고 가정한다.

1
2
3
4
5
6
POST /user/pwchange HTTP/1.1
Host: heogi.com
Content-type: text/html
Cookie: sessid = some_token

pw=test123&pw_repeat=test123

이렇게 요청이 구성되면 로그인한 유저에게 다음과 같은 폼을 전달한다.

1
2
3
4
5
6
<body onload="document.forms[0].submit()">
 <form action="http://heogi.com/user/pwchange" method="POST">
  <input type="hidden" name="pw" value="attacker_pw">
  <input type="hidden" name="pw_repeat" value="attacker_pw">
 </form>
</body>

그러면 유저도 모르게 위의 폼을 통해 요청이 전송되어 비밀번호가 변경되게된다.

- 방어

  1. Referrer 검증
    Referrer를 검증하여 요청이 다른 사이트로 부터 전송되었는지 검증한다.
  2. CSRF token
    랜덤한 값을 이용해 토큰을 생성하여 이를통해 검증한다.

    1)서버가 GET /user/pwchange HTTP/1.1 로 접속한 클라이언트한테 CSRF 토큰을 전송한다.

    2)클라이언트가 작성한 폼과 함께 토큰을 전송한다.

    3)토큰이 틀리다면 요청을 거부한다.

    위의 공격 예에서 1번을 건너뛰고 공격을 하게되어 서버로 부터 CSRF token을 받지 못한다. 하지만 애플리케이션에 XSS 취약점이 존재하면 CSRF token값을 이용해 정상적으로 요청가능하다.

  3. CORS 비허용
    다른 출처의 Origin에서 받은 요청을 비허용한다.

- SOP and CORS

  1. SOP : 다른 도메인으로부터 자원을 요청하는것을 제한한다.
    • Browser Security 기능
    • 두 도메인끼리 protocol, port, host 세개가 다 일치해야한다.
    • 허용되는것과 막히는것
  2. CORS : 다른 도메인으로부터의 자원을 선택적으로 허용하는 정책이다.
    • CORS 동작
      1) client(browser) request - cross-origin 요청을할때 브라우저가 현재 origin(scheme, host, port)을 Origin 헤더에 넣어서 보낸다. 2) server response - 서버가 허용하면 response 헤더에 Access-Control-Allow-Origin을 추가하여 보낸다.

- 참조

https://web.dev/same-origin-policy/
https://web.dev/cross-origin-resource-sharing/
https://github.com/preco21/understanding-csrf/blob/master/README_ko.md

This post is licensed under CC BY 4.0 by the author.