<워게임_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 |