[normaltic 취업반 5기] 2023-12-20 9주차 과제 : 2번 과제 XSS 1~6번 문제

2023. 12. 27. 07:32normaltic 취업반 5기/과제

 

과제 목표

 

  • XSS 1~6번 문제에서 XSS 공격이 가능한 포인트 찾기

 

XSS 1~6번 문제 설명

 

  XSS 1~6번 문제는 똑같은 웹 페이지 구성으로 되어있어 XSS 공격이 가능한 포인트가 같다. XSS 1번 문제를 예로 들어 XSS 공격이 가능한 포인트를 소개한다.

 

1) signup.html => index.php, mypage.php 

 

 

  signup.html 웹 페이지는 회원가입을 하는 페이지이다. 이곳에서 ID를 "><script>alert(1)</script> 형태로 등록하면 index.php와 mypage.php 웹 페이지에서 스크립트가 작동한다. 그러면 각 웹 페이지에서 어떠한 원리로 이뤄지는지 Burp Suite와 함께 알아보자.

 

[1] index.php

 

 

  index.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 ID가 출력되며 이때 ID가 스크립트를 작동시키는 명령으로 이루어져 있으면 해당 페이지에서 XSS 공격이 가능하다. 위에 동그라미 부분은 ID가 <script>alert(1)</script> 형태로만 이루어져 있으면 작동하지만 아래 동그라미 부분은 태그를 탈출시켜야 하므로 ID가 "><script>alert(1)</script> 형태로 이루어져야 스크립트가 작동한다.

 

 

[2] mypage.php

 

 

   mypage.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 ID가 출력되며 이때 ID가 스크립트를 작동시키는 명령으로 이루어져 있으면 해당 페이지에서 XSS 공격이 가능하다. 해당 부분은 태그를 탈출시켜야 하므로 ID가 "><script>alert(1)</script> 형태로 이루어져야 스크립트가 작동한다.

 

 

2) notice_write.php => notice_list.php, mypage.php, notice_read.php, notice_update.php 

 

 

  notice_write.php 웹 페이지는 게시글을 작성하는 페이지다. '제목' 입력칸과 '내용' 입력칸에 내용을 입력하여 게시글로서 DB에 저장한다. notice_list.php 페이지는 DB에 저장된 게시글들의 제목 부분만 출력되어 나열된다. notice_read.php 페이지는 notice_list.php 페이지에 나열된 게시글 중 하나의 제목을 클릭하게 되면 해당 게시글의 제목과 내용 부분이 출력된다. notice_update.php 페이지는 notice_read.php 페이지에서 수정 버튼을 클릭하게 되면 해당 게시글의 제목과 내용 부분을 수정할 수 있다. 해당 페이지에서도 게시글의 제목과 내용 부분이 출력된다. 스크립트 작동을 위해서 제목과 내용에 <script>alert(1)</script>를 입력한다.

 

[1] notice_list.php

 

 

  notice_list.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 게시글의 제목을 출력하게 된다. 해당 웹 페이지에서는 '<' => '&lt', '>' => '&gt'로 필터링되어 출력됨으로 XSS 공격 가능성은 있지만 공격은 유효하지 않다.

 

 

  그러나 게시글을 조회하기 위해 해당 페이지에서 돋보기 버튼을 클릭하게 되면 꺽쇠 특수문자가 필터링되지 않고 그대로 출력되어 스크립트가 작동하게 된다.

 

[2-1] notice_read.php : 제목

 

 

  notice_read.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 게시글의 제목이 출력되며 이때 제목이 스크립트를 작동시키는 명령으로 이루어져 있으면 해당 페이지에서 XSS 공격이 가능하다.

 

 

[2-2] notice_read.php : 내용

 

 

  notice_read.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 게시글의 내용이 출력되며 이때 내용이 스크립트를 작동시키는 명령으로 이루어져 있으면 해당 페이지에서 XSS 공격이 가능하다. 해당 웹 페이지에서는 '<' => '&lt', '>' => '&gt'로 필터링 되어 출력됨으로 XSS 공격 가능성은 있지만 공격은 유효하지 않다.

 

[3-1] notice_update.php : 제목

 

 

  notice_update.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 게시글의 제목이 출력되며 이때 제목이 스크립트를 작동시키는 명령으로 이루어져 있으면 해당 페이지에서 XSS 공격이 가능하다. 해당 웹 페이지에서는 제목이 출력되는 부분이 태그로 감싸져 있기 때문에 태그를 강제로 탈출시키는 형태인 "><script>alert(1)</script> 입력하면 스크립트가 작동한다.

 

 

[3-2] notice_update.php : 내용

 

 

  notice_update.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 게시글의 내용이 출력되며 이때 내용이 스크립트를 작동시키는 명령으로 이루어져 있으면 해당 페이지에서 XSS 공격이 가능하다. 해당 웹 페이지에서는 내용이 출력되는 부분이 <textarea> 태그로 감싸져 있기 때문에 </textarea><script>alert(1)</script> 형태로 입력하여 <textarea> 태그를 강제로 탈출시키면 스크립트가 작동한다.

 

 

XSS 공격 포인트 정리

 

  XSS 1~6번 문제에서 가능한 XSS 공격 포인트는 다음과 같이 정리 가능하다.

 

  • signup.html : 해당 페이지에서 ID를 스크립트를 작동시킬 수 있는 형태로 입력하여 index.php, mypage.php 페이지에서 스크립트를 작동시킬 수 있다.
  • notice_write.php : 해당 페이지에서 제목 또는 내용을 스크립트를 작동시킬 수 있는 형태로 입력하여 notice_list.php, notice_read.php, notice_update.php 페이지에서 스크립트를 작동시킬 수 있다.

 

  정리된 내용을 가지고 표를 작성하여 각 문제에 해당하는 문항을 체크한다. XSS 1번 문제를 예시로 작성된 표는 다음과 같다.

 

signup.html 웹 페이지에서 파생된 XSS 공격 가능 포인트 표
notice_write.php 웹 페이지에서 파생된 XSS 공격 가능 포인트 표

 

XSS 2번 문제

 

 

XSS 3번 문제

 

 

- mypage.php -

 

user=vanhart 인 경우 출력 결과
user=vanharttest 인 경우 출력 결과

 

  XSS 3번 문제 mypage.php 페이지에서는 첫 번째 칸에 출력되는 값은 user 파라미터의 데이터에 따라 달라진다. 그래서 이번에는 user 파라미터 값을 입력하는 곳에 "><script>alert(1)</script> 형태로 입력하게 되면 스크립트가 작동한다. 또한 해당 웹 페이지에서는 GET 메소드로 데이터를 전달하기 때문에 Reflected XSS 공격이 가능하다.

 

XSS 4번 문제

 

 

- notice_read.php -

 

  XSS 4번 문제 notice_read.php 페이지에서는 게시글의 제목과 내용을 출력할 때 'script'와 'alert' 문자열을 필터링시킨다. 다행히도 꺽쇠를 필터링하지 않았으므로 다른 방법으로 우회하여 공격이 가능하다.

 

 

  먼저 태그의 이름은 대소문자를 구분하지 않는다. 그렇기 때문에 script 문자열 중 문자 하나를 대문자로 변경하여 필터링되지 않도록 한다.

 

 

  다음으로 'alert' 문자열을 필터링하므로 'alert' 대신 사용할 함수로 'confirm'을 선택하여 입력해 주면 스크립트를 작동시킬 수 있다.

 

 

XSS 5번 문제

 

 

XSS 6번 문제