티스토리 뷰
54번을 클릭하였을때의 화면이다. 시간이 좀 지나면 is뒤에 문자가 한글자씩 나오다가 ?가 나오고 더이상 변하지 않는다. 코드를 확인해 보겠다.
XMLHttpRequest는 Ajax요청을 생성하고 전송할 수 있는 객체이다.
Ajax(Asynchronous JavaScript and XML)란 자바스크립트를 이용해서 비동기적으로 서버와 브라우저가 통신하는 방식이다.
run()함수에서 if(window.ActiveXObject)는 구버전의 IE일 경우 수행되고
else if(window.XMLHttpRequest)는 신버전의 IE(7이상) 또는 다른 웹브라우저(크롬 등) 일 경우 수행된다.
나는 크롬을 이용하였으므로 run()함수에서 XMLHttpRequest객체가 생성되고, 이 객체를 변수 x가 참조하게 되었다.
run()함수는 단순히 Ajax를 위한 객체를 생성할 뿐이므로 정답은 answer()함수에서 얻을 수 있을것 같다.
answer()함수가 호출되는 부분이다.
10000ms, 즉 10초후에 answer(0)를 호출하는 코드이다.
setTimeout함수를 사용했기 때문에 54번 문제를 클릭하였을때, 일정 시간이 지난 다음 is뒤에 문자가 출력되었다는 것을 알 수 있다. 이제 answer()함수의 내부를 자세히 봐야겠다.
function answer(i)
{
x.open('GET','?m='+i,false); //x에서 ?m=i 페이지를 여는 요청을 초기화
x.send(null); //요청을 전송
aview.innerHTML=x.responseText; //서버의 응답(리턴값)을 화면에 출력
i++; //i를 1증가
if(x.responseText) setTimeout("answer("+i+")",100); //서버의 응답이 있으면 재귀
if(x.responseText=="") aview.innerHTML="?"; //서버의 응답이 없으면 재귀종료
}
answer()함수는 재귀함수이다. x.responseText값 즉, 서버의 응답(리턴값)이 존재하면 1만큼 증가된 i를 인자로 하는 answer()이 호출되고, 서버의 응답(리턴값)이 없으면 재귀호출을 종료한다.
54번 문제에 들어왔을때 Password is 뒤에 나오는 문자들은
aview.innerHTML=x.responseText에 의해 나타났다가
answer()의 재귀 호출에 의해 다른 값으로 변경되는 것이므로 이 코드를 조작하면 정답을 얻을 수 있다. 코드 조작을 위해 Burp Suite를 이용하였다.
answer()가 재귀적으로 호출될때마다 is뒤의 문자가 다른 값으로 바뀌지 않고 기존 문자열에 추가되도록 하기 위해
aview.innerHTML=x.responseText -> aview.innerHTML+=x.responseText 로 바꿨고
x.responseText값이 없을때 is뒤의 문자가 ?로 바뀌지 않도록 하기위해 해당 분기문을 삭제하였다.
마지막으로 시간 절약을 위해
setTimeout("answer(0)",10000) -> answer(0)로 바꾸었다.
위와 같이 수정하면
다음과 같이 패스워드를 알 수 있게된다.
복사해서 입력하면 54단계가 클리어된다.
'hacking > webhacking.kr' 카테고리의 다른 글
<webhacking.kr> - 1번 (0) | 2018.01.19 |
---|---|
<webhacking.kr> - 20번 (0) | 2018.01.17 |
<webhacking.kr> - 16번 (0) | 2018.01.13 |
<webhacking.kr> - 14번 (0) | 2018.01.12 |
<webhacking.kr> - 17번 (0) | 2018.01.12 |