Computer >> 컴퓨터 >  >> 프로그래밍 >> HTML

워드프레스 CSRF 공격 완벽 가이드: 취약점의 원리와 예방 방법

CSRF(사이트 간 요청 위조, Cross-Site Request Forgery 또는 XSRF)는 워드프레스 웹사이트가 직면하는 가장 심각한 해킹 유형 중 하나입니다. 이 공격은 주로 사이트에 설치된 워드프레스 플러그인의 보안 취약점을 통해 발생합니다.

핵심은 해커가 웹사이트 사용자를 속여 악성 행위를 수행하게 만든다는 점입니다. CSRF 공격은 사이트 운영자와 사용자 양쪽 모두에게 치명적인 결과를 초래할 수 있으므로, 반드시 사전에 차단해야 합니다.

CSRF 공격에 성공한 해커는 웹사이트 전체를 장악하여 원하는 어떤 악성 활동이든 수행할 수 있습니다. 방문자를 다른 악성 사이트로 리디렉션하거나, 멀웨어를 다운로드하도록 속일 수도 있습니다. 나아가 사이트 운영자와 고객의 자금을 탈취하는 일까지 가능합니다.

문제는 여기서 끝나지 않습니다. 상황은 눈덩이처럼 불어나 구글이 사이트를 블랙리스트에 등재하고, 호스팅 업체가 계정을 정지시키는 결과로 이어질 수 있습니다.

이미 CSRF 공격을 당했거나 미리 예방하고 싶은 분들을 위해 이 글에서는 CSRF 공격의 대응 방법과 예방 방법을 자세히 안내합니다.

요약(TL;DR): 웹사이트가 해킹당했다면 즉시 복구해야 합니다. CSRF 공격 제거 플러그인을 설치해 사이트 전체를 심층 스캔하고 즉시 정화하는 것을 권장합니다. 사이트가 깨끗해진 후에는 해당 플러그인이 향후 해킹 시도로부터 사이트를 보호해 줍니다.

목차

  • CSRF 공격(사이트 간 요청 위조)이란 무엇인가?
  • 워드프레스 사이트에서 CSRF 취약점은 어떻게 발생하는가?
  • 워드프레스 웹사이트에서 CSRF 공격을 예방하는 방법
  • 플러그인 개발자를 위한 CSRF 예방 조치
  • 워드프레스 사이트 소유자를 위한 CSRF 예방 조치

CSRF 공격(사이트 간 요청 위조)이란?

워드프레스 CSRF 공격은 다소 복잡하게 느껴질 수 있지만, 최대한 쉽게 풀어서 설명해 드리겠습니다.

회원제, 로그인 기능이 있는 웹사이트에서는 각 사용자가 자신의 계정에 대한 권한 있는 접근권을 갖습니다. 아마존 계정, 지메일 계정, 인터넷 뱅킹 계정 등이 좋은 예입니다.

이런 웹사이트는 사용자 인증을 위해 로그인 정보(아이디와 비밀번호)를 부여합니다. 사용자가 로그인할 때 아이디와 비밀번호를 입력해 본인임을 확인하는 것이죠. 이렇게 하면 웹사이트는 사용자와 그 브라우저 간에 신뢰 관계를 형성하게 됩니다.

CSRF 공격은 바로 이렇게 인증된 사용자를 속여 악성 행위를 수행하게 만드는 것입니다.

1. '크로스 사이트(Cross Site)'의 의미

예시를 통해 설명해 보겠습니다. 사용자가 A 사이트에 로그인한 상태로 브라우저 탭 하나에 열어두었다고 가정합니다. (A 사이트에 로그인되어 있다는 점이 중요합니다.)

이제 해커가 사용자의 이메일 주소를 알고 있다고 가정해 보겠습니다. 해커는 "몇 시간 후에 종료되는 놀라운 할인"이라는 내용의 이메일을 사용자에게 보냅니다. 사용자는 속아 이메일 속 링크를 클릭하고, 해커가 운영하는 B 사이트가 열립니다.

B 사이트에서 할인 혜택을 받으려면 양식을 작성하거나 이메일 주소를 입력하라고 요구받습니다. 사용자는 평범해 보이는 '제출' 버튼을 클릭합니다.

그러나 B 사이트 '제출' 버튼의 이면에는 해커가 심어둔 악성 스크립트가 숨어 있습니다.

다른 탭에 열려 있던 A 사이트를 기억하시죠? 이 스크립트는 A 사이트로 요청을 보내 악성 행위를 실행합니다. 바로 이 때문에 '크로스 사이트(cross-site)'라는 이름이 붙었습니다.

