WEB/webhacking.kr

[webhacking. kr] old-24

뇨롱 2020. 7. 31. 04:46

▷유형: PHP

 

▷문제:

문제를 클릭하면 이런 화면이 뜬다. view-source를 클릭해 문제의 페이지 소스를 보자.


<페이지 소스>

이런 소스코드가 있다. 싹 훑어보았을 때 ip의 값이 127.0.0.1일 경우 solve 함수를 실행한다.

소스코드를 자세하게 봐보자

 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 24</title>
</head>
<body>
<p>
<?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>";
  }
?><hr>
<a href=?view_source=1>view-source</a>
</body>
</html>

 

[24번에서 쓰인 문법과 용어]

extract() 함수

: $_GET[], $_POST[]의 변수값을 일반 변수로 변환한다.

 

◇예시:

$a[f_n]="sb"
$a[l_n]="kim"
$a[birth]="2000"
extract($a);
echo "$f_n";
echo "$l_n";
echo "$birth";

>>>sb kim 2000

 

body 부분의 코드를 따로 살펴보면,

더보기
<?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>";
  }
?>

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

extract함수를 통해 $_SERVER와 $_COOKIE로 전달된 모든 변수명이 생성되고 값이 저장되었을 것이다.

 

 

$_SERVER함수에서 $REMOTE_ADDR를 인자로 받으면 사이트 접속한 사용자의 ip가 값으로 나온다.

형식:

$_SERVER['REMOTE_ADDR'] = 사이트 접속한 사용자 IP = xxx.xxx.xxx.xxx

 

HTTP_USER_AGENT를 인자로 받으면 사이트에 접속한 사용자의 환경이 나온다.

형식:

$_SERVER['HTTP_USER_AGENT'] = 사이트 접속한 사용자 환경 = Mozilla4.0(compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705

 

 

$ip = $REMOTE_ADDR;
$agent = $HTTP_USER_AGENT;

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에 들어간 문자열이 전혀 다른 걸로 대체된다.

..→.

12,7.,0. → 공백

ip에 "127.0.0.1이란 값이 들어가면 solve함수가 실행되고 문제가 풀린다!  ⇒최종 ip가 127.0.0.1 로 되야한다.!!

그러므로 $REMOTE_ADDR 쿠키를 만들어 줄때 처음부터 이 상황을 고려하고 만든다.

 

$_COOKIE에 $REMOTE_ADDR를 새로 만들어 준다.

⇒editthiscookie프로그램으로 쿠키를 생성한다.

127.0.0.1이 출력되어야하므로

1(12)27(7.)..0(0.)..0(0.)..1 을 넣으면 된다.

 

 

 

생성되었다@.@

 

다시 문제 창을 새로고침을 하면 문제가 풀린다.