문제 접속 시,
클라이언트의 IP와 Agent가 출력되면서,
IP가 틀렸다는 Wrong IP! 문구가 출력되는 것을 볼 수 있다.
view-source 버튼을 통해 소스코드를 살펴보니
if($ip=="127.0.0.1"){
solve(24);
exit();
}
접속한 클라이언트의 IP가 127.0.0.1여야만 문제가 풀리는 것을 확인할 수 있었다.
$ip = $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);
}
IP는 REMOTE_ADDR라는 변수의 값을 취한다.
그리고 REMOTE_ADDR 값은 str_replace를 통해 값이 필터링되고 있다.
REMOTE_ADDR 값을 127.0.0.1으로 변조시키는 것이 포인트이다.
extract($_COOKIE);
문제 코드 중
쿠키에 있는 Key:Value 배열의 값들을 변수화 시켜주는 extract 구문을 확인할 수 있었다.
쿠키 값은 사용자가 임의로 추가하거나 변조할 수 있으므로
쿠키를 사용해 REMOTE_ADDR 이름의 쿠키의 값을 127.0.0.1으로 변조할 수 있다고 생각했다.
해당 문제 페이지에 요청하는 http 헤더의 쿠키 값은
현재 PHPSESSID 값만이 존재한다.
REMOTE_ADDR라는 이름의 127.0.0.1의 값을 갖는 쿠키를 추가해 줬더니
출력되는 클라이언트 IP가 현재는 필터링 돼 1로 출력되지만 성공적으로 변조된 것을 볼 수 있었다.
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);
}
REMOTE_ADDR=17.277...00...00...1
필터링 되고 있는 값을 우회하여 REMOTE_ADDR 값을 작성한 후
쿠키 값에 담아 요청을 보내보니,
성공적으로 클라이언트 IP가 127.0.0.1로 출력되며
문제 풀이에 성공했다는 알림창을 볼 수 있다.
더보기
<?php
extract($_COOKIE)
$1 = $PHPSESSID
$2 = $REMOTE_ADDR
echo $1 // mb3bttesms5s2b9d28pkmenrso
echo $2 // 127.0.0.1
?>
'WarGame > Webhacking.kr' 카테고리의 다른 글
old - 54 (2) | 2024.06.04 |
---|---|
old-15 (0) | 2024.06.04 |