2023. 12. 27. 07:32ㆍnormaltic 취업반 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에 저장된 게시글의 제목을 출력하게 된다. 해당 웹 페이지에서는 '<' => '<', '>' => '>'로 필터링되어 출력됨으로 XSS 공격 가능성은 있지만 공격은 유효하지 않다.
그러나 게시글을 조회하기 위해 해당 페이지에서 돋보기 버튼을 클릭하게 되면 꺽쇠 특수문자가 필터링되지 않고 그대로 출력되어 스크립트가 작동하게 된다.
[2-1] notice_read.php : 제목
notice_read.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 게시글의 제목이 출력되며 이때 제목이 스크립트를 작동시키는 명령으로 이루어져 있으면 해당 페이지에서 XSS 공격이 가능하다.
[2-2] notice_read.php : 내용
notice_read.php 웹 페이지 소스이며 빨간색 동그라미 부분에서 DB에 저장된 게시글의 내용이 출력되며 이때 내용이 스크립트를 작동시키는 명령으로 이루어져 있으면 해당 페이지에서 XSS 공격이 가능하다. 해당 웹 페이지에서는 '<' => '<', '>' => '>'로 필터링 되어 출력됨으로 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번 문제를 예시로 작성된 표는 다음과 같다.
XSS 2번 문제
XSS 3번 문제
- mypage.php -
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번 문제