이 취약점을 설명하기 전에 php 5.4 버전 이후에서는 동작하지 않는다.

해당 옵션이 사라졌기 때문에 실습을 하고 싶다면 php 5.4 이하의 버전에서 실습을 하기 바란다.

 

 

==실습환경==

apmsetup 으로 임시 서버를 열어 실습을 진행했다.

php 버전은 5.2 이다.

apmsetup 7.zip
4.50MB
apmsetup 7.z01
10.00MB
apmsetup 7.z02
10.00MB

 


 

 

 

php.ini 설정 파일에 register_globals 라는 옵션이 있다.

이 옵션을 on 하게 되면 취약점이 발생하게 된다.

 

 

  • register_globals = On

이 옵션을 On 하게 되면 GET 또는 POST 방식 등으로 전될 된 모든 변수가 자동으로 php의 변수로 변환이 된다.

코드를 예로 들어 설명하면 아래와 같다.

 

<?php 
	if(isset($get)){
		echo "success";
	}
	else{
		echo "fail";
	}
?>

 

위와 같은 코드를 작성하고 웹으로 접근을 해보면 당연히 fail 이라는 문구가 출력이된다.

 

success 문구를 띄우기 위해서 register_globals 이 on 되어 있을때 공격이 가능하다.

위에서 설명했듯이, GET 또는 POST 방식 등으로 전달하면 자동으로 php 변수로 변환이 된다.

따라서 GET 방식으로 ?get=1 이라는 값을 넘기게 되면 아래 사진처럼 success 라는 문구가 뜨는 것을 확인 할 수 있다.

 

 

 

register_globals 옵션이 위험한 이유는 만약 arbitrary code leak 공격이 가능하다면 코드의 흐름을 해석한뒤 get 방식으로 값을 보내어 조건문을 이리저리 통과가 가능해 질 수 있게 될 것이다.

 

 


 

 

이번에는 CTF 문제를 통해서 설명을 해보겠다.

https://www.wechall.net/challenge/training/php/globals/globals.php

 

[WeChall] Training: Register Globals

 

www.wechall.net

 

 

 

위 사이트에 접속하면 로그인 페이지가 나온다.

힌트로 소스 코드가 주어져 있는데 register_globals 옵션이 on 되어 있으면 쉽게 admin으로 로그인이 가능하다.

아래 노란색으로 칠한 부분을 보면 login[0] 이라는 변수의 값이 admin이면 문제가 풀리게 된다.

 

 

 

 

따라서 get 방식으로 배열 형태로 값을 보내게 되면 if 문을 통과하게 되어 문제가 풀리게 된다.

?login[0]=admin

 

 

 

이 취약점은 php 5.4 버전 이후로 php.ini 설정에서 사라졌지만, 코드상으로 register_globals 옵션을 사용할 변수에 지정이 가능하다.

알아두면 언젠가 도움이 될까 싶어서 글을 남긴다.