PHP 애플리케이션을 개발하고 배포 할 때는 종종 시스템의 운영 체제 정보를 얻기 위해 PHP_UNAME () 기능을 사용해야합니다. 이 함수는 운영 체제 이름, 버전 번호, 호스트 이름 및 현재 서버의 기타 정보를 반환합니다. 그러나이 정보는 악의적 인 사용자에게 노출되어 시스템의 보안을 위협 할 수 있습니다. 따라서 생산 환경에서는 PHP_UNAME () 함수의 출력 정보를 숨기거나 필터링하기위한 조치를 취해야합니다.
php_uname () 은 현재 운영 체제에 대한 관련 정보를 반환하는 내장 PHP 기능입니다. 출력 컨텐츠는 운영 체제의 이름, 버전, 호스트 이름 등이 포함되며 일반적인 형식은 다음과 같습니다.
echo php_uname();
출력 예 :
Linux server1 4.15.0-123-generic #126-Ubuntu SMP Thu Nov 7 18:59:47 UTC 2019 x86_64
이 정보는 개발자에게 유용 할 수 있지만 불신 사용자에게 노출되면 공격자는이 정보를 사용하여 시스템의 구성 및 잠재적 취약점을 유추 할 수 있습니다.
php_uname () 의 출력 정보는 다음과 같은 민감한 내용을 누출 할 수 있습니다.
운영 체제 유형 및 버전 : 공격자는이 정보를 사용하여 시스템에 어떤 취약점이 있는지 결정할 수 있습니다.
호스트 이름 : 호스트 이름이 노출되면 공격자는 서버 또는 네트워크 토폴로지의 물리적 위치를 유추 할 수 있습니다.
커널 버전 : 일부 커널 버전에는 이미 보안 취약점이있을 수 있으며 공격자는이 정보를 사용하여 공격을 시작할 수 있습니다.
따라서 생산 환경에서 보안을 향상시키기 위해서는 php_uname () 함수의 출력을 숨기거나 필터링해야합니다.
가장 직접적인 방법은 PHP의 disable_functions 구성을 통해 기능을 비활성화하는 것입니다. 이 방법은 php_uname ()가 호출되는 것을 완전히 방지합니다.
php.ini 구성 파일을 엽니 다.
disabled_functions 구성 항목에 php_uname 추가 :
disable_functions = php_uname
PHP 또는 웹 서버를 다시 시작하여 구성을 적용합니다.
이 접근법을 사용하면 php_uname () 함수를 사용하려는 모든 코드가 실행에서 차단됩니다.
php_uname ()를 완전히 비활성화 할 수없는 경우 사용자 정의 코드를 작성하여 출력을 필터링하거나 수정할 수도 있습니다. 예를 들어, 함수의 출력을 다시 작성하여 더 간단하거나 안전한 정보를 표시 할 수 있습니다.
if ($_SERVER['SERVER_NAME'] === 'production_server') {
echo "Server Information Hidden for Security";
} else {
echo php_uname();
}
이 코드에서는 php_uname () 의 출력은 특정 서버 환경에만 표시됩니다. 그렇지 않으면 숨겨진 프롬프트 메시지가 표시됩니다.
Apache 서버의 경우 .htaccess 파일을 통해 일부 민감한 정보가 차단 될 수 있습니다.
예를 들어, Access Control은 Mod_rewrite 를 통해 수행되어 특정 민감한 정보가 노출되지 않도록합니다.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/php_uname$
RewriteRule .* - [F]
</IfModule>
이 구성은 php_uname () 에 직접 요청을 거부합니다.
Open_Basedir 한계를 구성하면 PHP 스크립트가 특정 디렉토리에만 액세스 할 수 있으므로 노출되어서는 안되는 시스템 정보를 읽지 않도록 제어 할 수 있습니다.
php.ini 구성 파일을 엽니 다.
Open_basedir 구성 :
open_basedir = /path/to/your/application:/path/to/other/allowed/directories
이 구성은 PHP 스크립트가 지정된 디렉토리 만 액세스하도록 제한하므로 시스템에 민감한 정보의 누출을 피할 수 있습니다.
생산 환경에서 PHP 애플리케이션의 보안을 개선하고 시스템 민감한 정보가 유출되는 것을 방지하려면 기능을 비활성화하거나 출력 컨텐츠를 수정하거나 구성 파일 및 액세스 제어 방법을 사용하여 제한을 제한 할 수 있습니다. 이를 수행하는 가장 좋은 방법은 여러 가지 방법을 결합하여 민감한 정보가 신뢰할 수없는 사용자에게 노출되지 않도록하는 것입니다.