가능한 공격

몇가지 이유로 인해 PHP를 서버 소프트웨어(아파치 등)의 모듈로 사용하지 않거나, 다른 종류의 CGI wrappers로 스크립트에 대해 안전한 chroot와 setuid 환경을 제공하기 위해 CGI 바이너리로 PHP를 사용하는 것을 선택할 수 있습니다. 이 설치는 보통 실행 가능한 PHP 바이너리를 웹서버 cgi-bin 디렉토리에 두는 것입니다. CERT 권고 » CA-96.11는 어떠한 인터프리터도 cgi-bin에 두지 않을 것을 권장합니다. PHP 바이너리는 독립 인터프리터로 사용할 수 있지만, 이러한 방법의 설치가 가능하도록 하는 몇가지 공격을 방지하도록 설계되어 있습니다.

  • 시스템 파일 액세스: http://my.host/cgi-bin/php?/etc/passwd 물음표(?) 뒤에 오는 URL의 쿼리 정보는 CGI 인터페이스에 의해 인터프리터에 명령줄 인수로 전달됩니다. 일반적으로 인터프리터는 명령줄에서 첫 번째 인수로 지정된 파일을 열고 실행합니다. CGI 바이너리로 호출될 때 PHP는 명령줄 인수 해석을 거부합니다.
  • 서버의 모든 웹 문서 액세스: http://my.host/cgi-bin/php/secret/doc.html PHP 바이너리 이름 /secret/doc.html 뒤의 URL의 경로 정보 부분은 일반적으로 다음을 지정하는 데 사용됩니다. CGI 프로그램에서 열고 해석할 파일의 이름. 일반적으로 일부 웹 서버 구성 지시문(Apache: Action)은 http://my.host/secret/script.php와 같은 문서에 대한 요청을 PHP 인터프리터로 리디렉션하는 데 사용됩니다. 이 설정을 사용하면 웹 서버는 먼저 /secret 디렉토리에 대한 액세스 권한을 확인한 후 리디렉션된 요청 http://my.host/cgi-bin/php/secret/script.php를 생성합니다. 불행히도 요청이 원래 이 형식으로 제공된 경우 /secret/script.php 파일에 대해 웹 서버에서 액세스 검사를 수행하지 않고 /cgi-bin/php 파일에 대해서만 액세스를 확인합니다. 이 방법으로 /cgi-bin/php에 액세스할 수 있는 모든 사용자는 웹 서버의 보호된 문서에 액세스할 수 있습니다. PHP에서 서버 문서 트리에 액세스 제한이 있는 디렉토리가 있는 경우 런타임 구성 지시문 cgi.force_redirect, doc_rootuser_dir을 사용하여 이 공격을 방지할 수 있습니다. 다양한 조합에 대한 전체 설명은 아래를 참조하십시오.