티스토리 뷰
두 번째 단계에서도 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 값을 확인해보면 우리가 작성한 글들이 하나의 배열로 이루어져 있는 걸 알 수 있다.
- 끝 -
'보안 > Wargame' 카테고리의 다른 글
XSS-Game - Level 5: Breaking protocol (Writeup/문제풀이) (0) | 2021.05.05 |
---|---|
XSS-Game - Level 4: Context matters (Writeup/문제풀이) (0) | 2021.05.05 |
XSS-Game - Level 3: That sinking feeling... (Writeup/문제풀이) (0) | 2021.05.04 |
XSS-Game - Level 1: Hello, world of XSS (Writeup/문제풀이) (0) | 2021.05.01 |
[Hackthebox] - Emdee five for life Writeup(문제풀이) (0) | 2021.04.29 |