CSRF(Cross Site Response Forgery)

By | 7월 3, 2009

[출처] CSRF(Cross Site Response Forgery)|작성자 센세이션

크로스-사이트 요청 위조 (CSRF) 공격은 원클릭 공격, 사이드 재킹 (sidejacking), 세션 라이딩 (session riding) 등으로도 알려져 있고, 약어로는 CSRF 또는 XSRF로 알려져 있습니다. 이 유형의 공격은 크로스-사이트 스크립팅 (XSS)와 유사한 점이 있지만, XSS의 경우에는 악성 스크립트를 웹사이트에 삽입할 필요가 있는 반면, CSRF 공격의 경우 사이트가 신뢰하는 사용자를 통해 공격자가 원하는 명령을 사이트로 전송하도록 하는 기법을 사용합니다. 공격이 사용자를 통해 이루어지기 때문에, 공격자의 IP는 추적 불가능한 특성이 있습니다.

구체적으로 어떤 식으로 공격이 진행되는지 예를 들어보겠습니다. CSRF 공격은 사용자가 로그인한 상태에서만 접속할 수 있는 웹 페이지나 스크립트를 대상으로 합니다. 공격자 A는 피해자 B가 접속하는 은행 사이트를 공격 대상으로 한 조작된 이미지 태그를 게시판에 남깁니다.

<img src="http://bank.example.com/withdraw?account=B&amount=1000000&for=A"/>

피해자 B가 은행 사이트에 접속하고 나서 아직 세션 정보가 남아있는 상태이고, 이 때 공격자 A가 게시판에 남겨놓은 글을 B가 읽게 되면, 해당 링크가 요청되면서 공격이 실행됩니다. 원래는 이미지를 불러오기 위해 지정된 이미지 링크를 GET 메소드로 요청하게 되는데, 피해자 B가 인증되어 있는 상태인 점을 이용하여 이렇게 우회 공격을 할 수 있게 된 것입니다. 특히 대부분의 게시판들이 자바스크립트는 막아놓지만, 이미지 포스팅은 막지 않는 것도 공격에 유리한 상황을 만들어 줍니다.

공격 조건을 다시 한 번 정리해보도록 하겠습니다.

  1. 공격자는 피해자가 로그인한 사이트의 취약점을 잘 알고 있어야 합니다.
  2. 사이트가 자동 로그인을 허용하고 있거나, 피해자가 현재 로그인한 상태여야 합니다.
  3. 사이트에서 특정 동작을 수행할 때 사용자 세션 외에 다른 확인 절차를 밟지 않습니다.

따라서 CSRF 공격을 막으려면 3번 조건을 차단하는게 가장 확실합니다. 인증용 Hidden 필드를 모든 폼에 박아넣고, 동작을 수행하기 전에 폼에 넣었던 Hidden 필드 값이 들어왔는지 확인하면 공격을 막을 수 있습니다.

메소드가 GET인지 POST인지 구분하는 방법도 있지만, 스크립트를 이용해서 POST를 보내는 방식으로 CSRF 공격을 시도할 가능성도 있으므로 확실히 안전한 방법이라고 할 수는 없습니다.

자바스크립트를 이용해서 POST를 하기 전에 강제로 인증 쿠키값을 얻어와서 삽입하고 이를 검증하는 방법도 있습니다. 여기서 별도의 인증 쿠키값은 신뢰할 수 있는 도메인의 요청으로만 읽는게 가능하고, 다른 도메인에서는 이 쿠키를 읽는 것이 불가능하므로 CSRF 공격을 방지할 수 있습니다.

레퍼러를 확인해서 신뢰할 수 있는 위치에서 온 요청인지 검증하는 방법도 있으나, 레퍼러를 생략하는 경우도 안전하지 않은 것으로 취급해야 하는데 브라우저나 프록시 서버에 따라 레퍼러를 생략하는 경우도 있으므로 그리 좋은 방법은 아닙니다. 게다가 플래시나 익스플로러의 취약점을 이용하여 레퍼러를 조작할 가능성도 있습니다.

지금까지 다룬 것들은 개발자 수준에서 조치할 수 있는 사항들이고, 사용자 측면에서는 다른 사이트에 접속하기 전에 로그아웃하는 방법이 있습니다. 세션이 끊어지면 2번 조건이 성립되지 않으므로 CSRF 공격에서 벗어날 수 있습니다.

최근에 발생했던 옥션의 1800만 명 개인 정보 유출 사고는 CSRF 공격을 당한 것으로 밝혀졌습니다. (원문은 黑客基地을 인용한 Dark Visitor을 참조했습니다.) 중국 해커는 직접 서버를 공격하는 대신, 옥션 운영진을 대상으로 악성 코드를 첨부한 메일을 대량으로 유포했습니다. 운영자가 메일을 확인한 순간 ID를 얻을 수 있었고, 해커는 이 ID를 이용하여 옥션 서버에 로그인할 수 있었다고 합니다. WASC는 이 사고를 CSRF로 분류했는데, "설명이 애매한 점이 있긴 하지만 세션 하이재킹으로 설명하는게 가장 잘 들어맞는다"고 밝혔습니다.

 
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments