본문 바로가기

Wargame(hacking)/webhacking.kr

Webhacking.kr : old-24

< 문제 해결 >

 

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

 

php의 extract 함수에 관한 취약점이 존재한다. extract($_COOKIE)는 쿠키의 값을 변수화 함을 의미하며, 

$REMOTE_ADDR는 사용자 클라이언트 IP(클라이언트 IP를 가져오는 PHP 환경변수)를 나타낸다.  그러므로 아래와 같이 문제 해결을 해준다. 

 

그림 1

 

htmlspecialchars() 함수와 , str_replace() 함수를 고려해야 하므로 그림 1 과 같이 쿠키 값을 설정해 필터링을 우회해 준다. 

 

 

< extract() 취약점 이해 >

 

예제 1)

그림 2

 

그림 2 는 extract() 함수를 사용하고 있는 test.php 파일이다. 

 

그림 3

 

그림 3 과 같이 localhost/test.php 접속 시, 그림 2에 의해서 'test_string'이 페이지에 출력된다.

 

그림 4

 

그림 4는 extract() 취약점을 이용, GET  전송을 통해 페이지에 출력되는 문자를 변경하고 있다. 

 

예제 2)

 

그림 5

 

그림 6

 

그림 7

 

그림 8

 

 

한줄 평 : X-Forwarded-For 인줄.. 알았다.. 

 

 

< 참고 >

 

 

https://zetawiki.com/wiki/PHP_$_SERVER(%27HTTP_USER_AGENT%27) 

 

PHP $_SERVER['HTTP_USER_AGENT'] - 제타위키

다음 문자열 포함...

zetawiki.com

 

https://www.phpinfo.kr/entry/PHP-%EC%8B%A4%EC%A0%9C-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-IP%EC%A3%BC%EC%86%8C-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0

 

PHP - 실제 클라이언트 IP주소 가져오기

PHP개발을 하다보면, 부정사용을 방지하는 목적 등을 위해 사용자의 IP를 체크하는 경우가 있습니다. 보통 아래와 같이 사용하게 된다.

www.phpinfo.kr