문제 서버에 접속하면 위와 같이 Password가 출력되지만 빨라서 읽기가 힘들고 일정시간이 지나면 ?로 표시됩니다.
<html><head>
<title>Challenge 54</title>
</head>
<body>
<h1><b>Password is <font id="aview">?</font></b></h1>
<script>
function run(){
if(window.ActiveXObject){ // ActiveXObject를 지원하는 브라우저라면 오브젝트를 리턴 그렇지 않으면 null 반환
try {
return new ActiveXObject('Msxml2.XMLHTTP'); // MS(마이크로소프트) xml 코어 서비스를 사용하겠다.
} catch (e) {
try {
return new ActiveXObject('Microsoft.XMLHTTP'); // 위 방법이 실패하면 다른 방법으로 시도
} catch (e) {
return null;
}
}
}else if(window.XMLHttpRequest){ // 위에서 브라우저가 지원안하더라도 다른 방법으로 XHR 객체를 생성한다.
return new XMLHttpRequest(); // XHR 객체 반환
}else{
return null;
}
}
x=run();
function answer(i)
{
x.open('GET','?m='+i,false); // url ?m={숫자}에 요청을 합니다. false는 아래 send 함수에서 서버로부터 응답이 올 때까지 기다림을 의미한다.
x.send(null);
aview.innerHTML=x.responseText; // x의 응답 메시지를 aview에 저장한다.
i++;
if(x.responseText) setTimeout("answer("+i+")",20); // 제귀적으로 answer 자신을 호출
if(x.responseText=="") aview.innerHTML="?";
}
setTimeout("answer(0)",1000);
</script>
</body></html>
XHR 객체는 서버와 상호작용하기 위해서 사용됩니다. 전체 페이지의 새로고침 없이도 URL로부터 데이터를 받아올 수 있습니다. 이는 웹페이지가 사용자가 하고 있는 것을 방해하지 않으면서 페이지의 일부를 업데이트할 수 있도록 해줍니다. XHR 객체는 보통 빠르게 동작하는 동적인 웹페이지를 만들때 사용하는 Ajax 개발기법에 자주 사용됩니다.
aview.innerHTML=x.responseText;
코드 핵심 부분을 다시 살펴보면 위 명령어는 aview라는 변수에 서버에서 가져온 어떤 데이터를 저장하는 코드이므로 아래와 같이 +를 붙여 문자가 하나씩 추가되도록 만든다.
aview.innerHTML+=x.responseText;
if(x.responseText=="") aview.innerHTML="?";
위 명령어는 aview를 ?로 만드므로 제거한다. 완성된 코드는 아래와 같다.
function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML+=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",20);
}
setTimeout("answer(0)",1000);
해당 코드를 그냥 새로고침하면 적용이 안되는 것을 확인하였다. 따라서 위 그림과 같이 콘솔창에 입력하면 플래그를 획득할 수 있다.
'웹 해킹 > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-25 (0) | 2021.09.07 |
---|---|
[Webhacking.kr] old-39 (0) | 2021.09.07 |
[Webhacking.kr] old-38 (0) | 2021.09.05 |
[Webhacking.kr] old-26 (0) | 2021.09.05 |
[Webhacking.kr] old-24 (0) | 2021.09.05 |
댓글