원본 본문으로 이동하기

CSRF : 1. 공격법과 방어법 (XSS 설명 추가)

박용서 - CSRF 시리즈 1. 공격법과 방어법 (XSS 설명 추가) - https://gs.saro.me/#!m=elec&jn=822 2. 스프링에서 적용 (확장 태그 미지원 템플릿을 위한) - https://gs.saro.me/#!m=elec&jn=823 XSS 란? - https://en.wikipedia.org/wiki/Cross-site_scripting 갑자기 XSS 라니 뜬금없지만.. 필자는 이것을 먼저 알아야한다고 생각하기 때문에 XSS부터 설명하도록 하겠습니다. xss 란 주로 자바스크립트 혹은 심어져있는 플래시의 자바스크립트로 현재 접속해있는 사용자의 쿠키(정확히는 세션아이디)를 훔쳐서 피해자로 위장하는 해킹 기법입니다. http는 상태가 없는 프로토콜입니다. 하지만 상태가 없는 사이트란.. 사용성이 끔찍하기 때문에 쿠키의 세션아이디(물론 세션아이디의 이름이 세션아이디는 아니며, 임의로 지정할 수 있습니다.)라는 임시 난수를 넣고 이 값을 통해 상태(세션)을 구현합니다. 그렇게 되면 브라우저는 이 쿠키값을 기억하여 매번 서버로 보내주기에 서버에서 해당 세션아이디를 가지고 어떤 사용자인지 식별합니다. 공격자는 주로 게시판/이메일등에 html 을 작성, 주로 자바스크립트나 플래시를 이용해 document.cookie 를 탈취하는 방법으로 해당 쿠키를 꺼내오게 되고 피해자는 해당 스크립트가 실행되는 동시에 쿠키값을 복사당하게 됩니다. - 필자는 학창 시절 왜 session id와 IP를 대조하지 않는지 궁금해했지만... 스마트폰시대가 오고 깨달았습니다.!!! 이 공격의 예방법 1. 자바스크립트를 막습니다. 2. 플래시는 자바스크립트에 접근할 수 없게 만듭니다.. 3. html 자체를 사용하지 못하게 하거나 html 에서 자바스크립트를 실행할 수 있는 모든 부분을 막습니다. 예를들어 태그의 onclick, onmouseover 같은것도 모두 막아야합니다. - 필자가 추천하는것은 그냥 마크다운을 쓰세요!!! (요즘은 비주얼에디터 버전들도 있어요!!) 4. httpOnly 옵션 사용 : document.cookie 로 뽑아 쓸 수 없는 오직 http 전송 목적으로만 사용됩니다. (다행히 현재는 브라우저에서 모두 지원하며, was도 세션아이디 생성시 무조건 이 값입니다.) - 즉 httpOnly 옵션은 was가 완전 구버전이 아닌이상 신경쓰지 않아도됩니다. CSRF 란? 하지만 해커들은 끈질깁니다.!! 기본적인 원리는 XSS 와 동일하지만 주로 세션을 탈취하는 목적이었던 XSS 와 달리 사이트 간 요청을 하는 것 입니다. 예를들어 html 로 form을 작성하고 직접 실행하게 만들거나 onload 속성을 통해 자동실행되게 하여 접속자로 하여금 원격으로 페이지 요청을시키는 방법입니다. 그 밖에도 인자를 넣을 수 없어 조금 덜 위험하지만 <img src="사이트내 api 위치" /> 로 실행시키는 방법도 있습니다. 즉, 페이지를 요청한다는 개념만 빼면 XSS와 기본적으로 유사한 공격이라고 할 수 있습니다. - 즉, httpOnly 옵션 으로인해 쿠키복사가 불가능 하다면 피해대상에게 원격으로 요청을 시켜 결과값을 탈취하는 것 이라고 볼 수 있습니다. 그래서 나온 방어 방법은 csrf 토큰 입니다.!! 페이지를 요청하는 모든 부분에 사용자에게 랜덤으로 주어진 토큰을 넣을 경우 토큰이 없는 페이지나 <img src="사이트내 api 위치" /> 같은 방법으론 공격할 수 없게 되는 것 입니다. 이 공격의 예방법 1. XSS에 나오는 모든 예방법을 적용합니다. - 결론적으로 자바스크립트가 실행되면 해당페이지에 csrf 토큰이 있을경우 해당 값을 추출해서 요청할 수 있습니다. 2. csrf 토큰을 사용합니다. 3. 요청이 Accept:image/webp,image/*,*/* 같이 페이지 요청이 아닌경우 거부합니다. (다만 csrf 토큰이 있으면 이것을 별도로 처리하지 않아도됩니다.) 주의점 csrf 토큰이 요청을 완료할 때까지 만료되지 않게 해야합니다. - 다만 많은 WAS에서 토큰의 생명주기는 세션의 생명주기와 같은경우가 많아 특별히 신경쓰지 않아도 됩니다. (세션이 끊어지지 않게 하면됩니다.) - 만일 해당 생명주기가 서로 다를경우 ajax을 통해 처리되는 부분은 심각하게 고민을 해봐야할 것 입니다. - 이론 보안 HTTP