| XSS
임의의 스크립트를 삽입하여 이용자의 브라우저에서 실행시키는 공격. (클라이언트 측)
*** XSS는 웹 브라우저에서 실행되는 코드에 의해 발생하기 때문에 클라이언트 측 공격입니다.
| XSS - 종류
- Stored XSS
- Reflected XSS
- DOM-based XSS
| XSS 취약점이 발생하는 곳.
❗데이터가 저장되고, 출력되는 곳
ex) 게시판 글 작성, 회원가입 등등
즉, 정리하면 사용자가 작성한 데이터가 화면에 응답이 되고 있다면 XSS 취약점을 확인해 봐야 합니다. 이번 글에선 XSS 종류 중 Stored XSS에 해당하는 내용들을 알아가 보면서 XSS가 무엇인지 알아보겠습니다.
▶️Stored XSS
서버에 스크립트를 저장한 뒤, 스크립트가 포함된 페이지 요청 시 실행되는 공격
🔓Stored XSS 찾아보기
- 작성한 데이터가 화면에 응답 되는지 확인.
- 특수문자 체크
- Javascript
Stored XSS를 찾는 방법을 순서대로 정리했습니다. 해당 과정을 통해 XSS 취약점을 찾을 수 있는데 간단한 실습을 통해
Stored XSS 취약점을 어떻게 찾고 무엇인지에 대해서 알아보겠습니다.
1️⃣ 작성한 데이터가 화면에 응답 되는지 확인.
현재 어떤 웹 사이트에서 글을 작성할 수 있는 기능이 있는 상황입니다.


게시판에서 글을 작성할 때 위와 같이 글을 작성하게 될 텐데 이제 글을 생성하고 해당 게시물에 접속을 하여 사용자가 입력한 데이터가 화면에 출력되는지 확인합니다.


사용자가 작성한 게시물에 접속을 해보면 입력했던 데이터가 화면에 출력되고 있는 것을 볼 수 있습니다. 이런 경우에 이제 XSS 취약점을 확인해 봐야 합니다. 1번 단계를 끝냈으니 2번 단계로 넘어가겠습니다.
2️⃣ 특수문자 체크
2번 과정에서는 특수문자 4개 <, ', ", >를 삽입하여 해당 특수문자가 어떠한 필터링이 없이 그대로 사용되고 있는지 확인을 하게 됩니다. 각 특수문자들은 HTML 태그 기능을 수행할 수 있도록 해주는 특수문자이며 스크립트 삽입할 때 HTML 태그 기능을 사용해야 하기 때문에 먼저 체크를 하는 것입니다.

특수 문자를 삽입한 글을 생성한 후에 게시물에 접속을 해보면 다음과 같습니다.

특수문자가 화면에 출력되고 있지만 이 과정에서는 소스코드를 확인하여 어떠한 필터링이 작용되고 있는지 아닌지 확인을 해야 합니다. (저는 Burp Suite를 사용해서 확인했습니다.)

빨간색 박스 부분을 보면 특수문자 <, ', ", >가 그대로 사용되고 있는 것을 알 수 있습니다. 앞서 말한 것처럼 해당 특수문자들을 가지고 HTML 태그 기능을 수행할 수 있다고 말했었습니다. 이렇게 2번 과정은 특수문자가 그대로 사용되고 있는지를 체크하게 됩니다.
🔎 비교를 위해 만약 어떠한 필터링이 작용해서 특수문자를 사용할 수 없는 상황도 확인해 보겠습니다.

바로 위 사진을 특수 문자들이 HTML Entity로 치환이 된 상황입니다. HTML Entity는 XSS 대응 방안 중 하나입니다. 해당 사진은 삽입했던 특수문자가 어떠한 대응 방안 때문에 다른 문자들로 치환이 되었고 이로 인해 태그 기능을 사용할 수 없단 것을 보여드리기 위해서입니다. 바로 아래 표는 각 특수기호가 어떠한 HTML Entity로 치환되었는지 간단하게 적었습니다.
💡참고
| < | < |
| > | > |
| ' | ' or ' |
| " | " |
이제 다시 돌아가서, 특수문자 <, ', ", >이 그대로 사용되었을 때 이어서 3번 과정을 진행합니다.
3️⃣ Javascript
특수문자가 그대로 사용되고 있다는 것은 HTML 코드를 삽입할 수 있다는 것을 의미합니다. 따라서 이때 스크립트를 삽입합니다. 여기서 주의해야 할 점은 POC 코드를 사용해야 한다는 것입니다.
POC 코드를 사용하는 이유는 해당 취약점을 통해 문제가 발생할 수 있다는 것을 보여주기 위함입니다. 간단하게 말하면 일부러 악의적인 스크립트를 사용해서 확인을 하면 안 되기 때문에 POC 코드를 사용하게 됩니다. (POC 코드는 모의해킹을 할 때 취약점을 이용해서 공격이 가능하다는 것을 보여주는 코드입니다.)
다음과 같이 스크립트를 삽입합니다.
<script>alert(1)</script> // 해당 스크립트는 알림창을 띄웁니다.

이처럼 스크립트를 삽입하여 글을 생성하고 해당 페이지에 접속해 보겠습니다.

스크립트가 삽입된 페이지에 접속했더니 삽입했던 스크립트가 실행되는 것을 볼 수 있습니다. 스크립트 삽입이 가능했고 실행까지 정상적으로 이뤄졌기 때문에 XSS 취약점이 존재한다고 판단할 수 있으며 해당 XSS는 저장되어 있던 스크립트가 실행된 케이스이므로 Stored XSS에 해당합니다.
지금까지 XSS 종류 중 Stored XSS에 대해서 알아봤습니다. 다른 글에서 Reflected XSS, DOM-based XSS에 대해서도 알아보고 대응 방안에 대해서도 설명하겠습니다.