웹해킹 문제를 풀어볼수 있는 사이트 중에 많은 분들이 알고 계시고 또 푸시는
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 |