보안을 그리다, 훈이

[Web Hacking] PHP extract() function 취약점 본문

Security/Web Hacking

[Web Hacking] PHP extract() function 취약점

HooNeee 2022. 1. 20. 19:54

 

PHP extract() function

 

extract() 함수배열 속의 키 값들을 변수화하는 역할을 한다.

 

// Code 1 - Example of using the PHP extract() function

<?php
$a[x] = 1;
$a[y] = 2;
extract($a);

echo "x = $x";
echo "y = $y";
?>

 

위 Code 1의 결과는 아래와 같다.

 

// The result of Code 1.

x = 1
y = 2

 

배열 a 속의 키 값인 x와 y가 extract() 함수로 인해 변수화된 것을 확인할 수 있다.

 

마찬가지로 $_GET 또는 $_POST 인자도 extract() 함수를 사용하여 넘길 수 있으며, 이 경우에도 GET 또는 POST로 넘어오는 파라미터와 값을 변수와 그 초기값으로 설정할 수 있다.

 

 

PHP extract() function 취약점

 

extract() 함수를 사용하여 $_GET 또는 $_POST로 넘어온 인자는 함수 사용 전의 기존 값을 덮어 쓸 수 있다. [Overwrite 가능]

 

// Code 2 - Extract() Function Vulnerability Occurrence Example

<?php
$pw = 123;
extract($_GET);

if($pw == 456)
    echo "Password correct"
else
    echo "Password incorrect"
?>

 

위의 Code 2를 보면 변수 pw가 선언된 이후 extract() 함수로 $_GET 인자를 넘겨 받게 된다.

 

변수 pw의 값이 123으로 선언되어 있으므로 'Password incorrect' 문구가 출력되지만, 아래와 같이 해당 URL에서 변수 pw를 직접 초기화 및 우회하면 'Password correct' 문구를 출력할 수 있게 된다.

 

기본 URL > example.com

우회 URL > example.com/?pw=456

 

또한, PHP extract() 함수 취약점을 활용하여 공격하기 위해서는 공격자가 내부 변수명을 정확히 알고 있어야 한다.

 

 

PHP extract() function 취약점 대응방안

 

1. 변수를 선언하기 이전에 extract() 함수를 사용하여야 한다.

2. extract() 함수 사용시, 기존 변수와의 충돌이 생길 경우 기존 변수를 덮어쓰지 않도록 하는 EXTR_SKIP 옵션을 이용하여야 한다.

 

 

 

[참고]

https://m.blog.naver.com/lstarrlodyl/221773329077

https://aceatom.tistory.com/164

 

Comments