2. '요청(Request)'의 의미

해커의 스크립트는 B 사이트에서 A 사이트로 사용자 명의로 요청을 전송합니다. 이 원치 않는 악성 행위는 관리자 비밀번호 변경부터 은행 계좌 자금 이체까지 무엇이든 될 수 있습니다!

3. '위조(Forgery)'의 의미

마지막으로, 해커가 사용자의 인증 정보를 이용해 A 사이트를 속였기 때문에 '위조'라고 합니다. 이것이 바로 '사이트 간 요청 위조(Cross-site Request Forgery)'라는 이름의 유래입니다.

요약하자면, 해커는 A 사이트가 자신의 악성 명령을 인증된 사용자가 보낸 정상적인 요청으로 착각하도록 만드는 것입니다. 그렇다면 B 사이트가 어떻게 A 사이트에 요청을 보낼 수 있을까요? 다음 섹션에서 더 자세히 살펴보겠습니다.

참고: 이 섹션은 다소 기술적이며 숙련된 워드프레스 사용자나 개발자를 위한 내용입니다. 건너뛰고 바로 CSRF 예방법을 알고 싶다면 '워드프레스 사이트 소유자를 위한 CSRF 예방 조치'로 이동하세요.

워드프레스 사이트에서 CSRF 취약점은 어떻게 발생하는가?

취약점이 발생하는 과정을 이해하려면 먼저 사용자의 브라우저와 웹사이트가 어떻게 통신하는지 알아야 합니다.

1. 브라우저 요청의 이해

여기서는 두 가지 HTTP 요청 방식과 브라우저 쿠키에 대해 다룹니다.

i. HTTP GET 요청

웹사이트에 방문하면 브라우저는 해당 웹사이트 서버에 HTTP GET 요청을 보냅니다. 이 요청은 사이트 프론트엔드를 표시하는 데 필요한 데이터를 요청하는 것이며, 웹 서버는 요청된 데이터로 응답하고 브라우저에 웹사이트 내용이 로딩됩니다.

로그인하지 않은 사용자는 비인증 사용자입니다. 이 경우 GET 및 POST 요청이 전송되어도 쿠키가 사용되지 않으므로 보안 문제가 없습니다. 하지만 사용자가 로그인하면 인증된 사용자가 됩니다.

웹사이트는 쿠키를 통해 이 사용자를 식별하고 맞춤 서비스를 제공합니다. 쿠키는 특정 고유 ID에 해당하는 데이터만 생성하는 데 활용되며, 간편한 자동 로그인, 사용자 취향에 맞춘 광고 표시, 선호 제품 추천 등에 사용됩니다.

ii. CSRF 공격의 진행 과정

이제 CSRF 취약점이 발생하는 과정으로 돌아가 보겠습니다. 이 공격이 성공하려면 해커는 쿠키를 사용하는 인증된 사용자가 필요합니다.

예시를 통해 설명하겠습니다. 해커가 CSRF 취약점을 이용해 사용자 계정을 장악한 뒤, 이를 통해 여러분의 웹사이트를 해킹하는 과정을 보여 드리겠습니다.

→ 사용자 측에서 일어나는 일

  1. 사용자가 브라우저에서 targetwebsite.com에 로그인되어 있습니다.
  2. 해커는 이 사용자에게 "$50를 계좌로 입금받으려면 이 사이트를 방문해 가입하세요"라는 이메일을 보내 trickwebsite.com을 클릭하도록 유도합니다. (이런 링크는 다른 취약점을 이용해 targetwebsite.com 자체에 삽입될 수도 있습니다.)
  3. 피해자는 이 트릭 사이트가 정상적이라고 믿고 사기에 넘어갑니다. 여기서 자신의 정보로 양식을 작성하고 '제출'을 클릭합니다.
  4. trickwebsite.com의 '제출' 버튼 뒤에는 해커가 미리 심어둔 HTML 코드가 있습니다. 클릭하는 순간 이 코드는 사용자 명의로 targetwebsite.com(이미 로그인된 사이트)에 POST 요청을 전송합니다.

