>  기사  >  운영 및 유지보수  >  PHP 원격 코드 실행 취약점 소개

PHP 원격 코드 실행 취약점 소개

王林
王林앞으로
2020-04-09 15:35:593286검색

PHP 원격 코드 실행 취약점 소개

서문:

PHP는 2019년 9월 26일 공식적으로 취약점 게시판을 공개했습니다. 이 취약점은 PHP-FPM의 fpm_main으로 인해 발생합니다. c 파일의 env_path_info입니다.

이 취약점은 PHP-FPM + Nginx를 특정 구성과 함께 사용할 때 존재합니다. 이 취약점에 대한 PoC는 2019년 10월 22일에 발표되었습니다. PHP와 Nginx의 조합이 널리 사용됩니다. 공격자는 이 취약점을 이용하여 원격으로 임의의 코드를 실행할 수 있으므로 더욱 유해합니다.

PHP-FPM 구성 요소 소개

PHP-FPM(FastCGI 프로세스 관리자)은 모든 규모의 사이트, 특히 사용량이 많은 사이트에 사용할 수 있는 몇 가지 추가 기능을 갖춘 또 다른 PHP FastCGI 구현입니다.

PHP 5.3.3 이전 PHP의 경우 PHP-FPM은 FastCGI 프로세스 관리를 PHP 패키지에 통합하도록 설계된 패치 패키지입니다. PHP 5.3.3 이전 버전의 PHP를 사용하는 경우 PHP 소스 코드에 패치를 적용해야 하며, PHP를 컴파일하고 설치한 후 사용할 수 있습니다.

그리고 PHP 5.3.3에는 php-fpm이 통합되어 더 이상 타사 패키지가 아닙니다. PHP-FPM은 메모리와 프로세스를 효과적으로 제어하고 PHP 구성을 원활하게 다시 로드할 수 있는 더 나은 PHP 프로세스 관리 방법을 제공합니다.

(연구 권장사항: java 비디오 튜토리얼)

취약점 설명

이 취약점은 PHP-FPM의 fpm_main.c 파일, sapi/fpm/fpm/fpm_main에 있는 env_path_info의 언더플로로 인해 발생합니다. c 파일 라인 1140에는 env_path_info의 접두사가 PHP 스크립트의 경로와 동일하다고 가정하는 포인터 연산이 포함되어 있습니다. 그러나 코드는 이러한 가정이 충족되는지 여부를 확인하지 않으며, 확인이 부족하여 "path_info" 변수에 잘못된 포인터가 발생합니다.

이러한 조건은 표준 Nginx 구성에서 구현할 수 있습니다. 다음과 같은 Nginx 구성이 있는 경우:

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_pass   php:9000;
        ...
  }

공격자는 줄바꿈(%0a로 인코딩됨)을 사용하여 `fastcgi_split_path_info` 지시문의 정규식을 깨뜨릴 수 있습니다. 손상된 정규 표현식으로 인해 빈 PATH_INFO가 발생하고 오류가 발생합니다.

이 오류는 코드 실행 취약점으로 이어질 수 있습니다. 코드 숨김에서는 FCGI_PUTENV를 호출하기 전에 path_info[0]의 값이 0으로 설정됩니다. 공격자는 신중하게 선택한 URL 경로 길이와 쿼리 문자열을 사용하여 path_info가 정확히 _fcgi_data_seg 구조의 첫 번째 바이트를 가리키도록 만들 수 있습니다. 그런 다음 0을 넣으면 'char* pos' 필드가 뒤로 이동하고 FCGI_PUTENV는 일부 데이터(다른 빠른 cgi 변수 포함)를 스크립트 경로로 덮어씁니다.

이 기술을 사용하여 공격자는 가짜 PHP_VALUE fcgi 변수를 만든 다음 신중하게 선택한 일련의 구성 값을 사용하여 코드를 실행할 수 있습니다.

대상 제품:

2019-09-26 업데이트 이전에 다운로드한 PHP-FPM 및 Nginx + php-fpm 서버에 다음 구성을 사용해야 하며 영향을 받습니다.

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
 
        fastcgi_pass   php:9000;
        ...
  }

수리 제안

비즈니스에 다음 구성이 필요하지 않은 경우 사용자가 삭제하는 것이 좋습니다:

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;

권장 튜토리얼: 서버 보안 튜토리얼

위 내용은 PHP 원격 코드 실행 취약점 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 secpulse.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제