아래는 서버 코드이다.
<?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>";
}
?>
대충 해석하면 reomote addr을 변조하고 replace우회를 피해서 마지막에는 127.0.0.1로 맞추는 문제였다.
이때는 $_SERVER['REMOTE_ADDR']와 혼동하여 패킷을 잡아서 접속자의 ip를 변조한다고 생각했다.
일단 아래처럼 구글링을 했다.
구글링을 하며 또 $_GET['REMOTE ADDR']과 혼동하여 아래처럼도 했었다.
replace를 우회하기 위해 value는 저렇게 입력했다.
아무튼 $_GET도 아니고 $_SERVER도 아니 그저 일반 변수였다.
선언한걸 본적이 없는데 어떻게 그럴 수 있었을까 의문이 들어서
아래에 extract함수를 알아보았다.
extract함수는 연관배열에서 예시로
key1:123
key2:1234
이렇게 있다면
$key1=123
$key2=1234
처럼 자체적인 변수로 만들어주는 함수이다.
extract($_SERVER)와 extract($_COOKIE)가 있다.
처음에 웹페이지에 나의 ip가 뜨는 것은 $_SERVER를 extract로 각각의 변수로 만들어주기 때문에 $REMOTE_ADDR이라는 변수가 생겼던 것이다.
쿠키에도 extract변수를 사용한다는 점을 참고하고 쿠키가 서버 다음 줄에 선언되기 때문에 쿠키에서 생긴 $REMOTE_ADDR로 덮어 씌워질 것이다.
그러면 쿠키에 REMOTE_ADDR을 추가하여 변수로 만들어주면 되겠다.
아래는 쿠키를 만들어본 것이다.
처음에는 ..은 .으로 바뀐다는 생각에 ..만 넣어줬다 그렇게 만들고 새로고침을 해주었더니 아래와 같이 떴다.
위와 같이 떴다는 것은 12와 12 둘 다 사라진 것이고 7은 잘되었다.
그리고 .이 없기 때문에 .을 하나 더 추가해야할 것 같다.
그래서 아래와 같이 수정을 했다.
그랬더니 $_COOKiE의 요소 중에 REMOTE_ADDR이 변수가 되어 replace를 다 우회하고 127.0.0.1로 if문에 들어오게 되어서 flag를 얻을 수 있었다.