php extract vulnerability

2013. 10. 13. 17:20 from Security

php는 GET과 POST같은 Request 값을 받아 변수화 시켜주는 extract함수가 존재하는데

이 함수의 역할은 배열속의 키값들을 변수화 시키는 것이다.


예를들어 만약 배열 h속에 키값이 a, b 가 들어 있다고 가정하면


$h[a] = 1;

$h[b] = 2;

echo $h[a];

echo $h[b];


해줬을시 1, 2가 출력이 되는데

여기서 extract()를 사용하면


$h[a] = 1;

$h[b] = 2;

extract($h);

echo $a;

echo $b; 


이렇게 해줘도 1, 2가 출력이 되는것이다.


extract 함수는 보안적으로 문제가 있는 함수인데 바로 이 함수의 특성을 이용해 서버 변수 환경변수등을 포함해 이미 정의되 있는 변수를 덮어버릴수 있는것이다.

함수 자체의 옵션으로 이런 overwrite을 방지해주는 옵션이 있지만 default로 설정되있지 않으므로 보안 중요성을 모르는 개발자들이 이 함수를 썼다가 치명적 결함을 일으킬수도 있는것이다.


아래 코드를 봐보자.


session_start();

if(!isset($_SESSION['admin']))

{

$_SESSION['admin'] = false;

}

extract($_POST);


위 코드에서 php에서 미리 선언되 있는 $_SESSION array를 덮어버릴수 있는데

admin세션과 captcha등을 사용할 경우 captcha 세션도 덮어버릴수 있다.


예를들어 12345와 같은 임의의 captcha를 전송 했을때 아래와 같이 우회가 가능하다.



이렇게 captcha를 우회할수 있을 뿐더러 captcha를 정확히 입력해준뒤 아래와 같이 admin을 우회할수도 있다.




extract()이 취약하기 위한 몇가지의 조건이 있는데


1. 변수가 선언된뒤 extract()함수가 이용이 되어야 한다.

2. extract()로 인해 덮여진 변수가 다시 다른 값으로 뎦여진다면 취약하지 않다.

3. 공격자가 내부변수이름을 알아야 한다.

4. EXTR_SKIP이 옵션으로 선언되었을 경우 extract()함수는 취약하지 않다.


이렇게 4가지 정도가 있다.






'Security' 카테고리의 다른 글

TLS에 관한 간단한 탐구  (0) 2013.10.21
허..  (0) 2013.10.17
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
[Ollydbg 1.x] OllyMSDN plugin  (0) 2013.07.11
유용한 자료들..  (0) 2013.04.22
Posted by xer0s :