24번 문제의 메인화면이다. 소스코드를 확인해보자.
중요한 부분만 간단히 확인해보겠다.
<?php
extract($_SERVER); //$_SERVER의 값을 변수화
extract($_COOKIE); //$_COOKIE의 값을 변수화
$ip = $REMOTE_ADDR; //ip 변수에 $REMOTE_ADDR의 값 저장
$agent = $HTTP_USER_AGENT; //agent 변수에 $HTTP_USER_AGENT의 값 저장
if($REMOTE_ADDR){ //$REMOTE_ADDR의 값이 존재한다면
$ip = htmlspecialchars($REMOTE_ADDR); //$REMOTE_ADDR의 값에서 특수문자를 html 엔터티로 변환해 ip에 재저장
$ip = str_replace("..",".",$ip); //ip의 값에서 ".."를 "."로 치환
$ip = str_replace("12","",$ip); //ip의 값에서 "12"를 공백으로 치환
$ip = str_replace("7.","",$ip); //ip의 값에서 "7."를 공백으로 치환
$ip = str_replace("0.","",$ip); //ip의 값에서 "0."를 공백으로 치환
}
if($HTTP_USER_AGENT){ //$HTTP_USER_AGENT의 값이 존재한다면
$agent=htmlspecialchars($HTTP_USER_AGENT); //$HTTP_USER_AGENT의 값에서 특수문자를 html 엔터티로 변환해 agent에 재저장
}
echo "<table border=1><tr><td>client ip</td><td>{$ip}</td></tr><tr><td>agent</td><td>{$agent}</td></tr></table>"; //테이블 형태로 $ip와 $agent의 값을 보여줌
if($ip=="127.0.0.1"){ //ip가 127.0.0.1이라면
solve(24); //문제해결
exit();
}
else{ //ip가 127.0.0.1이 아니라면
echo "<hr><center>Wrong IP!</center>"; //Wrong IP!를 출력
}
?>
extract( ) : 배열 속의 키값을 변수화 시키는 함수
htmlspecialchars( ) : 문자열에서 특정한 특수문자를 html 엔터티로 변환하는 함수
$REMOTE_ADDR : 클라이언트의 IP를 가져오는 PHP의 환경변수
$HTTP_USER_AGENT : 클라이언틔의 접속환경 정보를 가져오는 PHP의 환경변수
***여기서는 $_SERVER 보다 $COOKIE가 나중에 처리되었기 때문에 위의 두 환경변수들을 쿠기로 조작할 수 있다!!!
결과를 확인해보기 위해 REMOTE_ADDR이라는 COOKIE를 만들어 그 값에 127.0.0.1을 넣어보았다.
결과는 위와 같다. 1이 나온 이유는 str_replace로 한번 검열이 되기 때문인데 (12)(7.)(0.)(0.)1와 같이 괄호친 부분이 공백으로 대체되어 ip의 값이 1이 된 것이다.
str_replace는 처음 한 번 변수에 저장된 값을 검사해 치환을 하고 그 후 저장된 값에 대해서는 검사를 하지 않는다.
따라서 str_replace가 실행된 후의 결과가 127.0.0.1인 값을 REMOTE_ADDR의 COOKIE값으로 넣어보자.
112277...00...00...1 값을 넣어보자. 1(12)27(7.)(.. -> .)0(0.)(.. -> .)0(0.)(.. -> .)1로 str_replace된 결과가 127.0.0.1이 나올 것이다.
그리고 새로고침을 하면
문제가 해결되었음을 확인할 수 있다!
'STUDY > WEB_Hacking' 카테고리의 다른 글
Webhacking.kr 39번 문제(old) (3) | 2019.12.20 |
---|---|
Webhacking.kr 26번 문제(old) (0) | 2019.12.18 |
Webhacking.kr 18번 문제(old) (0) | 2019.12.03 |
Webhacking.kr 17번 문제(old) (0) | 2019.11.30 |
Webhacking.kr 14번 문제(old) (0) | 2019.11.29 |