[webhacking.kr] 문제풀이 No.1

박준서·2021년 9월 16일
0

webhacking-kr

목록 보기
1/7
post-thumbnail

[ webhacking.kr 사이트의 문제에 대한 풀이입니다. ]

앞으로 차례대로 webhacking.kr 의 문제들에 대한 풀이를 내가 아는 선에서 올릴 예정이다. 아직 작성자 본인도 웹해킹에 대해 미숙한지라 독자와 함께 성장하는 방향(?)으로 나아갈 예정이다.

각설하고 바로 풀이로 들어가겠다.

우선 문제 페이지에 접속하게 되면 아래와 같은 화면을 마주하게 된다.

가운데에 level : 1 이라는 글자와 함께 밑에 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>");
  }
?>

우선 코드의 가장 첫 단락이다.
config.php를 include로 포함시키고,
사이트 주소의 쿼리 중 view-source가 1이라면
view_source(); 함수를 실행하여 코드를 보여준다.
이는 우리가 접속해 있는 페이지의 주소의 끝에
?view-source=1가 붙어있으므로 확인할 수 있다.

다음 코드는 $_COOKIE['user_lv']을 통해 쿠키 값 중에 'user_lv'이라는 이름을 가진 쿠키를 조회하는 코드로 해석할 수 있다.

여기서 "쿠키(Cookie)"란 무엇일까?

HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각입니다.
브라우저는 그 데이터 조각들을 저장해 놓았다가,
동일한 서버에 재 요청 시 저장된 데이터를 함께 전송합니다.

위의 내용은 MDN WEB Docs 에서 확인할 수 있는 쿠키에 관한 내용이다.
(해당 문서에 개발을 하면서 상당히 유용한 정보가 많이 들어있으므로 알아두는 것을 추천한다.)

문서에 따르면 브라우저에 사용자의 데이터를 저장해 놓는 일종의 메모라고 볼 수 있다. 쿠키는 다양한 방법으로 이용되는데, 웹해킹을 하며 쿠키를 이용한 공격도 상당히 자주 쓰인다고 들은 기억이 있다.

쿠키를 이용하는 방법중 가장 대표적으로 우리가 만나는 것이 있다.
웹서핑을 하며 사이트 중 가끔 어떠한 언어를 이용할지 선택할 지 묻는 사이트들이 있는데, 우리가 이용할 언어를 선택하면 그 데이터는 사용자의 브라우저(크롬, 엣지등)에 전송하여 저장해놓는다.
추후 우리가 해당 사이트에 다시 접속할 때는 다시 묻지 않고 전에 선택한 언어로 보여주는 이유도 여기에 있다.
(물론 우리가 쿠키를 삭제한다면 저장된 정보가 사라져 사이트에서 접속시 다시 묻는 경우가 생긴다.)

더 자세한 정보는 위에 걸어둔 MDN WEB Docs 링크에서 확인하기 바란다.

다시 돌아와서...

if(!$_COOKIE['user_lv']){
	...
}

위와 같은 코드는 저장된 쿠키 값 중에 'user_lv' 이름을 가진 쿠키 값이 있는지 확인한다. 위와 같이 앞에 !가 붙은 경우 쿠키 값이 없을 경우를 의미한다.

SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");
echo("<meta http-equiv=refresh content=0>");

if 문 속에는 SetCookie();를 통해 쿠키값을 설정해준다.
해당 함수의 파라미터(인자)는 간단하게 정리만 하고 넘어가자.

SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");
// SetCookie(쿠키이름, 쿠키값, 만료시간, 적용 주소);

그 밑의 echo(...); 코드는 아래에 관련 블로그 링크를 통해 알아보자.
echo(...); 관련 블로그 글

이제 첫 단락의 해석이 끝났다.

사실 첫 단락은 우리의 풀이에 직접적으로 도움이 되지는 않으나, 우리는 초보니까(?) 꼼꼼하게 알고 넘어가면 좋을 듯 하여 작성하였다.

이어서 코드를 해석해 보겠다.

위의 첫 단락 이후에는 익숙한 html 태그가 보인다.
페이지를 구성하는 html 소스를 담은 부분이다.
(크게 중요하지 않으므로 넘어가자...)

이제 풀이의 메인 소스코드를 확인해보자!

<?php
  if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>=4) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>3) solve(1);
  echo "<br>level : {$_COOKIE['user_lv']}";
?>

위와 같이 생긴 코드인데, php 코드로 작성되어 있다.

사실 작성자 본인도 php보다는 js 코드가 더 익숙한데, 문법으로 표현하는 방법에 있어서 구조가 비슷하여 해석하는데에 큰 어려움을 느끼지는 못했다.

그러니 php를 크게 알지 못해도 너무 걱정하지 말자.

( js 를 알고 있다는 가정하에 말하는거지만, 만약 아는 언어가 없다면 웹해킹보다 먼저 프로그래밍 언어 하나는 공부하고 오는것을 추천한다 )

첫번째 if 문 부터 해석해보자면,
is_numeric() 함수를 통해 해당 쿠키값이 "숫자값"인지를 확인하는 코드이다.
정확히는 numeric 이나 numeric string인지를 확인하는 함수이다.
예로는 57, '42', 1001.0, '1998.1' 등의 값이라면 true를 반환한다.

