Level 5 시작! 별다른 입력값 없이 Sign up 링크만 있다. Sign up 을 누르면 email 을 입력하는 signup.html 로 이동한다. Next 를 누르면 또 다른 페이지로 이동하고 url 를 보면 next 인자를 통해 어떤 값을 전달하는 것을 알 수 있다. 이메일에 아무 값이나 입력하고 Next 버튼을 누르면 위의 페이지가 뜨고 몇 초 뒤에 첫 페이지로 이동한다. 이메일로 입력한 값은 따로 출력되지 않고 있다. 소스코드를 보자. 이메일을 입력하는 signup.html 의 소스코드를 보면 Next 를 눌렀을 때 next 인자의 값을 가진 링크로 이동하는 것을 알 수 있다. confirm.html 의 소스코드를 보니 email 값은 전달되지 않고 있다. 때문에 url 에서 입력할 수 있는..
Level 4 시작! 입력창이 있고 Create timer 버튼을 누르게 되면 입력한 시간만큼 대기하다가 팝업창이 뜨게 된다. 위의 화면처럼 입력값인 3 이 출력되는 것을 볼 수 있다. 소스코드를 보자. 첫 번째 페이지에서 입력한 값은 timer 라는 name 으로 두 번째 페이지에 전달되고 있다. 두 번째 페이지의 소스코드를 보면 입력값인 timer 는 startTimer() 함수의 인자로 들어가는 것을 확인할 수 있다. onload 옵션에서 startTimer() 함수를 끝내고 alert() 를 수행하면 되지 않을까 생각하여 값을 입력해보았다. 입력값 : ');alert(1);(' 적용되는 onload 옵션 : onload="startTimer('');alert(1);('');" 성공!!
Level 3 시작! Image 버튼을 누르면 해당 번호의 이미지로 바뀌게 된다. 소스코드를 보며 어떻게 구성되었는지 보자. 각각의 버튼은 클릭 시 chooseTab() 함수로 값을 보낸다. 그리고 tabContent 라는 id 를 통해 이미지 출력을 처리하는 것 같다. chooseTab() 을 통해 전달된 num 를 통해 html 변수에 num.jpg 를 넣어주고 있다. 그리고 이 html 을 tabContent 를 통해 화면에 출력해준다. num 의 값을 통해 결과가 출력되는 것은 알았다. 그렇다면 num 라는 값에 어떻게 원하는 값을 넣어줄지를 찾아야 된다. chooseTab() 을 호출하는 곳을 찾아보자. self.location.hash.substr(1) 은 url 의 # 부분에 있는 값을 가져..
Level 2 시작! 입력창이 하나 보인다. 입력값이 어떻게 처리되는지 소스코드를 확인해보자. textarea 로 받은 입력값은 post-content 라는 id 값으로 전달되어 save() 함수의 인자로 들어간다. post-store.js 의 소스코드를 보니 save() 로 전달된 값은 getPosts() 를 통해 가져올 수 있다. 위와 같이 getPosts() 로 가져온 값은 태그 안에 들어가게 된다. 이제 값을 입력해보자. 태그를 입력했을 때, 위와 같이 필터링되어 출력되지 않고 있다. 태그로 XSS 를 시도해보자. 입력값 : 태그는 필터링하지 않았다. 때문에 onerror 를 통해 팝업창을 띄워 문제를 해결할 수 있었다. 성공!
Level 1 시작! 입력창이 하나 보인다. abcd 를 입력해보았다. 입력한 값인 abcd 가 페이지에 그대로 출력되고 있다. 그렇다면 XSS 공격 스크립트도 그대로 출력해주는지 확인해보자. 기본적인 공격 스크립트를 입력했을 때 팝업창을 띄우며 문제가 해결되었다. 별다른 필터링을 하고 있지 않고 있다. 성공!