→ 웹사이트 측에서 일어나는 일

  1. targetwebsite.com은 쿠키를 통해 사용자(및 브라우저)를 검증하고 요청을 허용합니다. 인증된 사용자에게서 온 요청이므로 합법적으로 보이기 때문입니다.
  2. 그러나 전송된 POST 요청에는 웹사이트에 피해를 줄 수 있는 악성 스크립트가 담겨 있습니다. 예를 들어, 스크립트에는 현재 계정 비밀번호를 "newpassword123"으로 변경하라는 명령이 포함되어 있을 수 있습니다.
  3. targetwebsite.com이 요청을 수락하면 코드가 실행되어 비밀번호가 변경됩니다. 이제 해커는 새 비밀번호로 계정에 로그인해 완전한 통제권을 갖게 됩니다.
  4. 다음으로 해커는 웹사이트에 추가 공격을 감행할 수 있습니다. 이 사용자에게 부여된 권한 수준에 따라 targetwebsite.com의 데이터베이스에 접근해 사이트 기능 전반을 장악할 수도 있습니다.

이것은 해커가 CSRF 공격으로 할 수 있는 행위의 한 예시일 뿐입니다. 실제로는 훨씬 더 많은 시나리오가 존재합니다. 어느 쪽이든 이 해킹은 사용자와 웹사이트 모두에 피해를 줍니다.

워드프레스 웹사이트에서 CSRF 공격을 예방하는 방법

워드프레스 웹사이트가 CSRF 공격에 노출되는 이유는 플러그인에 이를 허용하는 취약점이 존재하기 때문입니다.

PluginVulnerabilities.com의 전체 공개 보고서에 따르면, 조사된 인기 플러그인 상당수가 웹사이트를 CSRF 공격에 취약하게 만드는 보안 문제를 안고 있었습니다. CSRF 해킹을 막으려면 플러그인 개발자가 특정 보안 조치를 구현해야 합니다. 여기서는 이러한 조치들을 간략히 살펴본 뒤, 워드프레스 사이트 소유자로서 CSRF 공격을 막기 위해 할 수 있는 일을 알려드리겠습니다.

  • 플러그인 개발자를 위한 CSRF 예방 조치
  • 워드프레스 사이트 소유자를 위한 CSRF 예방 조치

i. 플러그인 개발자를 위한 CSRF 예방 조치

플러그인 개발자라면 CSRF 공격 예방을 위해 다음과 같은 조치를 취할 수 있습니다.

1. 안티-CSRF 토큰(Anti-CSRF Token)

안티-CSRF 토큰은 특정 사용자의 쿠키 및 요청과 함께 전송되는 숨겨진 값입니다. 작동 방식은 다음과 같습니다.

  1. 웹 서버가 토큰을 생성하여 폼의 숨김 필드(hidden field)에 배치합니다.
  2. 사용자가 폼을 작성해 제출하면 토큰이 POST 요청에 함께 포함됩니다.
  3. 서버는 생성된 토큰과 사용자가 보낸 토큰을 비교합니다.

두 값이 일치하면 요청이 유효한 것으로 판단되고, 일치하지 않으면 무효로 처리됩니다. 이것이 CSRF 공격을 차단하는 원리입니다.

개발자는 플러그인을 제작하거나 업데이트할 때 이러한 토큰을 추가할 수 있습니다.

2. 논스(Nonce) 사용

안티-CSRF 토큰과 논스는 혼용되곤 하지만 서로 다른 개념입니다. 논스(nonce, number used once) 값은 요청마다 생성되는 일회용 비밀번호 같은 것입니다.

HTTP 요청이 제출되면 논스가 생성되어 요청을 검증합니다. 하지만 한 번 사용된 논스는 무효화되므로, 동일한 논스 값으로 폼을 다시 제출할 수 없습니다.

3. Same-Site 쿠키

CSRF 공격이 가능한 이유는 동일한 쿠키를 사용한 크로스 사이트 요청 때문입니다. Same-Site 쿠키란 쿠키가 생성된 동일한 웹사이트에서 요청이 발생한 경우에만 쿠키를 전송하도록 하는 방식입니다.

이 방법의 문제점은 크롬과 파이어폭스 등 일부 브라우저를 제외하면 모든 브라우저가 Same-Site 쿠키를 지원하지 않는다는 것입니다.

이 방식은 추가 방어 계층으로 활용할 수 있지만, 이것만으로 CSRF 공격을 예방해서는 안 됩니다.

이러한 예방 조치들의 세부 사항을 더 다루지 않는 이유는, 요즘 거의 모든 방식이 해커들에 의해 우회될 수 있기 때문입니다. 해커들은 날로 영특해지며 우리가 마련하는 방어책을 돌파하는 새로운 기법을 개발하고 있습니다.

이제 워드프레스 사이트 소유자로서 CSRF 공격으로부터 스스로를 보호하기 위해 취할 수 있는 능동적·대응적 조치를 알아보겠습니다.

