프로젝트/Webhacking.kr

[Webhacking.kr] Challenge(old) 24번 문제

Uggjjini 2021. 7. 8. 10:38

문제 페이지는 해당 페이지와 같다.

 

 

해당 페이지에는 client ip 주소와 agent 정보가 출력되는 표와 view-source 링크가 존재한다.

 

view-source 링크를 통하여 소스페이지를 확인한다.

 

 

마지막 부분의 조건문을 확인하면

 

if($ip=="127.0.0.1"){
    solve(24);
    exit();
  }

 

출력되는 ip 정보가 127.0.0.1이 되면 문제가 풀리는 것을 확인할 수 있다.

 

소스페이지 중간의 php 부분을 중심으로 해석해 본다.

 

<?php
  extract($_SERVER);
  extract($_COOKIE);
  $ip = $REMOTE_ADDR;
  $agent = $HTTP_USER_AGENT;

 

extract() 함수는 배열 속의 키값을 변수화 시켜주는 함수이다.

 

이 함수에 $_SERVER를 적용하여 서버와 실행환경의 정보를 변수화 시키고, $_COOKIE 를 적용하여 쿠키값을 변수화 시킨다.

 

 

 

$ip 변수에 저장되는 $REMOTE_ADDR 은 웹 서버에 접속하는 사용자의 ip 주소를 가져온다.

 

$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);
  }

 

$REMOTE_ADDR 값이 존재할 경우 if 조건문이 실행된다.

 

$REMOTE_ADDR 정보를 htmlspecialchars()함수를 통해 html 엔티티로 변환하여 $ip 변수에 저장한다.

 

$ip 변수의 '..' 문자를 '.' 으로 '12','7.','0.'을 공백으로 치환한다.

 

 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>";

 

$HTTP_USER_AGENT 값이 존재한 경우 html 엔티티로 변환하여 $agent 값에 저장한다.

 

 

  if($ip=="127.0.0.1"){
    solve(24);
    exit();
  }
  else{
    echo "<hr><center>Wrong IP!</center>";
  }
?>

 

해당 조건문을 실행하도록 하기 위해서는 $REMOTE_ADDR 값을 조작하여 $ip 변수가 127.0.0.1이 되도록 해야 한다.

 

<?php
  extract($_SERVER);
  extract($_COOKIE);

 

 

다시 php 부분의 상단으로 되돌아가서 보면,

 

extract() 함수에 $_SERVER를 적용시킨 후  $_COOKIE를 적용시켰기 때문에 $_SERVER 의 키의 이름이 $_COOKIE의 키와 동일하다면 그 이름을 가진 변수는 $_COOKIE의 값을 가지게 된다.

 

따라서 쿠키값을 통하여 $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);
  }

 

해당 조건문을 참고하여 $REMOTE_ADDR 값이 127.0.0.1 이 되는 값을 생각해본다.

 

1 12 27 7. .. 0 0. .. 0 0. .. 1
변환
1   27   . 0   . 0   . 1

 

$REMOTE_ADDR 이라는 쿠키를 생성하고 값에 112277...00...00...1를 넣어주면 해당 문제가 풀릴 듯 하다.

 

 

개발자도구를 통하여 쿠키를 생성하고 새로고침을 눌러주면 해당 문제가 풀린다.