CSRF(사이트 간 요청 위조, Cross-site request forgery)
1. CSRF 정의
웹 애플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격방법
조작된 요청정보가 삽입된 게시글을 클릭하면 사용자의 권한으로 의도하지 않은 조작된 요청을 웹 서버에 전송하도록 하여 게시판 설정 변경, 회원 정보 변경, 패스워드 변경 등의 행위가 발생
XSS | CSRF | |
발생위치 | 클라이언트에서 발생 | 서버에서 발생 |
차이점 | 사용자가 특정 사이트를 신뢰한다는 점을 공격 | 특정 사이트가 사용자의 브라우저를 신뢰한다는 점을 공격 |
XSS는 사용자가 특정 사이트를 신뢰한다는 점을 공격하는 거라면,
CSRF는 특정 사이트가 사용자의 브라우저를 신뢰한다는 점을 공격하는 것이 차이점이다.
2. CSRF 사례(2008년 옥션)
1800만 명의 개인정보가 해킹
순서
1) 옥션 관리자 중 한 명이 관리 권한을 가지고 회사 내에서 작업을 하던 중 메일을 조회(관리자로서 유효한 쿠키를 갖고 있음)
2) 해커는 태그가 들어간 코드가 담긴 이메일을 보낸다. 관리자는 이미지 크기가 0이므로 전혀 알지 못한다.
<img src="http://auction.com/changeUserAcoount?id=admin&password=admin" width="0" height="0"> |
3) 피해자가 이메일을 열어볼 때, 이미지 파일을 받아오기 위해 URL이 열린다.
4) 해커가 원하는 대로 관리자의 계정이 id와 pw 모두 admin인 계정으로 변경된다.
3. CSRF 방어방법
1) Referrer 검증
- Back-end단에서 request hearder에 있는 요청을 한 페이지의 정보가 담긴 referrer 속성을 검증하여 차단한다. 대부분 방어가 가능할 수 있다.
- referrrer란? 웹 브라우저로 월드 와이드 웹을 서핑할 때, 하이퍼링크를 통해서 각각의 사이트로 방문 시 남는 흔적을 말한다.
- 하지만 같은 도메인 내의 페이지에 XSS 취약점이 있는 경우 CSRF 공격에 취약해질 수 있다.
2) CSRF Token 사용
- 랜덤한 수를 사용자의 세션에 저장하여 사용자의 모든 요청(Request)에 대해서 서버단에서 검증하는 방법
- CSRF token: 서버 측 응용 프로그램에서 생성되고 클라이언트가 만든 후속 HTTP 요청에 포함되는 방식으로 클라이언트에 전송되는 고유하고 비밀스럽고 예측할 수 없는 값이다. 나중에 요청이 작성되면 서버 측 애플리케이션은 요청에 예상 토큰이 포함되어 있는지 확인하고 토큰이 누락되거나 유효하지 않은 경우 요청을 거부한다.
- CSRF Token 생성 방법
- 생성된 타임스탬프와 함께 암호화 강도 PRNG(pseudo-random number generator)를 사용해야 한다.
- CSRF Token 전송 방법
- POST 메서드를 사용하여 제출된 HTML 양식의 숨겨진 필드 내에서 클라이언트에 토큰을 전송하는 것이다. 그러면 양식이 제출될 때 토큰이 요청한 매개변수로 포함된다.
- 추가로 CSRF Token이 포함된 필드는 HTML 문서 내에서 가능한 한 빨리, 숨겨지지 않은 입력 필드 앞에 배치해야 한다. 이는 공격자가 제작한 데이터를 사용하여 HTML 문서를 조작하고 그 내용의 일부를 캡처할 수 있는 다양한 기술을 완화한다.
- 쿠키 내에서 전송되지 않아야 한다.
- CSRF Token 검증 방법
- CSRF 토큰이 생성되면 서버 측에 저장이 되어야 한다. 유효성 검사가 필요한 후속 요청이 수신되면 서버 측 응용 프로그램은 요청에 사용자 세션에 저장된 값과 일치한 토큰이 포함되어 있는지 확인한다. 이 유효성 검사는 요청의 HTTP 메서드 또는 콘텐츠 유형에 관계없이 수행되어야 한다. 요청에 토큰이 전혀 포함되어 있지 않으면 유효하지 않은 토큰이 있을 때와 같은 식으로 거부되어야 한다.
3) CAPTCHA 사용
- Completely Automated Public Turing test to tell Computers and Humans Apart의 약어
- 어떠한 사용자가 실제 사람인지 컴퓨터 시스템인지 구별하기 위해 사용되는 방법이다.
참고
이미지 출처: https://www.imperva.com/learn/application-security/csrf-cross-site-request-forgery/
'Security > WebHacking' 카테고리의 다른 글
[WebGoat] Numeric SQL injection 풀이 (0) | 2020.09.10 |
---|---|
[WebGoat] String SQL injection 풀이 (0) | 2020.09.10 |
[WebGoat] LAB: Stored XSS(Stage 1) 풀이 (0) | 2020.09.09 |
[WebGoat] Stored XSS Attacks 정의 및 문제 풀이 (0) | 2020.09.09 |
[WebGoat] WebGoat7.1 설치 및 실행 (0) | 2020.08.26 |