Stored XSS
XSS에 사용되는 악성 스크립트가 서버에 저장되고
서버의 응답에 담겨오는 XSS
[ Low ]

Stored XSS 탭에 들어오면 방명록을 작성할 수 있는 탭을 확인할 수 있다.

테스트로 방명록을 남겨보았다. Name과 Message 모두 입력한 test가 입력되었다.

Message 입력 칸에 클라이언트에서 실행될 수 있는 스크립트를 입력하였다. (쿠키 정보를 출력하는 스크립트)

작성한 스크립트가 실행되어 현재 웹 브라우저에 저장된 쿠키가 출력되는 모습을 볼 수 있다. 현재 쿠키에는 PHP 세션 ID와
DVWA의 보안 레벨의 값이 저장되어 있었다. 다만, PHP 세션 ID는 출력이 되지 않았고, 보안 레벨의 값은 출력이 되었다.
다른 분들의 실습 사진을 보면 세션 ID도 출력이 되던데 이상하긴 하다.

방명록이 삭제되지 않는 한, 페이지를 나갔다 들어오거나 새로고침을 했을 경우에도 스크립트가 실행되는 모습을 확인할 수 있다.

다음으로 Name 입력칸에도 스크립트를 작성하여 실행하려 했으나, 글자수 제한으로 인하여 스크립트를 모두 입력할 수 없었다.

Name 입력칸의 최대 글자 수는 10자로 제한되어 있는 모습을 확인할 수 있다.
글자수 제한을 풀기 위하여 maxlength 속성을 제거하였다.

이후 Message 입력칸에 작성한 것과 같이 Name 칸에 쿠키를 출력하는 스크립트를 삽입하였다.

방명록을 작성한 뒤, 쿠키의 값이 출력되는 모습을 확인할 수 있다.
[ Medium ]

난이도를 Medium으로 변경한 뒤 Stored XSS를 실습해보겠다.

Low 레벨에서 사용한 스크립트 구문을 그대로 입력해보았다.

분명 스크립트 구문을 입력하였으나, Message는 "alert(document.cookie)" 만 남아있는 모습을 확인할 수 있다.

message input 부분에서, strip_tags 함수와, htmlspecialchars 함수를 확인할 수 있다.
strip_tags 함수는 넘겨받은 문자열에서 HTML 태그가 존재하는 경우, 삭제시킨다.
htmlspecialchars 함수는 문자열에서 특정한 특수 문자들을 HTML 엔티티로 변환시킨다.
이와 같은 함수들 때문에, Message 입력칸을 이용한 XSS는 불가능하다.다만, name을 입력하는 칸에는 str_replace() 함수만을 사용하여 문자열을 필터링하기 때문에 방법이 존재한다.
'<script>' 문자열만을 공백으로 치환하기 때문에, '<SCRIPT>'처럼 대문자로 적거나, 대소문자를 섞거나,'<scr<script>ipt>' 와 같이 구문을 겹쳐 사용할 경우 필터링을 우회할 수 있다. 대문자로 적거나 섞는 것이 가능한 이유는 HTML은 대소문자를 구분하지 않기 때문이다.

Name 칸에 글자수 입력 제한이 걸려있어 개발자 모드(F12)에서 코드를 수정한 뒤, <script> 구문을 겹쳐 스크립트를
작성하여 방명록을 등록한 결과, 정상적으로 작동하는 모습을 확인할 수 있다.

물론, <script> 태그 말고도 img, svg, a, scr 등 다양한 HTML 태그를 사용하여 XSS 를 할 수 있다.
때문에 img 태그를 사용하여 XSS 를 수행한 결과, 정상적으로 작동하였다.

Stored XSS 이기 때문에, 새로고침을 한 경우에도 스크립트가 작동하는 모습을 확인할 수 있다.
[ High ]
< 이후 실습 예정 >
'Web-Hacking > DVWA' 카테고리의 다른 글
| [DVWA 실습] SQL Injection (0) | 2024.01.28 |
|---|---|
| [DVWA 실습] CSRF (0) | 2024.01.21 |
| [DVWA 실습] DOM based XSS (0) | 2024.01.14 |
| [DVWA 실습] Reflected XSS (0) | 2024.01.12 |