보안 공부하는 꼬깔이

Webhacking.kr 6번 문제 풀이





6번 문제 메인 페이지 화면이다.


100점짜리 문제라 그런지 base64라는 힌트도 준다.


그리고 id는 guest pw는 123qwe 인 계정이 출력되어있다.


리얼 힌트를 보기위해 index.phps 페이지로 이동하자


<base64 encode 코드>



코드가 base64 encode 코드와 base64 decode 코드로 나누어 져있다. 먼저 base64 encode 코드부터 해석해보자




<base64 encode 코드 해석>


<?php 
if(!$_COOKIE[user])       #user 라는 cookie값이 존재하지 않는다면 if문 수행

    
$val_id="guest";      #$var_id 변수에 "guest" 저장
    
$val_pw="123qwe";     #$var_pw 변수에 "123qw3" 저장

    for(
$i=0;$i<20;$i++) for문으로 20번 반복한다.
    { 
        
$val_id=base64_encode($val_id); #$var_id에 저장되어 있는 "guest" 라는 문자열을 20번 base64 인코딩 한다.
        
$val_pw=base64_encode($val_pw); #$var_pw에 저장되어 있는 "123qwe" 라는 문자열을 20번 base64 인코딩 한다.

    } 

    
$val_id=str_replace("1","!",$val_id);  #str_replace로 인해 "1" 이라는 값이 $var_id에 저장되있으면 "!" 로 치환해서 $val_id에 저장한다.
    
$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 수행
    
$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);     #base64로 20번 인코딩되고 str_replace로 치환된 후의 $val_id 변수에 저장된 값을 user 쿠키에 저장
    
Setcookie("password",$val_pw); #base64로 20번 인코딩되고 str_replace로 치환된 후의 $val_pw 변수에 저장된 값을 password 쿠키에 저장

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

?> 


첫 번째 코드의 역할은 아무래도 처음에 쿠키 값이 없으면 $var_id 변수에 "guest", $var_pw 변수에 "123qwe"  를 저장한 후 반복문을 통해 20번 base64 인코딩 하고 str_replace로 1~9의 숫자를 특수문자로 치환시킨후 그값을 user 쿠키와 password 쿠키에 저장하는 것이다.





실제로 쿠키를 확인해보면 user 쿠키와 password 쿠키에 엄청나게 긴 base64로 인코딩된 값이 있다.  






<base64 decode 코드>



base64 decode 부분 코드이다. 본격적으로 문제를 풀어보자




<base64 decode 코드 해석>


<? 

$decode_id
=$_COOKIE[user];    #$decode_id 변수에 user쿠키에 저장된 값을 저장한다
$decode_pw=$_COOKIE[password]; #$decode_pw 변수에 password 쿠키에 저장된 값을 저장한다


$decode_id=str_replace("!","1",$decode_id); #$decode_id에 저장된 값 str_replace 치환
$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 치환
$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++)  #for 문으로 20번 반복한다

    
$decode_id=base64_decode($decode_id);  #decode_id 의 값을 반복적으로 base64 decode하여 $decode_id 변수에 저장
    
$decode_pw=base64_decode($decode_pw); #decode_pw 의 값을 반복적으로 base64 decode하여 $decode_pw 변수에 저장


echo(
"ID : $decode_id<br>PW : $decode_pw<hr>"); #$decode_id와 $decode_pw 값 출력(메인화면의 guest와 123qwe가 출력되는 부분)

if(
$decode_id=="admin" && $decode_pw=="admin") #$decode_id 에 저장된 값과 $decode_pw에 저장된 값이 admin이면 문제 해결

    @
solve(6,100); 



?> 

</body> 
</html> 



admin을 20번 인코딩하고 str_replace 치환한 값을 user 쿠키와 password 쿠키에 넣어 변조 시키면 decode 코드로 인해 디코드 되고 문제가 풀릴것이다. 

base64 인코딩을 20번 해야하는데 일일이 툴을 이용해 20번 반복하는것은 비효율적이기 떄문에 파이썬을 이용해 해보도록 하자!


#-*- coding:utf-8 -*-
import base64

__name__ = "이꼬깔"

encode_me = "admin"
i = 0
for i in range(20):
try:
i += 1
encode_me = base64.b64encode(encode_me)
except: pass

encode_me.replace("1","!")
encode_me.replace("2","@")
encode_me.replace("3","$")
encode_me.replace("4","^")
encode_me.replace("5","&")
encode_me.replace("6","*")
encode_me.replace("7","(")
encode_me.replace("8",")")

print "디코드 :"+encode_me

위 코드를 실행하게 되면 admin을 20번 base64 인코딩하고 1~9를 replace 시킨 값이 아~~~~주 길게 나온다.





password 쿠키와 user 쿠키에 위에서 나온 인코딩 값을 넣어줬다. 이제 초록색 체크 버튼을 클릭! 새로고침!



추카!




100 point Get :D





'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 11번 문제 풀이  (0) 2017.07.06
Webhacking.kr 10번 문제 풀이  (0) 2017.07.06
webhacking.kr 5번 문제 풀이  (0) 2017.06.29
webhacking.kr 4번 문제 풀이  (0) 2017.06.29
webhacking.kr 3번 문제 풀이  (1) 2017.06.29