티스토리 뷰

728x90
반응형

출처 : http://xss-game.appspot.com/level2

두 번째 단계에서도 1단계와 동일하게 alert() 를 페이지 내에 삽입(inject)하면 되는 문제다. 그래서 1단계와 동일하게 input 내용에 아래와 같이 입력해보았다.

<script>alert(1)</script>

하지만 alert 는 발생하지 않았고, 내가 입력한 내용 또한 드러나지 않았다. 그래서 소스코드를 직접 확인해본다.

하지만 예상과는 다르게 script 는 어떠한 필터링 없이도 잘 들어갔으나 여전히 alert는 동작하지 않았다. 그리고 사실 여기에는 당연한 이유가 있었다. 조금 더 분석해본 결과, input에 글을 입력하여 "Share status" 버튼을 눌러 글을 작성하게 되면, 글은 서버에 올라가는 것이 아니라 Local Storage에 javascript를 이용하여 저장이 된다. 그리고 새로고침을 통해서 글을 불러오게 될 경우에는 javascript 에서 페이지를 불러오고 페이지가 모두 렌더링 된 이후에 글 내용을 불러와서 삽입하는 방식으로 구현되어 있다.

 

그렇기 때문에 script는 실행이 되지 않았던 것이고 이 때에는 페이지가 모두 렌더링 된 이후에도 script가 실행될 수 있는 환경을 만들어 alert를 띄우면 될 것이다.

 

가장 좋은 예가 HTML 태그의 attribute를 이용하는 것이다. 아래는 img 태그이다. 만약 src가 존재하지 않거나 잘못되었다면, onerror 속성의 내용이 실행된다. 그리고 이를 다시 input 란에 글로 작성하여 삽입해보자.

<img src="x" onerror="alert(1)">

위 이미지를 보면 알다시피, img 태그를 삽입하였고, x라는 src는 존재하지 않기에 깨진 이미지 아이콘이 나왔고, 방금 전 onerror 속성을 통해서 alert 함수가 실행됨을 알 수 있다. 이렇게 문제를 풀 수 있다.

 

추가로 Local Storage에 우리가 입력한 내용이 어떻게 저장되는 지 확인해보겠다. 개발자 도구에서 Application 탭에서 Local Storage 탭을 클릭하면, Key 와 Value 형태로 이루어져있는 걸 볼 수 있는데, posts 값을 확인해보면 우리가 작성한 글들이 하나의 배열로 이루어져 있는 걸 알 수 있다.

 

- 끝 -

728x90
반응형
댓글