< 문제 해결 >
<?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 환경변수)를 나타낸다. 그러므로 아래와 같이 문제 해결을 해준다.
htmlspecialchars() 함수와 , str_replace() 함수를 고려해야 하므로 그림 1 과 같이 쿠키 값을 설정해 필터링을 우회해 준다.
< extract() 취약점 이해 >
예제 1)
그림 2 는 extract() 함수를 사용하고 있는 test.php 파일이다.
그림 3 과 같이 localhost/test.php 접속 시, 그림 2에 의해서 'test_string'이 페이지에 출력된다.
그림 4는 extract() 취약점을 이용, GET 전송을 통해 페이지에 출력되는 문자를 변경하고 있다.
예제 2)
한줄 평 : X-Forwarded-For 인줄.. 알았다..
< 참고 >
https://zetawiki.com/wiki/PHP_$_SERVER(%27HTTP_USER_AGENT%27)