고등학생 때 웹해킹 워게임을 조금 했던 기억이 있다. 대학교에 입학하면서 해킹공부를 아예 안한 것 같아서, 까먹은 것도 많고 무뎌진 것도 많을 것 같아서 웹해킹 공부를 하면서 동시에 문제들을 풀어나갈 계획이다.
웹해킹 워게임 사이트는 굉장히 다양한데, 그 중 Webhacking.kr 이 난이도도 꽤 있고 공부하기에 좋았던 기억이 있어서 이곳에 다시 접속해봤다. 고등학생 때 쓰던 계정이 이미 있긴 한데 문제들이 어려워서 점수도 950점밖에 없고, 이 시절에 풀었던 문제들도 이제는 못 풀 실력이 되어버려서 아예 계정을 새로 만들었다.
원래 갖고 있던 지식들도 별로 없긴 했지만, 그마저도 다 잊어버린 상태라 아예 웹을 처음 공부한다고 해도 무방한 상태일 것 같아서 걱정이 가득하지만 열심히 풀어보며 공부하려고 한다.
처음 1번을 들어가면 아마 아래와 같은 화면일 것이다.
다짜고짜 level은 1이라고 하고, view-source 를 통해 현재 페이지의 소스를 구경할 수 있게 해준다. view-source를 클릭해서 들어가보면
<?php
include "../../config.php";
if($_GET['view-source'] == 1){ view_source(); }
if(!$_COOKIE['user_lv']){
SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");
echo("<meta http-equiv=refresh content=0>");
}
?>
<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<?php
if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
if($_COOKIE['user_lv']>=6) $_COOKIE['user_lv']=1;
if($_COOKIE['user_lv']>5) solve(1);
echo "<br>level : {$_COOKIE['user_lv']}";
?>
<br>
<a href=./?view-source=1>view-source</a>
</body>
</html>
이런 코드가 나온다. 그래도 아직 미미한 감각은 남아있던지, 이걸 보면서 "COOKIE 값을 다루는 문제이구나" 라는 생각을 했다. 아니 솔직히 말하면 웹해킹을 아무것도 모르는 사람이라도, 코드를 조금 읽을 줄 안다면 COOKIE라는 말이 남발하는 걸로 보아 쿠키에 대해 다루는 문제임을 느꼈을 것이다. 간단하게 쿠키 그리고 쿠키와 비슷한 세션에 대해서 알고 넘어가자.
http 프로토콜은 비연결지향성 프로토콜, 즉 연결이 계속 지속되지 않고 새로운 페이지를 요청할 때 마다 새로운 접속이 이루어지며, 이전 페이지와 현재 페이지의 관계가 지속되지 않는 구조다. 따라서 그래서 웹사이트에서 방문자가 머무르는 동안 방문자가 가지고 있어야 할 데이터를 지속시키는 방법이 두 가지가 있다. 한 가지는 쿠키를 이용하는 법, 다른 한 가지는 세션을 이용하는 법 이다.
쿠키는 모든 데이터를 클라이언트에 저장하는 반면, 세션은 서버에 데이터를 저장합니다. 이것이 둘의 가장 큰 차이다.
둘을 간단히 다뤄보자면, 쿠키는 두가지 종류가 있는데 세션 쿠키와 지속 쿠키이다. 만료 시간을 지정하지 않으면 지속 쿠키에 저장되고, 만료 시간을 지정하면 세션 쿠키로 저장된다. 세션 쿠키는 브라우저가 종료되면 쿠키는 사라지는 데 비하여 지속 쿠키는 파일로 저장되므로 브라우저가 종료되어도 쿠키는 남아있게 된다. 그리고 세션은 웹 서버에 클라이언트에 대한 정보를 저장하고 클라이언트에게는 클라이언트를 구분할 수 있는 ID를 부여한다는게 쿠키와 다르다. 이것을 세션아이디라고 하고, 클라이언트는 이를 쿠키로 저장한다. 물론 서버 또한 이 아이디를 저장하고 있다.
쿠키는 모두 클라이언트가 저장하는데 비해, 세션은 클라이언트 정보를 서버가 모두 저장하고 그에 대해 연결할 수 있는 아이디 값만 클라이언트가 갖고 있는 것이다.
아무튼 코드를 읽어보면 디폴트로 user_lv이라는 쿠키값을 1로 지정해준다는 코드가 있고, user_lv 이라는 쿠키값이 6보다 크거나 같다면 해당 쿠키값을 1로 재 지정해주고 만약 cookie값이 5보다 크다면 solve(1) 함수를 호출하는 코드가 있다. 느낌상 solve(1) 함수가 호출되게끔 쿠키값을 변조해주면 되는 문제인 것 같다는 직감이 왔다. 그러기 위해서 쿠키값의 조건을 충족하려면 6보다는 크거나 같아야하고, 5보다는 커야 한다. 따라서 5 < 쿠키값 < 6 이면 되니까, 그냥 그 사이의 값 5.5를 넣어줬더니
라며 문제를 성공적으로 풀었다고 안내해준다. 참고로 저는 맥 운영체제를 사용하고 있으며, 크롬의 쿠키변경 확장프로그램을 사용해 문제를 풀었습니다.