PHP에서 php_uname () 함수는 PHP 스크립트를 실행하는 운영 체제 정보를 얻는 데 사용됩니다. 이 기능은 디버깅 및 시스템 관리에 매우 유용하지만 정보 유출의 잠재적 위험이 될 수 있습니다. 공격자는이 데이터를 사용하여 서버의 자세한 환경 정보를 얻어 추가 공격을 수행 할 수 있습니다. 따라서 php_uname () 가 가져온 보안 위험을 합리적으로 방지하는 것이 특히 중요합니다.
이 기사는 php_uname () 의 위험에서 시작하여 효과적인 보안 조치를 설명하여 개발자 가이 기능을 안전하게 사용할 수 있도록 도와줍니다.
php_uname () 에서 반환 한 컨텐츠에는 일반적으로 운영 체제 이름, 호스트 이름, 버전, 릴리스 번호 등과 같은 정보가 포함되어 있습니다.이 정보가 무단 사용자에게 노출되면이 정보는 다음과 같습니다.
공격자가 특정 시스템 취약점에 대한 공격을 시작하는 데 도움이되는 서버 유형 및 버전을 공개합니다.
네트워크 스캔 및 침입을 용이하게하기 위해 네트워크 구조에 대한 단서를 제공합니다.
민감한 정보 유출의 위험을 증가시키고 시스템의 보안 보호 효과를 줄입니다.
예를 들어:
echo php_uname();
이것은 다음과 같은 것을 출력 할 수 있습니다.
Linux server1.m66.net 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64
이것으로부터, 당신은 공격자에게 매우 귀중한 정보 인 운영 체제 유형과 커널 버전을 볼 수 있습니다.
그것을 방지하는 가장 쉬운 방법은 php_uname () 의 결과를 프론트 엔드 페이지 또는 API 응답에 직접 출력하지 않도록하는 것 입니다. 서버 정보를 실제로 얻어야하는 경우 일반 사용자가 정보에 액세스하지 않도록해야합니다.
예:
// 오류 데모:직접 출력,가능한 정보 유출
echo php_uname();
// 개선 시연:관리자에게만 액세스 할 수 있습니다
session_start();
if (isset($_SESSION['is_admin']) && $_SESSION['is_admin'] === true) {
echo php_uname();
} else {
echo "시스템 정보에 액세스 할 수있는 권한이 없습니다";
}
사용자 권한 확인 메커니즘과 결합하여 php_uname ()을 호출하고 출력을 볼 수있는 사용자 역할을 엄격히 제한합니다. 관리자 만 액세스하도록 관련 인터페이스 또는 페이지를 설정하는 것이 좋습니다.
샘플 코드 :
function getServerInfo() {
// 관리자 액세스 만 허용합니다
session_start();
if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
http_response_code(403);
exit('접근 불가');
}
return php_uname();
}
실제로 사용자에게 일부 서버 정보를 표시 해야하는 경우 민감한 필드를 제거하기 위해 PHP_UNAME () 의 출력을 필터링하고 특정 커널 버전의 누출을 피하는 것이 좋습니다.
$fullInfo = php_uname();
$parts = explode(' ', $fullInfo);
// 운영 체제 및 호스트 이름 만 유지됩니다,커널 버전 및 기타 세부 사항을 차단하십시오
$filteredInfo = $parts[0] . ' ' . $parts[1];
echo $filteredInfo;
출력 예 :
Linux server1.m66.net
보안 요구 사항이 매우 높은 생산 환경에서는 php_uname ()을 포함하여 php.ini 구성을 통해 민감한 기능을 비활성화 할 수 있습니다.
disable_functions = php_uname
이런 식으로 코드에서 호출 되더라도 함수가 실행되지 않아 누출 위험이 줄어 듭니다. 그러나 이것은 종속 시스템 정보의 정상적인 기능에 영향을 줄 수 있습니다.
PHP_UNAME ()- 관련 인터페이스에 액세스하는 로그를 모니터링하고 기록하면 비정상적인 액세스 동작을 발견하고 적시에 잠재적 인 위협에 대응하는 데 도움이됩니다.
샘플 로그 쓰기 :
function logAccess($user) {
file_put_contents('/var/log/server_info_access.log', date('Y-m-d H:i:s') . " - {$user} accessed server info\n", FILE_APPEND);
}
session_start();
if (isset($_SESSION['user'])) {
logAccess($_SESSION['user']);
}
안전 조치 | 설명 |
---|---|
직접 출력을 피하십시오 | 무단 페이지에 php_uname () 결과를 표시하지 않습니다 |
권한 제어 | 관리자와 같은 승인 된 사용자 만 전화 및 액세스 권한을 제한합니다. |
필터 정보 | 출력 정보를 필터링하여 민감한 세부 사항을 제거하십시오 |
기능 호출을 비활성화합니다 | php.ini를 통해 php_uname () 함수를 비활성화합니다 |
로그 감사 및 모니터링 | 접근 상황을 기록하고 비정상적인 접근을 방지하십시오 |
권한 제어 및 출력 필터링을 합리적으로 설계하고 로그 모니터링과 협력함으로써 PHP_UNAME () 로 인한 정보 유출 문제를 효과적으로 피할 수 있으며 PHP 응용 프로그램 및 서버의 보안을 보장 할 수 있습니다.
서버 정보를 노출 해야하는 환경을 사용하는 경우 위의 보안 정책을 먼저 고려하여 잠재적 위험을 최소화하십시오.