상세 컨텐츠

본문 제목

[webhacking.kr] exam 6 풀이

헉!!/ETC

by 권태성 2015. 8. 8. 20:30

본문

100점짜리였던가 그래서 힌트가 다 나와있는 문제 였습니다.



처음 문제 페이지에 들어가면 위와 같이 나오는데요. 힌트로 base64라고 쓰여있으니 당연히 base64 관련 문제겠죠.

일단 index.phps 링크가 있으니 들어가봅시다.

index.phps 링크에 들어가면 위에서 보았던 페이지의 php 소스가 표시됩니다. 소스가 다 공개되었으니 이제부터는 일사천리죠.


<?php 
if(!$_COOKIE[user]) 

    
$val_id="guest"
    
$val_pw="123qwe"

    for(
$i=0;$i<20;$i++) //ID와 패스워드를 BASE64로 20번 encode 합니다.
    { 
        
$val_id=base64_encode($val_id); 
        
$val_pw=base64_encode($val_pw); 

    } 

    
$val_id=str_replace("1","!",$val_id); //BASE64로 20번 endcode한 문자열 내에서 1을 !로 치환합니다.(이하생략)
    
$val_id=str_replace("2","@",$val_id); 
    
$val_id=str_replace("3","$",$val_id); 
    
$val_id=str_replace("4","^",$val_id); 
    
$val_id=str_replace("5","&",$val_id); 
    
$val_id=str_replace("6","*",$val_id); 
    
$val_id=str_replace("7","(",$val_id); 
    
$val_id=str_replace("8",")",$val_id); 

    
$val_pw=str_replace("1","!",$val_pw); 
    
$val_pw=str_replace("2","@",$val_pw); 
    
$val_pw=str_replace("3","$",$val_pw); 
    
$val_pw=str_replace("4","^",$val_pw); 
    
$val_pw=str_replace("5","&",$val_pw); 
    
$val_pw=str_replace("6","*",$val_pw); 
    
$val_pw=str_replace("7","(",$val_pw); 
    
$val_pw=str_replace("8",")",$val_pw); 

    
Setcookie("user",$val_id); //치환까지 마친 문자열을 쿠키에 user라는 이름으로 세팅합니다. (이하 생략)
    
Setcookie("password",$val_pw); 

    echo(
"<meta http-equiv=refresh content=0>"); 

?> 

먼저 상단에 있는 encode 소스를 보겠습니다. (decode는 이것의 역순)

간단하게 주석을 적어놨는데 주석대로 먼저 id와 pw를 각각 BASE64로 20번 encode 합니다.

그리고 20번 encode된 문자열중 특정 문자들을 replace 해줍니다.

그렇게해서 쿠키에 세팅된 값이 아래 값들 입니다.

user와 password 값이 쿠키에 세팅되어 있는데 이 값을 가지고 replace를 역순으로 다시 replace 해주고 BASE64 decode를 거치면

최초 val_id와 val_pw의 값인 guest, 123gwe가 됩니다.

사실 encode소스를 볼필요 없이 decode 소스를 바로 보는것이 문제를 풀기에는 더 빠릅니다.


<? 


$decode_id
=$_COOKIE[user]; 
$decode_pw=$_COOKIE[password]; 

$decode_id=str_replace("!","1",$decode_id); 
$decode_id=str_replace("@","2",$decode_id); 
$decode_id=str_replace("$","3",$decode_id); 
$decode_id=str_replace("^","4",$decode_id); 
$decode_id=str_replace("&","5",$decode_id); 
$decode_id=str_replace("*","6",$decode_id); 
$decode_id=str_replace("(","7",$decode_id); 
$decode_id=str_replace(")","8",$decode_id); 

$decode_pw=str_replace("!","1",$decode_pw); 
$decode_pw=str_replace("@","2",$decode_pw); 
$decode_pw=str_replace("$","3",$decode_pw); 
$decode_pw=str_replace("^","4",$decode_pw); 
$decode_pw=str_replace("&","5",$decode_pw); 
$decode_pw=str_replace("*","6",$decode_pw); 
$decode_pw=str_replace("(","7",$decode_pw); 
$decode_pw=str_replace(")","8",$decode_pw); 


for(
$i=0;$i<20;$i++) 

    
$decode_id=base64_decode($decode_id); 
    
$decode_pw=base64_decode($decode_pw); 


echo(
"<font style=background:silver;color:black>&nbsp;&nbsp;HINT : base64&nbsp;&nbsp;</font><hr><a href=index.phps style=color:yellow;>index.phps</a><br><br>"); 
echo(
"ID : $decode_id<br>PW : $decode_pw<hr>"); 

if(
$decode_id=="admin" && $decode_pw=="admin"

    @
solve(6,100); 



?>

decode 소스를보면 쿠키에서 user와 password 값을 가져와서 decode를 합니다. 그러니 쿠키를 수정할 필요가 있겠죠.

그 다음 encode시에 replace했던 값들을 다시 decode를 해줍니다. 그리고 decode도 20번 반복.

decode를 마치고나면 decode_id와 decode_pw의 값을 if문에서 확인하는데 결국 user와 password의 원본 데이터가 admin이 되어야 성공 입니다.


한줄 요약 : admin이라는 문자열을 BASE64로 encode * 20후에 각 숫자들을 특수문자로 replace하고 쿠키에 담아주면 끝 입니다.











관련글 더보기