[Webhacking.kr] old-24
문제 서버에 접속하면 위와 같이 Wroing IP라는 문구가 출력되고 위에는 client ip와 agent 값이 있다. 코드는 아래와 같다.
<?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($_COOKIE);명령어는 쿠키 배열 속의 키 값들을 변수화 하는 함수이다. 예를 들어 {a:1234, b:5678} 배열이 있다고 가정하면 a=1234, b=5678과 같은 효과를 가진다. 코드 중에 주목해야 할 점은 ip 값을 REMOTE_ADDR에서 가져온다는 것이다. 따라서 extract 함수의 취약점을 이용해서 REMOTE_ADDR변수에 원하는 값을 넣을 수 있다.
위와 같이 COOKIE 값에 REMOTE_ADDR 변수를 만들어 데이터를 삽입하면 extract 함수에 의해 REMOTE_ADDR에는 127.0.0.1이라는 값이 저장된 변수가 된다.
하지만 필터링 기능때문에 127.0.0.1을 입력하면 값이 제대로 들어가지 않으므로 필터링을 우회하여 적절한 값을 넣어야 한다. 해당 값은 다음과 같다. 아래 값을 입력하고 새로고침을 하면 플래그를 획득할 수 있다.
10.270....00...00...0.1