티스토리 뷰



이번 포스팅은 webhacking.kr 워게임 사이트 Challenge 6번 문제를 풀어보도록 하겠습니다.

Challenge를 풀어가는 순서는 번호 순이 아닌 점수 분배가 낮은 문제들부터 풀어나갈 예정입니다.


Challenge 6번을 푼 환경은 Windows 10, Chrome을 사용하였고, cookie값 수정을 위한 Chrome 확장 프로그램 EditThisCookie와 스크립트 작성을 위한 Python 3.6.0을 이용하였습니다.


이번 포스팅의 Challenge 6번 문제는 아래의 접근 방법과 기초 개념을 필요로 합니다.


1. HTML/PHP 코드 이해

2. Encode - Base 64 이해

3. 스크립트 작성 (언어와 무관하지만 이 포스팅에서는 Python3을 사용하였습니다)

4. Cookie 값 수정


먼저 6번 문제를 풀기 위해서는 쿠키 값 수정이 필요한데, 그를 위한 크롬 확장 프로그램 EditThisCookie 설치는 아래 4번 포스팅을 참고해주시면 됩니다.




이제 Challenge 6번을 본격적으로 풀어보도록 하겠습니다.



6번 문제 사이트로 입장하면 보이는 화면입니다.


Hint로는 base64가 주어져있고, index.phps 페이지로 이동할 수 있는 버튼과 ID, PW가 주어져있습니다.


Base 64 Encoding에 대해 궁금하신 분들은 아래 포스팅을 참고해주세요.




먼저 index.phps 페이지로 이동해보도록 하겠습니다.

(http://webhacking.kr/challenge/web/web-06/index.phps)



index.phps 페이지로 가면 6번 문제의 코드를 볼 수 있는데, 한 번에 보기에 편하도록 프로그램을 이용해 코드를 옮겨적고 캡쳐하였습니다.


이 코드를 전체적으로 해석하기 위해 중점적으로 보아야 할 코드를 자세히 보도록 하겠습니다.


6
7



9
10
11
12
13



15
24




33
34



50
51



53
62



72
73
74
75
76



81
82
83
84


$val_id="guest";
$val_pw="123qwe";
    #val_id를 guest로, val_pw를 123qwe로 값 지정
 
 
for($i=0;$i<20;$i++
{  
    $val_id=base64_encode($val_id); 
    $val_pw=base64_encode($val_pw); 
}
    #val_id와 val_pw를 base64로 encode하는 코드, 이를 for문을 이용해 20번 반복 (즉, base64로 20번 encode)
 
 
$val_id=str_replace("1","!",$val_id);
$val_pw=str_replace("1","!",$val_pw); 
    #str_replace 함수를 이용해 세번째 인자에 포함되어있는 값 중 첫번째 인자(1)를 두번째 인자(!)로 바꿈
    #만약 val_id 값 내에 1이 존재하면 모두 !로 바꿔주는 코드
 
 
Setcookie("user",$val_id); 
Setcookie("password",$val_pw); 
    #user 쿠키를 val_id 값으로, passwd 쿠키를 val_pw 값으로 세팅
 
 
$decode_id=$_COOKIE[user]; 
$decode_pw=$_COOKIE[password]; 
    #decode_id에 user 쿠키값을, decode_pw에 password 쿠키값을 지정
 
 
$decode_id=str_replace("!","1",$decode_id);
$decode_pw=str_replace("!","1",$decode_pw);
    #15, 24 라인 코드 처럼 str_replace 함수를 이용해 세번째 인자에 첫번째 인자가 존재할 때, 두번째 인자로 바꿈
 
 
for($i=0;$i<20;$i++
    $decode_id=base64_decode($decode_id); 
    $decode_pw=base64_decode($decode_pw); 
}
    #decode_id와 decode_pw를 base64로 decode하는 코드, 이를 for문을 이용해 20번 반복 (즉, base64로 20번 decode)
 
 
if($decode_id=="admin" && $decode_pw=="admin"
    @solve(6,100); 
}
    #만약 decode_id가 admin이고 decode_pw가 admin이면 6번문제 해결, 100 point 얻음
 
cs


즉, 현재 지정되어 있는 ID : guest, PW : 123qwe 를 base 64로 20번 인코딩하고 str_replace함수로 문자열을 바꾼 값을 쿠키의 user와 password 로 세팅한 것을 알 수 있습니다.



문제 페이지의 쿠키를 EditThisCookie를 이용해 확인해보도록 하겠습니다.


(쿠키 값은 원래 한 탭만 볼 수 있지만, 포스팅을 위해 user와 password를 캡쳐하여 합친 것입니다.)


위의 사진을 보면 두 쿠키가 다른 것을 알 수 있습니다.


이를 통해 다음 코드를 이용해 문제가 원하는 admin 값으로 수정해보도록 하겠습니다.


코드 해석을 보면 알 수 있듯이, 설정된 쿠키 값을 str_replace() 함수를 통해 문자를 바꿔주고, base 64 decode를 20번 진행한 값이 admin이면 6번 문제를 풀 수 있는 것을 알 수 있습니다.



이를 위해 python을 통한 스크립트 작성을 해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import base64    #base64 module 가져옴
 
user_id=b"admin"    #user_id를 "admin"으로 지정하나, byte형으로 지정
 
for i in range(20):        #for문을 이용해 코드 20번 반복
    user_id=base64.b64encode(user_id)    #user_id를 base 64로 encode (byte형)
 
user_id=user_id.decode("utf-8")    #user_id를 utf-8로 decode
 
intab="12345678"    #문자 변환을 위해 바꿔질 문자 지정
outtab="!@$^&*()"    #intab에 정해진 순서로 바꿀 문자 지정
transtab=user_id.maketrans(intab,outtab)
    #maketrans() 함수를 이용해 user_id 내에 존재하는 intab의 문자에서 outtab으로 변환할 문자를 transtab에 저장
 
print(user_id.translate(transtab))
    #transtab을 translate() 함수로 변환하여 출력
cs



파이썬 코드를 작성하여 idle을 통해 실행시켜 줍니다.



파이썬 코드를 실행시켜주면 우측 화면처럼 스크립트 실행 화면을 볼 수 있습니다.


해당 문자열은 admin 을 base64 로 20번 인코딩, 정해진 규칙에 따라 문자열을 바꿔준 것으로, 6번 문제의 user와 password의 쿠키값으로 넣어주면 됩니다.



이렇게 쿠키값을 바꿔주고 페이지를 새로고침 해주면 문제를 성공적으로 풀게 됩니다.




Challenge 페이지로 돌아가면 6번 문제의 Score 100 을 획득하였음을 확인할 수 있습니다.



여기까지 봐주셔서 감사합니다.


다음 포스팅에서 봐요 :)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함