Superkkt Blog

PHP 4.x 버전부터 register_globals=off가 기본값으로 지정되었다. 그래서 이전에 작성했던 코드들이 제대로 작동하지 않아서 수정을 해주어야 했는데, 도무지 왜 기본값을 on에서 off로 바꾼건지 이해가 되지 않았다.

좀 찾아보면 금방 이유를 알 수 있을것을 맨날 궁시렁대기만 하면서 안찾아보다가 오늘에서야 뒤져봤다. 이유는 간단했다.

if(auth_check()) {
  $auth_ok = true;
}
...
...
if($auth_ok) {
  뭔가 중요한 작업
}

위 코드는 인증과정을 진행하고 성공하면 $auth_ok 변수를 true로 설정한다. 그리고 하단에서 이 변수가 true이면 인증된 사용자로 간주해서 뭔가 중요한 작업을 진행하는데..

만약 register_globals=on 상태이면 GET/POST로 넘어오는 모든 변수가 그대로 사용 될 수 있기 때문에 아래와 같은 치명적인 취약점이 발생한다.

http://yourdomain.com/test_code.php?auth_ok=1

위 URL을 사용해서 접속하면 register_global=on 상태에서는 $auth_ok 변수가 true인걸로 되버린다. 그래서 인증 과정에서 통과를 못하더라도 "뭔가 중요한 작업"이 실행된다.

그럼 register_globals=off 상태에서는 어떨까?

이 상태에서는 GET으로 넘어오는 변수는 $_GET['변수명'], POST로 넘어오는 변수는 $_POST['변수명']으로만 사용이 가능하다. 즉, $_GET['auth_ok'], $_POST['auth_ok'], $auth_ok 이렇게 3개의 변수가 모두 다른 변수로 사용된다. 고로 위와 같은 URL로 들어오더라도 $_GET['auth_ok'] 변수만 생성되기 때문에 절대로 $auth_ok라는 변수에 영향을 줄 수 없다.
2006/06/08 18:32 2006/06/08 18:32

trackbacks

trackbacks rss

이 글에는 트랙백을 보낼 수 없습니다

Leave a Comment