Reflected XSS의 경우 URL을 전송하고 사용자가 클릭하여 접속해야지 XSS가 수행됩니다
하지만 Stored XSS는 지속적이고 페이지나 데이터베이스에 저장되어 인젝션 코드는 페이지가 로드될 때 마다 수행됩니다
이를 통해 브라우저에 자바스크립트 코드를 삽입할 수 있으며 코드는 페이지를 방문하는 모든 사람들에게 전송되며 실행됩니다
먼저 DVWA에서 보안 수준을 낮음으로 설정한 뒤 실습을 진행했습니다
해당 페이지는 게스트 북으로 방명록에 XSS를 주입하면 페이지를 로드하는 모든 사용자들에게 해당 스크립트 코드가 실행됩니다
먼저 테스트를 위해 Name에 이름을 작성하고 메시지에 스크립트 코드를 작성했습니다
코드로 일반적인 자바스크립트 코드를 작성했습니다
<script>alert("XSS")</script>
XSS 경고창이 결과로 보여지는것을 확인했습니다
Stored XSS는 웹 페이지나 데이터베이스에 저장되므로 다른 사용자가 해당 페이지에 접근하면 똑같이 경고 메시지 창이 보여질 것입니다
다른 가상머신에서 같은 페이지에 접속해보았습니다
마찬가지로 XSS 경고창이 발생했습니다
이제 보안 수준을 중간 단계로 이동했습니다
동일한 스크립트 구문을 넣어봤습니다
<script>alert("XSS")</script>
해당하는 구문은 Name Form에 넣으려고 시도했지만 해당 입력 폼의 최대 길이가 10이므로 이를 수정했습니다
수정을 위해 Inspect 기능을 활용하여 이동 후 maxlength의 값을 변경했습니다
이후 다시 Name 입력 폼에 기본 스크립트 구문을 입력했습니다
Name을 확인하면 입력했던 스크립트가 사라졌습니다
이를 통해 스크립트라는 문장을 필터링하고 있다고 예상할 수 있습니다
그러므로 이전에 사용했던 방식과 동일하게 대문자를 사용하여 우회할 수 있습니다
그래서 fromCharCode() 함수를 이용할 수 있습니다
String.fromCharCode()
유니코드 확인을 위해 charcode 계산기를 활용할 수 있습니다
예를들어 XSS를 유니코드로 변경 시 88, 83, 83, 10 가 됩니다
익스플로잇 구문
<SCRIpT>alert(String.fromCharCode(88, 83, 83, 10))</ScRIPT>
Medium 수준도 익스플로잇이 가능하게 됩니다