그러므로 만약 쿠키 값으로 부터 is_numeric이 false가 반환된다면 쿠키 값을 1로 바꿔주는 코드인 것이다.

if($_COOKIE['user_lv']>=4) $_COOKIE['user_lv']=1;

다음 줄인데, 위의 과정들을 모두 이해했다면 여기서 부터는 해석이 쉬워진다.
if 문을 통해 쿠키 값이 4보다 같거나 크다면 쿠키 값을 1로 바꿔준다.

if($_COOKIE['user_lv']>3) solve(1);

위와 같은 방법을 다음 줄도 해석하면
쿠키 값이 3보다 크다면 solve(1); 함수를 실행시켜준다.
이름을 통해 solve() 함수가 문제의 해결을 뜻함을 알 수 있다.
이를 통해 우리는 위의 조건을 모두 만족하며 3보다 큰 값으로 쿠키 값을 지정해주면 문제를 풀 수 있음을 알 수 있다.

조건을 모두 조합하여 정리해보자면,
(1) numeric 이여야 한다.
(2) 쿠키 값은 4와 같거나 크지 않아야한다.
(3) 쿠키 값은 3보다 커야한다.

이를 수식적으로 표현하면,
4 > $_COOKIE['user_lv'] > 3 이다.

그러므로 우리는 쿠키값을 위의 식을 만족하는 값으로 바꿔주면 되는것이다.

쿠키 값은 어떻게 바꿀까

정말 수없이 많은 방법이 존재하겠지만, 나는 두가지 방법을 소개하겠다.

[1] 개발자 도구의 Application을 이용한 변조

(크롬 기준으로 설명하겠다.)
크롬 개발자 도구는 웹해킹에서 정말 유용하게 쓰이므로 사용법을 잘 익혀두는 것이 정말 크게 도움이 된다.

크롬 개발자 도구는 Ctrl + Shift + I 또는 F12 키를 통해 열 수 있다.

개발자 도구를 열면 위에 굉장히 많은 기능들이 있는데, 이 방법에서는 우선 Application 탭을 통해 해결해 보겠다.

Application 탭을 열면 왼쪽에 많은 목록이 보일텐데, 우리는 그중에 Cookies 만 보면 된다.

Cookies 를 클릭하면 사진과 같이 아래에 webhacking.kr이 뜨는데, 이를 클릭해보자.

그럼 약 두가지 (환경에 따라 다를 수 있다) 쿠키 값이 보일텐데, 그 중 Name 칸에 user_lv이라고 적힌 줄을 확인해보자.

그럼 여러가지 값들이 옆에 보일텐데, 그 중 1로 설정되어 있는 Value 가 있을 것이다. (만약 Cookie를 이전에 변조하지 않았다면 1일 것이다.)

이 값을 더블 클릭하면 값을 변조할 수 있는데, 이제 값을 넣는 일만 남았다.

해당 칸에 위의 조건에 맞는 수 아무거나 (작성자의 경우 편의를 위해 3.5로 했다.)
값을 바꾸고 새로고침을 하면!

해결했다는 alert 창이 뜰것이다! 드디어 첫 문제를 해결했다.

그러나 해결해서 기쁜 마음은 잠시 접어두고, 한가지 방법만 더 테스트 해보자.

바로 크롬 개발자 도구의 Console을 이용한 방법이다.
이 방법의 장점은 자바스크립트 코드를 실행하여 쿠키를 변조할 수 있다는 점이다.

[2] 개발자 도구의 Console(+js)를 이용한 변조

각설하고 바로 Console 창에 들어가보자.

그럼 빈 화면에 커서가 깜빡이고 있을 것이다.
여기에 바로 스크립트를 입력하면 된다.

우선 아래의 코드를 따라 쳐보자

document.cookie

엔터를 치면 아래와 같이 결과 값이 나올거다

'user_lv=1' //결과 값은 다를 수 있다.

이게 현재 쿠키 값이 되는 것이다. 그럼 이걸 바꿔주면 되니까

document.cookie = 'user_lv=3.5'// 쿠키값 바꾸기
location.reload() // 페이지 새로고침 코드로, 선택 사항이다.

그럼 [1]의 Application 방법과 같이 풀릴 것이다!

마무리하며...

지금까지 webhacking.kr 의 1번 문제에 대하여 알아보았다.
적으면서도 너무 지엽적인 것까지 쓴 것이 아닌지 걱정이 되었다.
(사실 지금도 걱정이다)
그래도 초보자를 위한 풀이인 만큼 최대한 아는 선에서 많은 것을 담아내려 하였다.

앞으로 꾸준히 문제 풀이를 올릴 생각인데, 코멘트 댓글에 남겨주시면 관련 피드백 감사히 받아 블로그 글을 개선해 나갈 생각이다.
(읽는 사람이 있을지...ㅎ)

정리하면서 나 나름대로도 개념을 확실히 잡은 것 같아 보람있는 글인것 같다.
앞으로 업데이트 꾸준히 오래 하겠다는 다짐과 함께 글을 마쳐보겠다.

profile
학생 개발자의 블로그입니다.

0개의 댓글