[XSS Game 풀이] (3) That sinking feeling...
1. 제가 포스팅하는 내용은 막 가져다 쓰셔도 됩니다. 근데 출처만 적어주세요
2. 틀리거나 정정이 필요한 내용은 막 적어주셔도 됩니다.
3. 단순 공부와 정보 제공을 위한 포스팅이므로 아래 내용을 활용한 그 어떤 불법적인 행동도 저는 책임 못지니 알아서들 하시면 됩니다.
3번 문제 풀이를 포스팅 하겠습니당. 1번, 2번 문제와 달리 여기는 URL외에 따로 입력하라고 냅둔 창이 하나도 없습니다.
이번 문제에서는 아래 Target Code(toggle)을 통해 해당 페이지의 코드를 살펴보도록 하겠습니다.
index.html 페이지의 상단을 보시면 <script>태그 이후에 해당 페이지의 이미지를 넘기는 JavaScript 소스가 있는데요 자세히 살펴봅시다.
function chooseTab(num) 함수를 보시면 입력받는 이미지 번호에 따라 html에 뿌려지는 이미지 파일명을 변경하는 듯 해 보입니다. num 변수에 1을 받으면 1번 이미지, 2를 받으면 2번 이미지 등등..
HTML쪽 코드를 살펴보니 chooseTab으로 클릭을 통해 각 이미지 번호가 넘어가는 기능을 하고 있습니다.
아마 서버 내에 이미지 파일명이 1, 2, 3으로 지정되어 있어 그냥 <img>태그 내에서 파일명만 JavaScript로 변경해서 HTML에 뿌려주는 듯 합니다 ex) <img src=server/1.jpg> 근데! 각 이미지별로 Url에 # 이후 이미지 숫자가 표기되네요! 아마 입력받은 이미지 번호가 Url에 뿌려져서 파이썬 등으로 파라미터값(?)을 주고받나 봅니다.
자, 그럼 Image 4라는 버튼은 없으니 Url에 임의로 4를 넣어볼까요?
보통 인터넷 하다가 이미지가 없다고 저런게 나오면 보통 짜증나는데 오늘은 재밌네요. 저 이미지 로딩 에러를 활용해서 우리의 친구 alert(1)을 띄어봅시다. 우선 좋든 싫든 우리의 희생자 페이지는 Url에 4를 적어주면 Image 1, Image 2 등과 마찬가지로 <img>태그를 생성하게 되어있습니다.
<img src='/static/level3/cloud" + num + ".jpg' />이 부분을 이용해봅시다. 먼저 이미지가 나오건 말건 어쩌건 우리랑 크게 상관 없으니까 태그만 좀 실행되도록 구색을 맞춰봅시다.
Url에 '+onError=alert(1)+ 을 입력하게 되면 chooseTab()함수 내에 " + num + " 부분을 대체하게 됩니다. 그러면 함수 실행 시 HTML 내에<img src='/static/level3/cloud' onError=alert(1) .jpg' />이라는 코드가 만들어집니다.(+는 url에서 입력 시 스페이스, 그니까 한칸 띄는 효과를 줍니다) 일단 onError 이벤트 핸들러 까지만 실행되면 우리의 목적이 달성되니까 그 이후에 .jpg는 잊어버립시다.
음.. 뭐가 문제일까요 F12버튼을 눌러 개발자 도구(크롬 기준)를 이용해 <img> 태그가 어떻게 생성되었나 확인해 봅시다.
Url상에서 띄어쓰기를 위해 적어준 +가 HTML에 코드에 그대로 들어갔네요;;;.. 왜지?!
그럼 그냥 빼고 다시 실행해 보도록 하겠습니다.
음.. <img>태그 뒷부분에 .jpg와 살아서 구천을 떠도는 "때문에 alert()함수가 실행이 안되는게 아닌가 싶네요.. 아 그리고 onError="alert(1)"식으로 이벤트 핸들러 뒤에 "로 alert(1)을 감싸줘야 하는데 깜빡했네요 <img>태그의 구색을 다 맞춰줍시다.(까다롭긴...) <img src='/static/level3/cloud" + num + ".jpg'/> URL로 입력할 코드를 'onError="alert(1)"alt='로 수정해보겠습니다.(alt 속성은 이미지를 불러오기에 실패한 경우 나타낼 문구를 적을 수 있습니다.)
위와 같이 적어보고 다시 실행해보도록 하겠습니다.
다음 문제로 넘어가겠습니다.
-요약-
1. 오타를 주의합시다.
2. 개발자 도구를 통해 어떻게 생겼나 보면서 풀면 더 재밌습니다
3. *개발자 도구에 alert(1)을 적어서 그냥 넘기면 모든 문제 풀이가 가능하지만 그러면 진짜 재미없습니다 a.k.a 치트키..
4. alt태그를 이용해서 이미지가 로드되지 않았을 경우의 문구를 지정할 수 있다.
5. Url을 통한 XSS도 충분히 가능.
6. 정답 : 'onError="alert(1)"alt='
7. 마찬가지로 답은 6. 하나만 있는게 아닙니다. 본인만의 답을 찾아보는 방법도 매우 매우 매우 좋습니다.