본문 바로가기

SWUFORCE 워게임👊🏻

[Webhacking] old-54 ; web

<워게임_Webhacking_web_old-54>

 

1. 접속하면 물음표자리에 글자 여러개가 순식간에 지나가고 마지막에 물음표가 뜬다.

 

<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 지원 여부 확인 (구형 IE 지원)
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');  // IE에서 MSXML2를 사용하여 XMLHttpRequest 생성
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');  // 예외 발생 시 대체 ActiveXObject 사용
    } catch (e) {
     return null;  // ActiveXObject 생성 실패 시 null 반환
    }
   }
  }else if(window.XMLHttpRequest){  // 최신 브라우저에서는 XMLHttpRequest 객체 사용
   return new XMLHttpRequest();
  }else{
   return null;  // 둘 다 지원하지 않는 경우 null 반환
  }
 }
x=run();  // XMLHttpRequest 객체 생성
function answer(i){
  x.open('GET','?m='+i,false);  // 동기 요청 (해당 페이지에 `?m=i` GET 요청 보냄)
  x.send(null);  // 요청 전송
  aview.innerHTML=x.responseText;  // 응답 내용을 화면에 출력
  i++;
  if(x.responseText) setTimeout("answer("+i+")",20);  // 응답이 있을 경우 20ms 후 다음 요청 실행
  if(x.responseText=="") aview.innerHTML="?";  // 응답이 빈 문자열이면 '?' 표시
}
setTimeout("answer(0)",1000);  // 1초 후 `answer(0)` 실행 시작
</script>
</body>
</html>

 

2. 소스코드를 살펴보자. 

 

이 코드의 핵심 로직은 ?m=i 요청을 통해 서버에서 데이터를 순차적으로 가져오는 것이다.
브라우저 개발자 도구의 네트워크 탭을 이용해서 살펴보자.

 

3. ?m=0, ?m=1, ?m=2 ... 같은 요청이 자동으로 보내지고 있다.

 

그럼 왜 비밀번호를 한번에 확인할 수 없는가? 

=> 서버는 ?m=0 요청 시 Password: P 같은 전체 문자열을 주는 것이 아니라, 해당 위치의 문자 하나만 반환하는 방식을 사용하기 때문이다. ?m=0, ?m=1, ?m=2 같은 요청을 반복해야 전체 비밀번호를 얻을 수 있다. 

 

따라서 += 연산자를 활용한 JavaScript 코드 수정을 해보겠다.

현재 JavaScript 코드가 aview.innerHTML = x.responseText;를 사용하여, 매 요청마다 기존 값을 덮어쓰는 방식이다.

 

let password = ""; // 비밀번호 저장 변수
let i = 0; // 인덱스

function getPassword() {
  fetch(`?m=${i}`)
    .then(response => response.text())
    .then(data => {
      if (data.trim() !== "") {  // 응답이 존재할 때만 추가
        password += data.trim();  // += 기호로 비밀번호 문자열을 누적
        console.log("현재까지 비밀번호:", password);
        i++;
        getPassword();  // 다음 글자 요청
      } else {
        console.log("비밀번호 추출 완료:", password);
      }
    });
}

getPassword(); // 실행

 

 

?m=0 요청 → 첫 번째 글자 추가 (password += data)

?m=1 요청 → 두 번째 글자 추가 (password += data)

?m=2 요청 → 세 번째 글자 추가 (password += data)

...

서버 응답이 빈 문자열("")이 되면 종료된다.

 

이렇게 하면 비밀번호 전체를 한 줄로 출력할 수 있다.

 

4. 콘솔창에서 위 코드를 입력해주었더니 이렇게 비밀번호가 추출되었다.

 

해결 완👊🏻

'SWUFORCE 워게임👊🏻' 카테고리의 다른 글

[Dreamhack] level1 ; web ; ctrl-c  (0) 2025.03.25
[Dreamhack] baby-ai ; misc  (0) 2025.02.11
[SuNiNaTaS] 18 ; forensics  (0) 2025.01.28
[Dreamhack] Exercise: SSH ; misc  (0) 2025.01.28
[Webhacking] old-15 ; web  (0) 2025.01.21