본문 바로가기

WarGame & Conference/_Webhacking.kr

webhacking.kr(Oldzombie) 가입문제

웹해킹 문제를 풀어볼수 있는 사이트 중에 많은 분들이 알고 계시고 또 푸시는

http://webhacking.kr 사이트가 있다.


이 사이트에 가입하기 위해선 문제를 풀어야 되는데...


사이트에 가신후 join 을 누르시면 다음고 같은 화면이 보인다.



member password 를 전송 하라는데 막막하다.

그래서 소스보기를 해본다.(우클릭 -> 소스보기)

<HTML>
<HEAD>
<TITLE>Join</TITLE>
<BODY>
 
<script>
function enco(val){
  var InStr = val;
 
  var ttb = "!@#$%^&*()-_+[]{}';:,.|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789acegkm"; 
  
  var len_1 = InStr.length;
  var len_res = InStr.length % 3;
  var len_div = len_1 - len_res;
  var ra = new makeArray(4);
  var i=0;
  var Stat = "";
 
  var str="";
  while(1)
  {
    if( i >= len_1 )
         break;
 
 
    if( i >= len_div )
         Stat = "End"; 
 
    A = eval(InStr.charCodeAt(i++));
    B = eval(InStr.charCodeAt(i++));
    C = eval(InStr.charCodeAt(i++));
 
    if( i > len_div )
    {
        Stat = "End"; 
 
        if( len_res >= 1)
          C = 0;
        if( len_res == 1 )
          B = 0;
    }
    ra[1] = A >> 2;                                               
    ra[2] = ( (A & 3) << 4 ) + (B >> 4);
    ra[3] = ( ( B & 15 ) << 2 ) + ( C >> 6);
    ra[4] = C & 63;
 
    if( Stat == "End" && len_res >= 1 )
          ra[4] = 64;
    if( Stat == "End" && len_res == 1 )
          ra[3] = 64;
 
    for(k=1;k<=4;k++)
       str = str + ttb.substr(ra[k],1);
 } 
return str;
}
 
function makeArray(n){
    this.length=n
    for(var i=1; i<=n; i++){
            this[i]=null;
    }
    return this
}
 
url=document.URL;
 
input_pw=url.indexOf("?password=");
 
 
if(input_pw==-1)
{
document.write("<form method=get action=join.php>member password : <input type=text name=password size=20><input type=hidden name=input_ck value=1><input type=submit></form>");
}
 
if(input_pw!=-1)
{
pw=url;
pw=pw.substring(pw.indexOf('password='));
pw=pw.substring(9,pw.indexOf('&'));
 
text_pw=pw;
 
pw=enco(pw);
 
if(pw=="A2@]E^OI|p4^E|)OfOcm") { location.href='index.php?auth='+text_pw; }
if(pw!="A2@]E^OI|p4^E|)OfOcm") { alert("Wrong password!\n\n"+pw); history.go(-1); }
 
 
}
 
 
</script></Head>
 
</BODY>
</HTML>


소스를 분석해보면 사용자로 부터 값을 입력받은 후

그 값을 enco 라는 함수의 파라미터로 전달하여 인코딩한값과 pw = A2@]E^OI|p4^E|)OfOcm 와 비교한다.

enco 함수를 살펴보면

var ttb = "!@#$%^&*()-_+[]{}';:,.|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789acegkm"; 이구문과

    ra[1] = A >> 2;                                               
    ra[2] = ( (A & 3) << 4 ) + (B >> 4);
    ra[3] = ( ( B & 15 ) << 2 ) + ( C >> 6);
    ra[4] = C & 63;
 
    if( Stat == "End" && len_res >= 1 )
          ra[4] = 64;
    if( Stat == "End" && len_res == 1 )
          ra[3] = 64;

이부분을 통해 ttb를 키값으로 한 base64 인코딩이라는 것을 알수있다.
(시프트 연산을 통해 base64 암호화를 하고 있다)
(참고 : 어떻게 한번에 base64 를 알았느냐고 생각하실지도 모르겠지만 base64 인코딩 기법을 알고 있다면.
           처음에 ra[1] = A >> 2 에서 눈치를 챌수 있다)

따라서 디코딩 툴로 키값에 ttb 값을 넣고
(디코딩 툴 : http://dakuo.tistory.com/entry/암호-인코딩encoding-디코딩decoding-툴SnDRT)

base64 디코딩을 하면 pw 가 나온다.

(추가 : base64 인코딩 설명 : http://dakuo.tistory.com/entry/base64-인코딩-알고리즘)

'WarGame & Conference > _Webhacking.kr' 카테고리의 다른 글

webhacking.kr 17번 문제  (1) 2010.07.17
webhacking.kr 16번 문제  (0) 2010.07.17
webhacking.kr 14번 문제  (0) 2010.07.05
webhacking.kr 39번 문제  (3) 2010.03.23