1) register_globals
이 옵션은 PHP설정 중에 가장 위험하다. 만일 이 값이 off (PHP 4.2부터 디폴트 값 )가 아니라on (PHP 4.1이전 버전의 디폴트 값)으로 설정되어 있다면 EGPCS 변수는 전역 변수로 등록된다. 여기에는 몇 가지 위험 요소가 있다.
가장 중요한 것은 사용자는 변수가 어디에서 나왔는지 (POST , GET , 쿠키) 확인할 필요가 없기 때문에 변수 값을 속일 수 있게 된다. 이 한가지 요소가 다른 대부분의 PHP 보안 문제를 일으킨다. 따라서 이 값을 off (추천)로 설정하면 track_vars를 on으로 설정한다.
2) register_globals의 위험성
PHP가 제공하는 가장 편리하면서도 위험한 기능은 변수를 선언할 필요가 없다는 것이다. 단지 사용하기만 하면 된다. 이 기능은 매우 널리 사용되지만 register_globals 설정과 함께 사용하면 어플리케이션의 보안 문제가 생길 수도 있다.
아래의 간단한 스크립트를 예로 들어보자. 이 스크립트는 폼을 통해 사용자의 이름과 암호를 받는다. 그 다음 인증 작업을 하고 인증이 되면 특정 페이지에 접근할 수 있도록 한다.
-----------
코드 생략
-----------
초보자의 눈으로 보면 별 다른 문제가 없어 보이지만 엄청난 보안 문제가 숨어 있다. 누군가가 로그인을 요청하면 이 정보는 다음과 같이 전송된다. http://www.yourdomain.com/test.php?user=admin&pass=password.
여기서 $loggedin에 1을 설정하면 secretpage.html 페이지에 접근 할 수 있게 된다.
이 문제의 원인은 사용자가 입력할 수 있는 값을 사용자 이름과 아이디로 제한하지 않았기 때문이다. 따라서 사용자는 쿼리 문자열 뒤에 http://www.yourdomain.com/test.php?loggedin=1과 같이 원하는 것을 얼마든지 추가할 수 있다.
이제 누군가가 이 페이지를 요청하면 if ($loggedin == 1) 문이 참이 되어 로그인을 하지 않고 해당 페이지에 접근할 수 있다.
이 사례를 통해 몇 가지 교훈을 얻을 수 있다. 비록 register_globals은 훌륭한 기능이며 PHP프로그램을 빠르게 만들 수 있게 해 주지만 보안상 위험하다. 대신 다음과 같은 두 가지 방법이 있다.
- register_globals 을 off로 설정하고 대신 연관배열 $HTTP_*_VARS 를 사용한다.
- 모든 변수를 명시적으로 초기화한다. 이 스크립트의 경우 맨 앞에 $loggedin = 0; 을 추가하면 문제를 해결할 수 있다. 모든 변수를 초기화하는 방법은 단점은 코드가 수천 줄일 경우 공격의 의심이 가는 변수를 찾아내기 어렵다는 것이다.
register_globals에 의존하는 대신 $HTTP_*_VARS 배열을 사용하는 것이 중요하다. PHP 스크립트에서 발생하는 대부분의 공격은 이 기능을 악용하는 것이다.
PHP 4.2.0 버전부터 PHP 개발팀은 이 기능을 디폴트 사용할 수 없도록 했다. 그러나 php.ini 파일에서 on으로 설정하면 얼마든지 사용할 수 있다.
PHP에서 프로그래밍을 할 때 오직 한가지만 기억해야 한다면 바로 register_globals 기능을 끄거나 모든 변수를 초기화 하라는 것이다. 이렇게 하면 공격의 90%를 막을 수 있다.
션(Shaun Clowes)은 register_globals 을 사용하거나 초기화를 하지 않았을 때 발생하는8가지 다른 공격을 강조했다. 그의 글 ' A Study in Scarlet- Exploiting Common Vulnerabilities in PHP Applications '은 http://www.securereality.com.au/studyinscarlet.txt에서 볼 수 있다. 이 문서를 읽고 나면 다음과 같은 의문이 생긴다. 'register_globals 을 off로 하면 얼마나 많은 공격 방법이 있을까?' 정답은 '없다'이다.
항상 $HTTP_POST_VARS를 사용해야 하는 불편함을 없애기 위해 PHP 개발 팀은 $_POST, $_GET, $_COOKIE, $_ENV와 같은 배열을 추가했다.
register_globals 가 off된 환경에서는 다음과 같이 전역 변수를 등록해서 기존 스크립트를 간단히 수정할 수 있다. 앞의 스크립트는 맨 위에 다음 행을 추가하면 된다.
$user = $_GET["user"];
$pass = $_GET["pass"];
이 옵션은 PHP설정 중에 가장 위험하다. 만일 이 값이 off (PHP 4.2부터 디폴트 값 )가 아니라on (PHP 4.1이전 버전의 디폴트 값)으로 설정되어 있다면 EGPCS 변수는 전역 변수로 등록된다. 여기에는 몇 가지 위험 요소가 있다.
가장 중요한 것은 사용자는 변수가 어디에서 나왔는지 (POST , GET , 쿠키) 확인할 필요가 없기 때문에 변수 값을 속일 수 있게 된다. 이 한가지 요소가 다른 대부분의 PHP 보안 문제를 일으킨다. 따라서 이 값을 off (추천)로 설정하면 track_vars를 on으로 설정한다.
2) register_globals의 위험성
PHP가 제공하는 가장 편리하면서도 위험한 기능은 변수를 선언할 필요가 없다는 것이다. 단지 사용하기만 하면 된다. 이 기능은 매우 널리 사용되지만 register_globals 설정과 함께 사용하면 어플리케이션의 보안 문제가 생길 수도 있다.
아래의 간단한 스크립트를 예로 들어보자. 이 스크립트는 폼을 통해 사용자의 이름과 암호를 받는다. 그 다음 인증 작업을 하고 인증이 되면 특정 페이지에 접근할 수 있도록 한다.
-----------
코드 생략
-----------
초보자의 눈으로 보면 별 다른 문제가 없어 보이지만 엄청난 보안 문제가 숨어 있다. 누군가가 로그인을 요청하면 이 정보는 다음과 같이 전송된다. http://www.yourdomain.com/test.php?user=admin&pass=password.
여기서 $loggedin에 1을 설정하면 secretpage.html 페이지에 접근 할 수 있게 된다.
이 문제의 원인은 사용자가 입력할 수 있는 값을 사용자 이름과 아이디로 제한하지 않았기 때문이다. 따라서 사용자는 쿼리 문자열 뒤에 http://www.yourdomain.com/test.php?loggedin=1과 같이 원하는 것을 얼마든지 추가할 수 있다.
이제 누군가가 이 페이지를 요청하면 if ($loggedin == 1) 문이 참이 되어 로그인을 하지 않고 해당 페이지에 접근할 수 있다.
이 사례를 통해 몇 가지 교훈을 얻을 수 있다. 비록 register_globals은 훌륭한 기능이며 PHP프로그램을 빠르게 만들 수 있게 해 주지만 보안상 위험하다. 대신 다음과 같은 두 가지 방법이 있다.
- register_globals 을 off로 설정하고 대신 연관배열 $HTTP_*_VARS 를 사용한다.
- 모든 변수를 명시적으로 초기화한다. 이 스크립트의 경우 맨 앞에 $loggedin = 0; 을 추가하면 문제를 해결할 수 있다. 모든 변수를 초기화하는 방법은 단점은 코드가 수천 줄일 경우 공격의 의심이 가는 변수를 찾아내기 어렵다는 것이다.
register_globals에 의존하는 대신 $HTTP_*_VARS 배열을 사용하는 것이 중요하다. PHP 스크립트에서 발생하는 대부분의 공격은 이 기능을 악용하는 것이다.
PHP 4.2.0 버전부터 PHP 개발팀은 이 기능을 디폴트 사용할 수 없도록 했다. 그러나 php.ini 파일에서 on으로 설정하면 얼마든지 사용할 수 있다.
PHP에서 프로그래밍을 할 때 오직 한가지만 기억해야 한다면 바로 register_globals 기능을 끄거나 모든 변수를 초기화 하라는 것이다. 이렇게 하면 공격의 90%를 막을 수 있다.
션(Shaun Clowes)은 register_globals 을 사용하거나 초기화를 하지 않았을 때 발생하는8가지 다른 공격을 강조했다. 그의 글 ' A Study in Scarlet- Exploiting Common Vulnerabilities in PHP Applications '은 http://www.securereality.com.au/studyinscarlet.txt에서 볼 수 있다. 이 문서를 읽고 나면 다음과 같은 의문이 생긴다. 'register_globals 을 off로 하면 얼마나 많은 공격 방법이 있을까?' 정답은 '없다'이다.
항상 $HTTP_POST_VARS를 사용해야 하는 불편함을 없애기 위해 PHP 개발 팀은 $_POST, $_GET, $_COOKIE, $_ENV와 같은 배열을 추가했다.
register_globals 가 off된 환경에서는 다음과 같이 전역 변수를 등록해서 기존 스크립트를 간단히 수정할 수 있다. 앞의 스크립트는 맨 위에 다음 행을 추가하면 된다.
$user = $_GET["user"];
$pass = $_GET["pass"];