[Mission]
[해결방법]
이번에 해결해야 할 문제 페이지다. 딱 봤을 때 페이지의 로고와 아래 문구외에는 별다른게 없어 보인다. 사용자의 입력이 들어갈 수 있는 부분은 URL창밖에는 없는 것 같다.
페이지의 동작을 확인하기 위해서 URL창에 이것 저것 입력해봤다.
URL에서 #뒤에 입력된 부분이 페이지 아랫부분 문구에 출력되고 있었다. 더 정확히 파악하기 위해 코드를 확인해봤다.
function includeGadget(url) {
var scriptEl = document.createElement('script');
// This will totally prevent us from loading evil URLs!
if (url.match(/^https?:\/\//)) {
setInnerText(document.getElementById("log"),
"Sorry, cannot load a URL containing \"http\".");
return;
}
// Load this awesome gadget
scriptEl.src = url;
// Show log messages
scriptEl.onload = function() {
setInnerText(document.getElementById("log"),
"Loaded gadget from " + url);
}
scriptEl.onerror = function() {
setInnerText(document.getElementById("log"),
"Couldn't load gadget from " + url);
}
document.head.appendChild(scriptEl);
}
// Take the value after # and use it as the gadget filename.
function getGadgetName() {
return window.location.hash.substr(1) || "/static/gadget.js";
}
includeGadget(getGadgetName());
// Extra code so that we can communicate with the parent page
window.addEventListener("message", function(event){
if (event.source == parent) {
includeGadget(getGadgetName());
}
}, false);
아래쪽에서 // Take the value after # and use it as the gadget filename. 이 주석부분이 #뒤의 내용을 분리해주는 것 같다. 그 후 getGadgetName()의 값이 includeGadget()의 인자로 사용된다.
includeGadget() 함수를 잘 살펴보면 scriptEl 변수에 script 태그가 삽입됐고, src 속성으로 url이 사용된다. 즉 #뒤에 입력된 내용이 script 태그의 src로 사용되는 것이다.
스크립트 태그의 src 속성은 외부 스크립트 파일의 url을 명시하는데 아무래도 #뒷부분의 사용자 입력으로 외부 스크립트 파일을 실행할 수 있는 것 같다. 흠... 여기서 어떻게 풀어가야 할 지 감이 잡히지 않아서 hint를 확인해봤다.
힌트 4가지 중 마지막 힌트에 google.com/jsapi?callback=foo라는 링크가 있었다. 해당 링크에 들어가봤다.
들어가봤더니 방대한 양의 코드들이 적혀 있었다... 여기서 어떤 내용을 활용하면 좋을지 몰라 구글링했다. (구글링 쵴오...)
찾아봤더니 페이지 맨 아래 foo();라는 함수가 있고, 이 함수의 이름은 URL파라미터인 callback의 값에 따라 바뀐다고 한다. 이 링크를 이용해서 alert();을 실행시키는 것 같은데.. 애석하게도 필자는 해당 함수를 찾을 수 없었다. (ctrl+f로 foo를 검색해봤지만 아무것도 안 나옴)
서버에 스크립트 파일을 올려서 해결하는 방법 같은데 정확한 방법을 몰라 결국 다른 방법을 찾기로 했다.
새로 찾은 방법은 바로 Data URL Scheme 방법이다. 외부에 있는 데이터를 URL형태로 표현을 하는 것으로 파일을 문서 내에 인라인으로 임베드하기 위해 사용한다. 사용방법은 다음과 같다.
data:[datatype], [data]
이 방법을 이용해서 #뒤에 들어갈 내용을 작성해봤다. data:text/javascript, alert();
[결과]
해당 URL로 실행했더니 alert 함수가 정상적으로 실행됐다.
이로써 모든 XSS game을 해결했다!
'Study > Web Hacking' 카테고리의 다른 글
SQL Injection (0) | 2021.03.26 |
---|---|
[natas] Level 0 ~ Level 1 -> Level 2 (0) | 2021.03.26 |
[WEB]: XSS game 05 (0) | 2021.02.08 |
[WEB]: XSS game 04 (0) | 2021.02.01 |
[WEB]: XSS game 03 (0) | 2021.01.27 |