반응형

 

<html>
<head>
<title>Challenge 54</title>
</head>
<body>
<h1><b>Password is <font id=aview></font></b></h1>
<script>
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
x=run();
function answer(i){
  x.open('GET','?m='+i,false);
  x.send(null);
  aview.innerHTML=x.responseText;
  i++;
  if(x.responseText) setTimeout("answer("+i+")",20);
  if(x.responseText=="") aview.innerHTML="?";
}
setTimeout("answer(0)",1000);
</script>
</body>
</html>

 


function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }

 

위의 코드를 이해하기 위해서는 JS와 AJAX를 알아야 한다.

 

ajax 구현의 시작은 XHR(XMLHttpRequest) 객체의 생성에서 시작한다.

 

windows.ActiveXObject는 ActiveXObject를 지원하는 브라우저라면 오브젝트를 리턴하고 그렇지 않다면 null를 리턴한다.

 

즉, 위의 코드에서는 오브젝트가 존재하면 if문의 조건은 true가 되고, 새로운 ActiveXObject 객체(Msxml2.XMLHTTP)가 반환되고, 예외가 발생하면 다른 새로운 ActiveXObject 객체(Microsoft.XMLHTTP)가 반환되는데, 이 마저도 예외가 발생하면, null을 반환한다.

 

만약 오브젝트가 존재하지 않으면 else if 문으로 넘어가 native javascript 객체가 반환된다.

 

그리고 위의 두 조건 모두 해당하지 않으면 null을 리턴한다.

 

즉, 위의 코드를 이용해서 브라우저가 다르더라도 run() 함수의 호출로 Ajax를 위한 XHR 객체를 생성할 수 있는 것이다.

 


function answer(i){
  x.open('GET','?m='+i,false);
  x.send(null);
  aview.innerHTML=x.responseText;
  i++;
  if(x.responseText) setTimeout("answer("+i+")",20);
  if(x.responseText=="") aview.innerHTML="?";
}
setTimeout("answer(0)",1000);

 

answer() 함수에서는 XHR 객체를 이용해 페이지를 열고 요청을 보낸 뒤 응답값을 id가 aview인 element에 삽입해 출력한다.

 

i의 값을 증가하고

 

응답값이 있으면, SetTimeout()에 의해 answer() 함수에 증가된 i의 값을 넘겨 호출하는데 0.02초 뒤에 answer()를 호출한다.

 

응답값이 없으면, 화면에 "?"를 출력한다.

 

 

그리고 1초마다 answer(0) 함수를 호출한다.

 

즉, 정리하면 answer() 함수를 1초 뒤에 호출하는데, ?m=0 페이지에 요청을 보내고 응답받은 값을 화면에 출력한다.

그리고 응답받은 값이 있으면, i를 증가시켜 ?m=1, ?m=2, ?m=3 ... 페이지에 요청을 보내고 해당 페이지로부터 응답받은 값을 화면에 출력한다.

 

그리고 응답받은 값이 없으면 "?"를 출력한다.

 


풀이

 

위 answer() 함수의 코드를 아래와 같이 수정 후 개발자 도구에서 console 탭에서 실행하면 Flag가 나오는데 출력된 Flag 값을 webhacking.kr의 auth 페이지에 제출하면 된다.

 

function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
x=run();
function answer(i){
  x.open('GET','?m='+i,false);
  x.send(null);
  aview.innerHTML+=x.responseText;
  i++;
  if(x.responseText) setTimeout("answer("+i+")",20);
  if(x.responseText=="") aview.innerHTML+="?";
}
setTimeout("answer(0)",1000);

 

 

 

 


Flag

FLAG{a7981201c48d0ece288afd01ca43c55b}

 


ajax XHR windows.ActiveXObject : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=redeyeant&logNo=100057590653 

 

try...catch : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/try...catch

반응형

'전쟁 > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-23  (0) 2022.07.13
[Webhacking.kr] old-20  (0) 2022.07.13
[Webhacking.kr] old-17  (0) 2022.07.13
[Webhacking.kr] old-16  (0) 2022.07.13
[Webhacking.kr] old-15  (0) 2022.07.13

+ Recent posts