ii. 워드프레스 사이트 소유자를 위한 CSRF 예방 조치

앞서 언급했듯이 플러그인 개발자는 자신의 애플리케이션이 안전하도록 조치를 취해야 합니다. 하지만 그렇지 않다면 어떻게 될까요? 어떤 플러그인이 안티-CSRF 조치를 구현했는지 어떻게 알 수 있을까요?

워드프레스는 단독으로 존재하는 경우가 드뭅니다. 플러그인은 웹사이트의 기능과 디자인에서 중요한 역할을 합니다. 워드프레스 사이트에 플러그인이 필요하다 해도, 이 플러그인들이 적절한 보안 조치를 취했다고 무조건 믿어도 될까요?

아니요! 플러그인 개발자가 조치를 취하지 않더라도 사이트 소유자는 경계를 늦추지 않고 자체 보안 대책을 마련해야 합니다.

CSRF 공격으로부터 자신을 보호하기 위해 할 수 있는 일은 다음과 같습니다.

1. 안티-CSRF 플러그인 사용

워드프레스 저장소에는 CSRF 공격 전용 플러그인이 많지 않습니다. 찾을 수 있는 두 가지 플러그인을 소개합니다.

(A) Comment Form CSRF Protection – 이 워드프레스 플러그인은 댓글 폼에 안티-CSRF 토큰을 추가합니다. 토큰은 추측이 사실상 불가능한 고유한 비밀 값을 가지며, 사용자가 폼을 제출하면 이 비밀 토큰이 함께 전송됩니다. 값이 일치하는 경우에만 폼 제출 요청이 수락됩니다.

(B) Same-site cookies – 이 플러그인은 크롬, 파이어폭스, IE, 엣지 등 지원 브라우저에서 작동합니다. HTTP 요청이 제출될 때 전송되는 쿠키가 동일 사이트에서 온 것임을 보장하여, 모든 크로스 사이트 요청을 차단하고 따라서 모든 CSRF 공격을 막습니다.

2. 올인원 워드프레스 보안 플러그인 설치

워드프레스 웹사이트에는 다양한 보안 플러그인이 있습니다. 이런 플러그인은 CSRF를 포함한 모든 종류의 해커로부터 사이트를 지켜줄 수 있습니다. 하지만 모든 보안 플러그인이 동일한 수준의 보호를 제공하는 것은 아닙니다.

게다가 CSRF 공격은 발견이 까다롭습니다. 해커가 사이트 운영자와 사용자 모두의 눈을 잘 속이기 때문에 쉽게 간과됩니다. 따라서 이렇게 위장된 멀웨어를 탐지할 수 있는 플러그인이 필요합니다.

보안 플러그인을 선택할 때 CSRF 공격으로부터 보호받으려면 다음 기능을 갖추었는지 확인해야 합니다.

  1. 웹사이트의 악성 스크립트를 정기적으로 스캔한다.
  2. 웹사이트의 모든 파일과 데이터베이스를 샅샅이 검사한다.
  3. 신종, 은닉형, 위장형을 포함해 모든 종류의 멀웨어를 탐지할 수 있다. (일부 플러그인은 이미 발견된 멀웨어만 검색한다.)
  4. 웹사이트에서 의심스러운 활동이 감지되면 즉시 알림을 보낸다.
  5. 독립된 대시보드를 제공해 해커가 관리자 계정을 잠가버린 상황에서도 웹사이트를 정화할 수 있다.

이런 보호 기능을 제공하는 플러그인이 MalCare입니다. 워드프레스 웹사이트에 설치하면 CSRF 공격을 제거할 수 있고, 해커가 해킹 과정 중 사이트에 심었을 수 있는 워드프레스 멀웨어까지 제거해 줍니다.

또한 능동형 방화벽이 악성 IP 주소와 악성 봇의 웹사이트 접근을 차단해 사이트를 보호합니다.

만약 해커가 악성 크로스 사이트 요청으로 사이트를 해킹하는 데 성공하더라도, 이 워드프레스 보안 플러그인이 즉시 알려주므로 같은 플러그인으로 즉각 대응할 수 있습니다.

3. 웹사이트 강화(Hardening)

워드프레스는 웹사이트 강화를 위한 특정 조치를 권장합니다. 이를 적용하면 해커가 침입하기가 극도로 어려워집니다. 몇 가지 조치를 간략히 소개하지만, 워드프레스 강화에 관한 상세 가이드를 꼭 읽어보길 권장합니다.

