1. 문제
1) 문제 확인
url 파라미터에 담겨져 있는 /static/gadget.js 를 로딩했다는 문구가 보인다. 소스코드를 살펴보자
<!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>
JavaScript
복사
1.
includeGadget(getGadgetName()); => 요게 호출됨
요게 호출되는데 인자로 getGadgetName() 함수의 반환값을 가지고 들어간다. 저 함수는 #다음에 나오는 파라미터이다.
2.
function includeGadget(url)
요 함수는 다음처럼 동작한다
•
script 태그를 만들고 scriptEl 변수에 담는다.
•
들어온 인자인 url을 정규표현식으로 검사한다
' http or https : // '로 시작되면 해당 url을 load할수 없다고 setInnerText로 설정한다
⇒ 요 필터는 간단하게 Https 요렇게 하면 우회 할수 있겠다.
3.
scriptEl.src에 url에 담긴 값을 넣는다. script.src의 의미는
정의 및 특징
<script> 태그의 src 속성은 외부 스크립트 파일의 URL을 명시합니다.
웹 사이트의 여러 페이지에서 동일한 자바스크립트를 실행할 때 매 페이지마다 동일한 스크립트 코드를 반복하여 추가하는 것보다는 해당 코드를 하나의 외부 자바스크립트 파일(확장자가 .js인 파일)로 생성한 후 <script> 요소의 src 속성을 사용하여 참조하는 것이 좋습니다. 단, 이때 외부 스크립트파일의 내용에는 <script> 요소가 포함되어서는 안 됩니다.
JavaScript
복사
즉, 외부 js파일의 url을 명시한다.
4.
script.onload, onerror를 등록한다. 정상적으로 로드되었을때와, 로드에 실패했을때의 로그 출력을 위한 함수이다.
5.
마지막으로 document.head.appendChild를 이용해서 자식 페이지의 head 부분에 설정한 scriptEl을 삽입한다
2. 접근방법
분석결과. 해당 로직은 외부 url에 담겨져있는 js 코드를 불러시켜서 실행시킬수 있는것 같다. 처음엔 사용하는 라파에 웹서버 설치하고 안에 js코드 파일 넣고 할라고 했는데, 전에 ctf 풀다가 위와같이 외부에 파일올려서 어쩌구 하는 문제가있었다.
그때 내 블로그를 이용해서 이번에도 그냥 내 블로그에 alert(1) 담긴 js파일 넣고 해당 url을 인자로 주니까 바로 풀렸다.
3. 풀이
•
정규식 필터 우회를 위해 Https이렇게 썻당.
4. 몰랐던 개념
•
로직 분석.
•
script.src
•
script.onload
•
script.onerror