끝나지 않는 프로그래밍 일기


4번 문제를 풀기 위해 http://webgame.wowhacker.com/wlv4game/index.php로 이동합니다.

그럼 아래와 같이 로그인폼과 공지사항, 그리고 공지사항이 올라온 시각을 볼 수 있습니다.


공지사항을 살펴보면 2번에 anonymous(익명)의 계정을 만들었다고 나와있습니다. 아이디가 guest, 비밀번호도 guest라네요. 우선 로그인해봅시다. 게스트로 로그인하면 홈페이지로 이동되면서, 삽질하는 이미지와 함께 로그인했던 계정까지 뜹니다. Query에 무언가 입력하려고 텍스트 박스를 누르면 Oops~라는 경고창만 계속 나타납니다.


여기서 얻은 힌트는 관리자의 계정은 admin라는 것입니다. 한번 쿠키도 살펴봅시다. WOWSESSIONID를 살펴보면,

084e0343a0486ff05530df6c705c8bb468a1554e9d53ec0c6a321c0107722bc4


다시 접속해서 확인해보면,

084e0343a0486ff05530df6c705c8bb4fdb11230b400deda2204ba1cae7a92d3


또다시 접속하면,

084e0343a0486ff05530df6c705c8bb420c209a37c36c4c48820e77959ec3d8e


이 세개의 세션 아이디의 공통점을 찾으셨나요? 그건 바로 앞의 084e0343a0486ff05530df6c705c8bb4는 변하지 않고 그 뒤의값은 항상 바뀝니다. 아마 Current Time를 타임스탬프값으로 바꾸어 MD5 인코딩을 했나? 라는 생각이 들기도 하실겁니다. 그리고 084e0343a0486ff05530df6c705c8bb468a1554e9d53ec0c6a321c0107722bc4를 예로 들어서 둘로 나누면 084e0343a0486ff05530df6c705c8bb4, 68a1554e9d53ec0c6a321c0107722bc4로 나뉘죠? MD5 해쉬일 가능성이 높으므로 바로 디코딩을 시도해봅시다. 084e0343a0486ff05530df6c705c8bb4를 디코딩하였더니 guest란 값을 얻을수 있었고 68a1554e9d53ec0c6a321c0107722bc4란 값을 변환하니 실패하여 아무런 값도 얻을수 없었습니다. 


하지만 뒤의 값이 항상 변하는것을 보니 시각과 연관이 있고, MD5 해쉬와 비슷하지 않습니까? '앞의 32자리의 MD5 해쉬값은 계정 아이디를 의미하고 뒤의 암호화된 값은 접속한 시각을 나타내는것 같다'라고 생각해볼수도 있습니다. 우선 admin을 MD5로 암호화합시다. 그러면 아래와 같은 값을 얻을 수 있습니다.


21232f297a57a5a743894a0e4a801fc3


그런 뒤에 페이지로 돌아가 자세히 살펴봅시다. 우선 공지사항을 봅시다. 제일 첫번째로 올라온 공지사항이 'Open!'으로 2008.06.10 09:12:21에 올라왔음을 알 수 있습니다. 여기서 한가지 더 생각할 수 있습니다. 관리자가 공지사항을 올리기 전 로그인을 해야하므로 '로그인한 시각은 2008.06.10 09:12:21 전이다'라고 생각해볼 수 있습니다.


그리고 또하나의 결정적 힌트는 메인 페이지의 삽질 이미지(?)입니다. 그렇습니다. 삽질이랑 관계가 있다는 말과 같습니다. 바로 삽질에 들어갑시다. 일일히 사이트로 들어가서 디코딩 하는 방법도 있지만 편하게 PHP를 이용하는 방법이 있습니다. 내장함수인 md5 함수와 mktime 함수를 이용해서 편하게 뽑아낼수 있죠.


<?

$currenttime = mktime(9, 12, 20, 6, 10, 2008);

// currenttime 변수에 2008년 6월 10일 9시 12분 21초를 타임스탬프 값으로 변환한 것을 저장


for($i = 0; $i <= 20; $i++) // 0~20, 총 21번 루프를 돈다. (~2008.06.10 09:12:00)

echo (20 - $i) . "초 : " . md5(admin) . md5($currenttime - $i) . "<br>";

// 타임스탬프 값에서 i만큼 뺀 뒤에 MD5로 암호화 한 값과 admin을 암호화 한 값 출력

?>


결과:

20초 : 21232f297a57a5a743894a0e4a801fc3d99f781afbfad9196f67672a2daa6a1d

19초 : 21232f297a57a5a743894a0e4a801fc3e42814a3df8b198aacf5de6dc3b1fe50

18초 : 21232f297a57a5a743894a0e4a801fc3114bae300836f4cc0dfecbeac5aa8af3

17초 : 21232f297a57a5a743894a0e4a801fc3b230002c5111eb5473cbc4478e6705cc

16초 : 21232f297a57a5a743894a0e4a801fc30299863bff27a31322420675f0355ed2

15초 : 21232f297a57a5a743894a0e4a801fc38ac6b012a9380661bb8cfd5ac3a17508

14초 : 21232f297a57a5a743894a0e4a801fc35579f45635943f78b125ee03ff34f41b

13초 : 21232f297a57a5a743894a0e4a801fc3e6a7afdfab26fb06c9c6ff2ab7150d22

12초 : 21232f297a57a5a743894a0e4a801fc3d46bc54ca64616384c21953c355b51e9

11초 : 21232f297a57a5a743894a0e4a801fc32220e8ce6f03392bb9c5420db0ad449b

10초 : 21232f297a57a5a743894a0e4a801fc391cf58a5675ed5d92a453e306b9fc80c

9초 : 21232f297a57a5a743894a0e4a801fc32bb057f4c3c20574d1d03a7dfaf91f77

8초 : 21232f297a57a5a743894a0e4a801fc349773ecbc6311b28ae9ed492a2daeab4

7초 : 21232f297a57a5a743894a0e4a801fc34f205a1857b6f0757767d6dbda48cfd3

6초 : 21232f297a57a5a743894a0e4a801fc330212eaf1416f4914c80083a7d3cf25b

5초 : 21232f297a57a5a743894a0e4a801fc3cc31a03776714a2404f668001c2bdfbc

4초 : 21232f297a57a5a743894a0e4a801fc38a6f826d37f22f4de557070c134b1503

3초 : 21232f297a57a5a743894a0e4a801fc3ad5e6b91b0cd086fc4707ee3ed62ba32

2초 : 21232f297a57a5a743894a0e4a801fc3b95698926aa4092c4f9ef07bb23238a9

1초 : 21232f297a57a5a743894a0e4a801fc31296688d71095400fe0babe1c63f8a2e

0초 : 21232f297a57a5a743894a0e4a801fc367c90cd08d7a3d88f90e63fe768f5a8c


네 다 시도해보시면 됩니다. 시도하다가 마지막으로 WOWSESSIONID를 21232f297a57a5a743894a0e4a801fc367c90cd08d7a3d88f90e63fe768f5a8c로 바꾸니 admin에 로그인이 성공했죠? 2008-06-10 09:12:00에 관리자가 로그인했음을 알 수 있습니다. 이제 Userlist를 눌러봅시다. 그럼 계정 리스트와 함께 키값이 출력되죠.


guest:guest

admin:nologin

level4:VeRY Good! My Friend!


답은 VeRY Good! My Friend! 입니다. 수고하셨습니다.