좀 찾아보면 금방 이유를 알 수 있을것을 맨날 궁시렁대기만 하면서 안찾아보다가 오늘에서야 뒤져봤다. 이유는 간단했다.
if(auth_check()) {
$auth_ok = true;
}
...
...
if($auth_ok) {
뭔가 중요한 작업
}
$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라는 변수에 영향을 줄 수 없다.

comments
comments rss (+댓글 쓰러가기)