본문 바로가기
Webhacking.kr

[Webhacking.kr] old-24 풀이

by ris 2024. 12. 14.

php의 문법을 알고 있다면 쉽게 풀 수 있는 문제였다.

 

처음 들어온다면 자신의 ip와 자신이 쓰고 있는 브라우저의 버전과 이름, 운영체제, 엔진 정보, 장치 정보 등이 보일 것입니다.

 

<?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>

 

코드에서 중요한 것을 보니 extract라는 문법이 보입니다.

extract는 나중에 제가 따로 다룰 예정이니 간단히 설명하자면

 

PHP에서는 배열(array)를 파이썬의 딕셔너리와 같이 사용합니다. *키 : 값

그리고 extract는 이 배열의 키와 값들을 각각 변수의 이름과 값으로 나누어 선언해주는 함수입니다.

extract($_SERVER);

 

그럼 이건 뭘까요?

이걸 알려면 PHP의 목적을 알아야합니다.

 

결국 PHP는 동적 웹사이트를 쉽게 만드려는 목적을 가지고 있습니다.

이 목적을 이루기 위해서는 웹과 서버를 다룰 수 있어야합니다.

이중 서버를 다루기 위해 만든게 $_SERVER이란 슈퍼글로벌 변수입니다.

그리고 배열이죠.

$_SERVER에서는 서버의 각종 데이터들을 키와 값으로 나누어 저장하고 있습니다.

ex) $_SERVER['REMOTE_ADDR'] = (클라이언트의 ip주소)

 

고로 extract($_SERVER)은 이런 서버의 키와 값들을 변수의 형태로 바꿔서 쉽게 다룰 수 있도록 변형한 겁니다.

그리고 다음 줄에 있는 extract($_COOKIE)는 당연히 쿠키의 데이터를 변수로 바꾼 것이죠.

*쿠키는 키 : 값의 형태를 띕니다.

 

그럼 이제 이 문제의 조건을 알아보죠.

이 문제는 서버에서 REMOTE_ADDR의 값을 127.0.0.1로 읽으면 깨집니다.

그런데 아까 extract($_SERVER)에서 클라이언트에서 직접 보낸다고 했죠?

이 말은 즉, 변조가 가능합니다.

그리고 이와 더불어 다음 줄에 extract($_COOKIE)가 있는데 extract 함수는 뒤에 나온 함수와 앞에 나온 함수에서 동일한 변수가 있다면 뒤에 나온 함수의 변수 값이 최종 변수값이 됩니다.

 

즉 REMOTE_ADDR이란 쿠키를 만들고 그곳에 127.0.0.1이란 값을 넣으면 끝이죠.

그런데 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);
  }

 

htmlspectialchars는 XSS 공격을 방지하기 위해 특수 문자들을 HTML 엔티티로 변환합니다.

ex) & -> &amp;

 

그리고 순차적으로

  1. .. -> .
  2. 12 -> ""
  3. 7. -> ""
  4. 0. -> ""

이 조건들을 모두 통과한 값이 127.0.0.1이면 됩니다.

그리고 이 값은 직접 풀고 싶으신 분들이 있을 수도 있으니 맨 아래에 기재하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

답 : 112277....00....00....1

'Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old 20 해설  (0) 2025.01.04
[Webhacking.kr] old-39 풀이  (0) 2024.12.29
[Webhacking.kr] old-38 풀이  (1) 2024.12.15
[Webhacking.kr] old-54 풀이  (1) 2024.12.14
[Webhacking.kr] old-01 풀이  (0) 2024.12.14