ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] Challenge 54 풀이
    Wargame/Webhacking.kr 2019. 5. 19. 02:20

    54번 문제로 들어가면, Password is라는 문구가 뜨고, 일정 시간마다 한글자씩 보여준다.

     

     

    개발자도구를 실행해 소스를 확인해보았다.

     

     

    소스를 보면 run( ) 함수와 answer( ) 함수가 정의되어 있다.

    먼저 run( ) 함수를 간단하게 살펴보자.

    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();
    

    run( ) 함수는 Ajax를 위한 객체를 생성하는 함수이다. Ajax는 Asynchronous JavaScript and XML의 약자로, 자바스크립트를 이용하여 비동기적으로 서버와 브라우저가 데이터를 주고받는 방식이다. 이때, IE 6버전 이하는 ActiveXObject를 사용하고, IE 7버전 이상, 크롬과 같은 다른 웹브라우저는 XMLHttpRequest를 사용하여 객체를 생성한다.

     

    run( ) 함수를 통해 생성된 객체는 변수 x에 저장된다.

     

    run( ) 함수는 별게 없으므로 answer( ) 함수에서 해답을 찾아보자.

    function answer(i)
    {
      x.open('GET','?m='+i,false); //GET 방식으로 ?m=i 페이지에 대한 요청 설정 (동기적)
      x.send(null); //요청을 서버에 전송
      aview.innerHTML=x.responseText; //서버의 응답을 화면에 출력
      i++;
      if(x.responseText) setTimeout("answer("+i+")",100); //서버의 응답이 있으면 재귀함수 호출
      if(x.responseText=="") aview.innerHTML="?"; //모든 문자가 출력되면 ?를 출력
    }
    
    setTimeout("answer(0)",10000); //10000ms(10초) 후 answer(0) 수행(0 출력)

    Password is 뒤에 나타나는 문자는 aview.innerHTML=x.responseText에 의해 화면에 출력되고, 그 다음 setTimeout 함수에 의해 0.1초에 한번씩 answer 함수가 재귀적으로 호출되어 다른 값으로 변경되어 나타나는 것이다. 

     

    따라서 aview.innerHTML=x.responseTextaview.innerHTML+=x.responseText로 코드를 수정하면 password가 하나씩 출력되지 않고, 페이지가 요청될 때마다 문자가 계속 추가된 상태로 출력될 것이다.

    또한 요청이 끝난 뒤에 password가 ?로 초기화되지 않도록 if(x.responseText=="") aview.innerHTML="?"; 구문도 수정해준다. (아예 삭제해도 되고, password 출력이 끝났다는 표시로 등호 대신 +=를 입력해도 된다.)

    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; //password 문자 계속 추가
      i++;
      if(x.responseText) setTimeout("answer("+i+")",1); //빠르게 하기 위해 시간 수정
      if(x.responseText=="") aview.innerHTML+="?"; //password 끝을 알림
    }
    
    setTimeout("answer(0)",10000); //삭제해도 무방

     

    위와 같이 수정한 코드를 개발자도구의 Console 창에 입력해 실행하면 Password 문자열이 차례대로 출력된다.

    (※ 주의: 문제 페이지에 들어가자마자 answer 함수가 실행되고 있기 때문에, 해당 함수 수행이 끝날 때까지, 즉 ?가 출력될 때까지 기다린 뒤에 콘솔창에서 실행해야 한다. answer 함수가 수행되는 중간에 콘솔에서 코드를 실행하면 password가 서로 섞여서 정확한 password가 출력되지 않는다.)

     

    password = ? 사이에 있는 문자열

     

    출력된 password를 Auth에 입력하면 문제 해결!

     

     

    ※ 다른 방법

    개발자도구의 Network 메뉴를 이용하여 password를 확인할 수도 있다.

     

     

    m=0부터 m=32까지의 페이지의 내용을 차례대로 확인하여 password 문자열을 알아내면 된다.

    (좀 노가다지만 금방할 수 있다.)

Designed by Tistory.