[webhacking.kr] 문제풀이 No.54

박준서·2021년 9월 17일
0

webhacking-kr

목록 보기
2/7
post-thumbnail

[ webhacking.kr 사이트의 문제에 대한 풀이입니다. ]

사실 차례대로 문제에 대한 풀이를 적으려 했으나...나도 공부하는 입장이라 우선 쉬운 10점 문제부터 차근차근 공부해나가며 글을 작성할 예정이다.

[ 풀이 ]

우선 사이트에 들어가면 굉장히 재밌는 문제임을 알 수 있다.

위와 같은 화면이 잠시 뜨고, 이후 빠르게 문자가 하나씩 지나간다.
동체 시력이 탈인간적으로 뛰어난 사람이 아니라면 눈으로 보고 외워 풀 생각을 할 일이 없을 것이다.

사실 문제 자체는 생각보다 간단하다. (10점 짜리라서...)
풀이 방법에도 여러가지 방법이 존재한다.

우선 가장 쉬운 방법은 Burp Suite를 통해 intercept 하여 forward를 누르며 하나씩 받아적어 푸는 방법이 존재한다. 크게 생각할 필요 없이 가장 간단한 방법이라 생각한다.

그러나 Burp Suite를 깔아 놓지 않았다면 굳이 이 방법을 선택할 이유가 없을 것이다.

크롬 개발자 도구로도 비슷한 방법을 재현할 수 있다.

{ Solution [1] } Network 패널 이용

앞선 글에서 개발자 도구를 잘 익혀두면 좋을 것이라 하였는데, 여기서도 기능을 이용할 것이다.

개발자 도구중 Network 탭에 들어가보자. 아마 처음에는 아무것도 안 뜰것이다.

이 상태에서 새로고침을 하게 된다면 아래와 같이 출력이 될 것이다.

?m=(숫자) 꼴로 출력이 되는데, 이를 0부터 하나씩 눌러보자.

누르면 아마 기본 headers 탭이 뜰텐데, 이 것 말고
옆에 Preview 라고 적힌 탭을 눌러보자

그럼 흰 배경에 글자가 하나 보일 것이다. 그렇다.
아까 우리의 눈에 스쳐 지나간 그 글자다.

결국 우리는 맨처음의 ?와 맨끝의 ?를 빼고 모조리 받아적어 Password를 완성시키면 되는것이다.

받아적으면 FLAG{...} 꼴이 뜨게 될텐데, 이를 webhacking.kr Auth 페이지 에 가서 값을 붙여넣으면 점수가 들어올 것이다.

이 방법은 상당히 귀찮고, Burp Suite를 이용하는 방법과 크게 다를 바가 없다. 그래서 한가지 방법을 더 소개하겠다.

Solution [2] JS 해석을 통한 풀이

개발자 도구로 elements탭에서 html 스크립트를 조회하다보면 script가 js로 직접 들어가 있는 것을 확인할 수 있다.


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

대충 이러한 스크립트인데, 우리가 주목할 부분은 function answer(i){} 부분이다. 여기에서 답을 표시할 수 있게 해주기 때문이다.

! 주의 !
기본적인 javascript 해석 능력이 있다는 전제하에 진행되는 설명으로, 만약 js에 대한 이해가 부족하다 생각하면 웹해킹 공부에 앞서 어느정도 문법을 간단하게 익히고 오는 것을 추천한다.

x로 부터 GET방식으로 query를 요청하여 html 코드 중의 aview라는 태그 값의 값을 x로 부터 받은 response로 바꿔준다.
이 과정이 화면에 표시해주는 과정이고, 그 밑의 if문에서 딜레이를 주게 된다.

만약 x.responseText 값이 공백이 아니라면 다음 answer(i)를 실행시킨다. 이 과정에서 setTimeout을 통해 20ms의 딜레이를 주었다.

그리고 그 밑의 줄을 만약 x.responseText 값이 공백이라면 다시 ? 로 화면에 표시하는 스크립트라고 해석할 수 있다.

그러므로 여기서 두가지 방법을 제시할 수 있는데,

(1) 딜레이 느리게 하여 받아적기

if(x.responseText) setTimeout("answer("+i+")",20);

위의 20 값이 20ms 딜레이를 의미하므로

if(x.responseText) setTimeout("answer("+i+")",2000);

으로 스크립트를 수정하여 2초 간격으로 다음문자가 보여지게 할 수 있다.

(2) 표시되는 글자 누적 시키시

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="?";

여기서 두가지 스크립트만 수정하면 되는데,

aview.innerHTML=x.responseText;

에서 =+= 으로 바꾼다면 aview 태그 안의 글자가 누적으로 쌓일것이다.
이 후, 마지막에 다시 ?로 바꿔주는 코드를 삭제하면

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="?";

다음과 같은 코드를 완성할 수 있다.

마지막으로 개발자 도구의 console 창에 스크립트를 붙여넣고 실행시키면

이렇게 누적된 FLAG 값을 볼 수 있다.

마무리하며...

지금까지 webhacking.kr 의 54번 문제에 대하여 알아보았다.
크게 어렵지 않은 문제였지만 나는 처음에 FLAG 값을 어디에 넣을지 몰라 상당히 난감해했었다;;

이번 문제는 여러가지 풀이법을 생각해볼 수 있어 재밌는 문제였다.

profile
학생 개발자의 블로그입니다.

0개의 댓글