[webhacking.kr] 24번 문제 풀이[PHP]

1 분 소요

💡 Webhacking.kr challenge(old) 24번 문제에 대한 풀이입니다.

문제

문제 화면

image

문제 소스 코드

  <?php
  extract($_SERVER);
  extract($_COOKIE);
  $ip = $REMOTE_ADDR;
  $agent = $HTTP_USER_AGENT;
  if($REMOTE_ADDR){
    $ip = htmlspecialchars($REMOTE_ADDR);
    $ip = str_replace("..",".",$ip);
    $ip = str_replace("12","",$ip);
    $ip = str_replace("7.","",$ip);
    $ip = str_replace("0.","",$ip);
  }
  if($HTTP_USER_AGENT){
    $agent=htmlspecialchars($HTTP_USER_AGENT);
  }
  echo "<table border=1><tr><td>client ip</td><td>{$ip}</td></tr><tr><td>agent</td><td>{$agent}</td></tr></table>";
  if($ip=="127.0.0.1"){
    solve(24);
    exit();
  }
  else{
    echo "<hr><center>Wrong IP!</center>";
  }

문제 풀이

문제를 보면 $ip=="127.0.0.1"이 되면 풀리게 됩니다.이 문제를 풀기 위해서는 extract 함수를 알아야 합니다.

extract 함수의 예시는 다음과 같습니다.

  <?php
  $array['x'] = 'apple';
  $array['y'] = 'banana';
  $array['z'] = 'carrot';

  extract($array)l
  echo $x; //'apple'
  echo $y; //'banana'
  echo $z; //'carrot
  ?>

배열의 ‘key’값을 변수의 이름으로 하여 값을 선언해주는 기능을 하고 있습니다. 이번 문제에서 보면 다음과 같이 2가지 배열에 대해서 extract를 해주고 있습니다.

  extract($_SERVER);
  extract($_COOKIE);

이 중 주요한 부분은 $_COOKIE를 $_SERVER 보다 나중에 extract를 해주고 있으며, COOKIE는 사용자 측에서 설정해서 보낼 수 있으므로, $_SERVER에서 extract 된 변수들을 덮어 쓸 수 있다는 것입니다.

현재는 쿠키 값에 아무것도 넣지 않고 전송을 했기 때문에 $_SERVER[‘REMOTE_ADDR’],$_SERVER[‘HTTP_USER_AGENT’] 값이 extract 되어 화면에 출력이 되었습니다. 이 중 HTTP_USER_AGENT는 프록시 툴을 통해서 직접 USER-AGNET 헤더를 변경함으로써 $_SERVER[‘HTTP_USER_AGENT] 값을 바꿀 수도 있고, Cookie 값에 HTTP_USER_AGENT 값을 줘서 바꿀 수도 있습니다. 하지만 본 문제에서는 문제를 풀때 HTTP_USER_AGENT 는 필요가 없기 때문에 넘어가겠습니다.

문제를 풀때 필요한 부분은 $ip 변수입니다. 현재 $ip에는 $_SERVER[‘REMOTE_ADDR’]이 들어가 있습니다. 이 값을 쿠키에 줌으로써 값을 덮어 쓸 수 있습니다.

다음과 같이 쿠키 값을 추가해서 보내면 화면상에서 clinet ip가 바뀌었음을 볼 수 있습니다.

image

image

쿠키에 준 값이 서버에서 어떤 로직에 의해서 바뀌는지 중요한 라인들만 빼서 보면 다음과 같습니다.

  extract($_COOKIE);
  $ip = $REMOTE_ADDR;
  if($REMOTE_ADDR){
    $ip = htmlspecialchars($REMOTE_ADDR);
    $ip = str_replace("..",".",$ip);
    $ip = str_replace("12","",$ip);
    $ip = str_replace("7.","",$ip);
    $ip = str_replace("0.","",$ip);
  }
  if($ip=="127.0.0.1"){
    solve(24);
  }

쿠키에 설정된 ip가 다음의 규칙에 의해서 대체 됩니다.

  1. ”..” -> “.”
  2. “12” -> “”
  3. “7.” -> “”
  4. “0.” -> “”

위의 규칙들을 통과한 뒤에 127.0.0.1이 들어가도록 다음과 같이 설정해 줍니다.

112277…00…00…1

image

클리어

image

댓글남기기