사이트 간 요청 위조[ Cross-site request forgery, CSRF, XSRF] 오류

sihwan_e·2020년 5월 12일
0

Django

목록 보기
5/21

httpie를 이용해 회원가입 정보와 로그인정보를 받으려고 하던중,

403 Forbidden 오류를 만나게 되었다.

그와 동시에 서버는

Forbidden (CSRF cookie not set .):/sign/up

을 도배했다.

인터넷에 쳐보았다.

CSRF [Cross-Site Request Forgery]

사이트간 요청 위조 라고 하며, 웹 애플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 해서 특정 웹페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법이다.
비슷한 오류로 XSS가 있는데, CSRF와의 차이점은 XSS가 사용자가 특정 사이트를 신뢰한다는 점을 공격하는거라면, CSRF는 특정 사이트가 사용자의 브라우저를 신뢰한다는 점을 공격하는 것이 다르다.
XSS는 클라이언트에서, CSRF는 서버에서 악성코드가 발생한다.

공격방법

이러한 공격을 하기 위해 해커는 우선 공격을 할 사이트를 먼저 분석한다. 예를 들어서, 이 나무위키의 경우에 토론은 한때 'namu.wiki/topic/'이라고 시작하며 뒤에 숫자가 붙는 형식이었는데 이 뒤의 숫자에 패턴[1]이 있었다.[2] 그러면 이 패턴을 이용하여 일반적인 방법으로 접근할 수 없는 페이지를 오픈한다든지, 개발에 사용되고 실제로 사용하지 않는 샘플 페이지를 찾아낸다든지 이러한 방법이 가능하다.

그게 아니라 웹페이지가 독자적 개발이 아닌 외부에서 이미 개발된 웹 애플리케이션을 사서 조금 수정한 것이라면 공격자는 경우에 따라서 해당 웹 애플리케이션을 구매하여 개인 서버에 설치를 한다. 그 다음에 공격 가능 패턴을 분석한다. 주로 공격자들이 찾는 것은 사용자 패스워드 변경 페이지나 타 시스템과 로그인 연동 주소 패턴 같은 인증 관련된 취약점을 찾는다.

그 다음에 여기서 나온 취약점을 이용해서 공개된 게시판이나 메일을 이용해서 사용자가 해당 링크를 열게 만들면 공격이 완료된다.(namu.wiki 참고)

위의 사례와 비슷하게 불확실한 접근으로 요청을 (회원가입시도)를 했기 때문에 발생했다고 생각한다.

해결방법

csrf를 주석처리를 일단해준다. 주석처리를 해주면서 주입된 csrf토큰을 기능하지 않게한다.
장고실습중에 잠깐 주석처리를 해서 해당기능을 쓰지 않는 것이므로, 실제 상황에서는 다른 해결방법을 써야한다.

Referer

방어 방법 중 가장 기초적인 방법은 Referer 체크를 하는 방법이 있다.
Referer는 HTTP 헤더에 있는 정보로 해당 요청이 요청된 페이지의 정보를 가지고 있는데 해당 정보는 Paros나 Zap, fiddler같은 프로그램으로 조작이 가능하지만 방법이 간단하여 소규모 웹사이트에 주로 이용되는 방법이다.

equest header에 있는 요청을 한 페이지의 정보가 담긴 referrer 속성을 검증하여 차단.
일반적으로 이 방법만으로도 대부분 방어가 가능할 수 있다.
옥션이 아닌 개인 이메일에서 요청이 들어오는 것처럼,
같은 도메인 상에서 요청이 들어오지 않는다면 차단하도록 하는 것이다.

토큰발행

그 외에는 패스워드 변경 같은 민감한 정보를 다룰 때에는 세션에 임의난수(토큰)를 발급해서, 해당 난수가 없는 상황에서 해당 동작들이 이루어지면 요청을 거부하는 방법을 통하여 사용자가 정말로 변경을 의도하는 경우에만 변경을 시켜주는 방법,

CAPTCHA

변경 시에 CAPTCHA를 이용하여 CAPTCHA 인증코드가 없거나 틀리면 거부하도록 하는 방법 등이 이용되고 있다.
거의 모든 웹사이트에서 캡차를 이용하는 것 같은데 캡차이미지상의 숫자/문자가 아니라면 해당 요청을 거부하는 것이다.

또한 GET/POST 등을 구분하여 주는 것 역시 유용하다. img 태그 등을 이용할 경우 GET 요청으로 들어오게 될 것이고, 반면 흔히 하듯 form을 이용해 값을 받을 경우 POST를 이용하게 되는 경우가 많기 때문이다.

profile
Sometimes you gotta run before you can walk.

0개의 댓글