[webhacking.kr] 5번 문제 풀이[JavaScript]

2 분 소요

💡 Webhacking.kr challenge(old) 5번 문제에 대한 풀이입니다.

문제

문제 화면

그림과 같이 Login 버튼과 join 버튼이 있습니다. 먼저 로그인 버튼을 눌러보면 다음과 같이 아이디 비밀번호를 입력하려 로그인 하는 기능이 있습니다.

image

우선 id/pw에 guest/guest , admin/admin을 입력해봤더니, Wrong password라는 문구가 나옵니다.

image

다시 메인페이지에서 Join 버튼을 누르면 다음과 같이 Access Denied 메시지가 나옵니다

image

개발자 모드로 들어가서 로직을 보니 Login 버튼을 누르면, mem/login.php로 이동을 하고, Join 버튼을 누르면 Access Denied 라는 메시지가 출력되도록 되어 있었습니다.

image

login -> mem/login.php로 이동이 되니, join -> mem/join.php로 이동이 될거라 가정하고 해당 링크로 접속을 해보면 다음과 같은 페이지가 나옵니다

image

해당 페이지도 개발자 모드로 들어가서 보니, 난독화된 자바 스크립트 코드가 작동하고 있었습니다. 본 문제는 해당 스크립트를 분석하고, 우회하면 될 것 같습니다.

image

문제 풀이

자바 스크립트 코드가 패킹되어 읽기 어렵게 되어 있기 때문에 먼저 읽을 수 있도록 변환해줘야 합니다. 구글에 자바스크립트 난독화 해제같은 키워드로 검색하면 코드를 읽을 수 있도록 정렬해주는 사이트가 많이 나옵니다. 저는 이 사이트에서 언패킹을 해줬습니다.

image

image

이제 언패킹 된 코드를 개발자 모드 > 콘솔에서 실행해 보면서 어떤 로직이 존재하는지 확인해 봅니다. 우선 I,II,III … 1,11,111 등과 같은 문자로 치환을 해서 문자열을 조합하기 때문에 읽기 힘들도록 난독화를 해놨습니다. 하지만 다행히 중간 부분을 보면 if, alert부분이 읽히기 때문에 해당 부분을 보겠습니다.

image

  if (eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl) == -1) {
	alert('bye');
	throw "stop";
  }

크롬의 콘솔모드로 if문 안에 있는 내용을 입력해보면, 조건을 알 수 있습니다.

image

이를 종합하여 보면 다음과 같이 됩니다.

  if(eval(document.cookie).indexOf(oldzombie == -1)){
    alert('bye');
    throw "stop";
  }

그러면 위의 조건을 우회하기 위해서 쿠키 값에 oldzombie를 입력해서 다시 접속해 보겠습니다.

image

이번에는 access_denied 메시지로 바뀌었습니다.

image

자바스크립트 코드에서 다시 이부분을 찾아보면 다음과 같습니다.

  if (eval(llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + 'U' + 'R' + 'L').indexOf(lllllllllllll + lllllllllllllll + llll + lllll + '=' + I) == -1) {
	alert('access_denied');
	throw "stop";
  }

동일하게 크롬 콘솔에서 치환해야 하는 문자열을 입력하여 if문 조건을 보면 다음과 같습니다.

  if(eval(document.URL).indexOf(mode=1) == -1){
    alert('access_denied');
    throw "stop";
  }

이번에는 해당 조건을 충족시키기 위해 URL에 mode=1의 파라미터를 넘겨주면서 요청을 해보겠습니다. 그림처럼 mode=1의 파라미터를 넘겨주니 회원가입을 할 수 있는 페이지가 나왔습니다.

image

guest/guest로 회원가입을 한 후 , Login 페이지에서 guest/guest로 로그인을 진행하니 다음과 같은 화면이 나왔습니다.

image

admin으로 로그인을 해야 하므로 회원가입 페이지에서 admin으로 회원가입을 하려고 하면 이미 존재하는 아이디 라고 뜹니다.

image

이 문제는 admin계정의 회원가입 로직을 우회해서 회원가입을 진행하여, admin 계정으로 로그인을 하면 풀리는 문제 같습니다. 저는 이를 우회하기 위해서 다음과 같이 진행했습니다.

회원가입 내용을 Burp_suite로 잡아서 id 부분을 admin -> admin%00으로 수정하여 보냈습니다.

image

그러면 다음과 같이 회원가입에 성공합니다.

image

그리고 로그인 페이지에서 다시 패킷을 잡아서 동일하게 id/pw를 다음과 같이 변경해 줍니다.

image

그러면 문제가 풀립니다.

image

댓글남기기