이 중 많은 항목이 다소 기술적이므로 상세 가이드를 참고하면 더 잘 이해할 수 있습니다. CSRF 공격을 예방하거나 피해를 줄이는 강화 조치는 다음과 같습니다.

a. 이중 인증(2FA) 사용

이중 인증을 적용하면 사용자 검증 계층이 하나 더 추가됩니다. 사용자는 로그인 정보를 입력한 후 두 번째 비밀번호를 입력해야 합니다. 이는 사용자의 등록된 이메일이나 휴대폰으로 발송되는 일회용 비밀번호(OTP)일 수도 있고, 구글 인증기(Google Authenticator) 같은 앱이 생성하는 인증 번호일 수도 있습니다.

b. 신뢰할 수 없는 폴더에서 PHP 실행 차단

CSRF 공격으로 해커가 웹사이트 파일에 접근하게 되면 PHP 함수를 실행해 악성 작업을 수행할 수 있습니다. (PHP 함수란 프로그램에 작성된 코드 블록입니다.) 불필요한 위치에서는 PHP 실행을 비활성화할 수 있습니다.

c. 파일 에디터 비활성화

해커가 워드프레스 관리자 계정에 접근하면 웹사이트 전체를 장악할 수 있습니다. 대시보드에서 플러그인이나 테마 아래의 '에디터(Editor)'에 접근해 자신의 스크립트를 편집·업로드하여 자신의 콘텐츠를 표시하거나, 사이트를 훼손하거나, 사용자에게 SEO 스팸을 노출시키는 등의 행위를 할 수 있습니다.

d. 보안 키(Security Keys) 변경

워드프레스 계정에 접속할 때마다 로그인 정보를 매번 입력하지 않아도 되는 것을 경험하셨을 겁니다. 지정된 필드에 이미 채워져 있기 때문입니다. 이 정보를 해커로부터 보호하기 위해 워드프레스는 보안 키를 사용해 데이터를 암호화·저장합니다. 해커가 CSRF 공격으로 사이트에 침입하면 이 정보에 접근할 수 있습니다. 이후 해커는 이를 다른 값으로 바꿔두고 원할 때마다 사이트 관리자 계정에 계속 로그인할 수 있습니다.

  • 이러한 강화 조치는 권장한 가이드의 설명대로 수동으로 적용할 수도 있고, MalCare를 사용해 몇 번의 클릭으로 구현할 수도 있습니다.

4. 사용하지 않는 테마와 플러그인 삭제

웹사이트에 설치된 플러그인과 테마가 많을수록 해커에게 악용될 기회가 많아집니다. 사용하지 않는 플러그인과 테마는 삭제하고 실제 사용하는 것만 유지하는 것이 가장 좋습니다.

이 외에도 HTTP를 HTTPS로 전환하고, 보안 플러그인을 설치하며, 로그인 페이지를 보호하는 등 추가 보안 조치를 취할 수 있습니다.

마무리 생각

CSRF 공격은 사용자와 웹사이트 양쪽 모두에 심각한 결과를 초래합니다.

해커가 HTTP 요청을 통해 스크립트 실행에 성공하면 웹사이트를 장악할 수 있습니다. 그 이후에는 어떤 일이 벌어질지 예측하기 어렵습니다. 해커는 웹사이트를 훼손해 자신의 선전물을 게시하거나 불법 제품이나 마약을 판매할 수도 있습니다. 또한 웹사이트 방문자를 자신들의 사이트로 리디렉션할 수도 있습니다.

리디렉션되는 사이트는 대개 성인 사이트, 불법 제품 판매 사이트, 방문자를 속여 멀웨어를 다운로드하게 만드는 사이트입니다.

  1. 사이트 소유자로서 이런 공격으로부터 안전을 확보하는 조치를 취해야 합니다. MalCare 같은 보안 플러그인을 워드프레스 사이트에 항상 활성화해 두면 올인원 보호를 받을 수 있습니다.
  2. 해커의 침입을 어렵게 만들기 위해 웹사이트 강화 조치를 구현하는 것을 권장합니다.
  3. 마지막으로 플러그인과 테마를 사용할 때 주의를 기울이세요. 워드프레스 공식 저장소 또는 ThemeForest, CodeCanyon 같은 마켓플레이스에서 신뢰할 수 있는 테마와 플러그인만 설치하세요.

워드프레스 웹사이트에 이러한 조치들을 구현하면 해커로부터 안전할 것이라 확신합니다!

MalCare로 지금 워드프레스 사이트를 보호하세요!