Level 6 시작!
입력창은 따로 없고 # 를 통해 어떤 값을 받고 있는 것 같다.
# 값을 바꾸니 위와 같이 값이 그대로 출력되는 것을 확인했다. 소스코드를 보자.
44 번쨰 줄의 getGadgetName() 이라는 함수를 보면 # 을 통해 값을 반환해주는 것을 볼 수 있다. 그리고 나서 이 값을 includeGadget 의 인자로 넣어주고 있다.
18 번째 줄에서 scriptEI 라는 변수에 script 태그를 만들어준다.
21 번째 줄부터는 includeGadget() 이라는 함수를 보면 url 에 주소와 관련된 문자들을 필터링한다.
28 번째 줄이 이 문제의 핵심이다. scriptEI 의 src 로 # 로 받은 값을 넣어준다. 그 결과, 아래와 같은 스크립트 문이 만들어지게 된다.
<script src="url">
script 태그의 src 속성은 외부 스크립트 파일의 url 을 명시한다.
40 번째 줄을 보면 위에서 만들어진 스크립트 문을 head 에 추가하는 것을 볼 수 있다. 때문에 이 스크립트 문에서 alert 를 띄우면 문제가 해결될 것이다.
처음 생각한 방법은 alert 를 실행하는 js 파일을 src 로 입력하는 것이었다. 하지만 그러기 위해서는 서버를 이용해야 하기 때문에 다른 방법을 생각해보았다.
이전에 XSS 우회 페이로드를 찾아보다가 data uri scheme 이라는 개념을 알게되었다. data uri scheme 은 파일을 문서 내에 인라인으로 임베드하기 위해 사용한다. 이전에 보았던 페이로드는 아래와 같다.
<iframe/src="data:text/html,<svg onload=alert(1)>">
iframe 의 src 로 <svg> 태그가 작성된 html 문서를 사용한다는 의미이다.
이 개념을 이번 문제에 적용해보면 다음과 같다.
<script src="data:text/html,alert(1)"></script>
script 태그의 src 로 들어가기 때문에 굳이 alert 를 실행시키기 위한 태그가 필요하지 않다. 때문에 html 문서의 내용으로는 alert(1) 만 넣어줘도 된다.
성공!!
'WarGame > XSS game' 카테고리의 다른 글
XSS game - Level 5 (0) | 2020.07.27 |
---|---|
XSS game - Level 4 (0) | 2020.07.27 |
XSS game - Level 3 (0) | 2020.07.27 |
XSS game - Level 2 (0) | 2020.07.26 |
XSS game - Level 1 (0) | 2020.07.26 |