PHP가 널리 사용되면서 일부 해커들은 PHP 프로그램 취약점을 통한 공격을 끊임없이 찾고 있습니다. 이 섹션에서는 전역 변수, 원격 파일, 파일 업로드, 라이브러리 파일, 세션 파일, 데이터 유형 및 오류가 발생하기 쉬운 기능 측면에서 PHP의 보안을 분석합니다.
전역변수를 통한 공격은 어떻게 하나요?
PHP의 변수는 미리 선언할 필요가 없으며, 처음 사용할 때 자동으로 생성되고, 유형은 상황에 따라 자동으로 결정됩니다. 프로그래머의 관점에서 볼 때 이는 의심할 여지 없이 매우 편리한 접근 방식입니다. 변수가 생성되면 프로그램의 어느 곳에서나 사용할 수 있습니다. 이 기능의 결과로 프로그래머는 변수를 거의 초기화하지 않습니다.
분명히 PHP 기반 애플리케이션의 주요 기능은 일반적으로 사용자 입력(주로 양식 변수, 업로드된 파일, 쿠키 등)을 받아들인 다음 입력 데이터를 처리한 다음 결과를 클라이언트 브라우저에 반환합니다. PHP 코드가 사용자 입력에 최대한 쉽게 접근할 수 있도록 하기 위해 PHP는 실제로 이 입력 데이터를 전역 변수로 처리합니다.
예:
PHP 코드
따라서 PHP 프로그램의 보안을 강화하기 위해 명확하게 정의되지 않은 변수는 신뢰할 수 없습니다. 프로그램에 변수가 많으면 이는 매우 어려운 작업이 될 수 있습니다.
일반적인 보호 방법은 제출 방법(GET 또는 POST)에 따라 HTTP_GET[] 또는 POST_VARS[] 배열의 변수를 확인하는 것입니다. "track_vars" 옵션이 켜져 있는 상태(기본값)로 PHP를 구성하면 사용자가 제출한 변수를 전역 변수와 위에서 언급한 배열에서 사용할 수 있습니다.
그러나 PHP에는 사용자 입력을 처리하는 데 사용되는 네 가지 배열 변수가 있다는 점을 언급할 가치가 있습니다. HTTP_GET_VARS 배열은 GET 모드로 제출된 변수를 처리하는 데 사용되며, HTTP_POST_VARS 배열은 POST 모드로 제출된 변수를 처리하는 데 사용됩니다. HTTP_COOKIE_VARS 배열은 쿠키 헤더로 제출된 변수를 처리하는 데 사용되며, HTTP_POST_FILES 배열(비교적 새로운 PHP에서 제공) ) 이는 완전히 사용자가 변수를 제출하는 선택적인 방법입니다. 사용자 요청은 이 네 가지 배열에 변수를 쉽게 저장할 수 있으므로 보안 PHP 프로그램은 이 네 가지 배열을 확인해야 합니다.
원격 파일을 통해 공격하는 방법은 무엇입니까?
PHP는 프로그래머가 특정 기능을 쉽게 구현할 수 있도록 많은 기능을 제공하는 풍부한 기능을 갖춘 언어입니다. 그러나 보안 관점에서 보면 기능이 많을수록 보안을 유지하기가 더 어려워집니다. 원격 파일은 이 문제의 좋은 예입니다.
위 스크립트는 "$filename" 파일 열기를 시도하고 실패할 경우 오류 메시지를 표시합니다. 분명히 "$filename"을 지정할 수 있다면 이 스크립트를 사용하여 시스템의 모든 파일을 탐색할 수 있습니다. 그러나 이 스크립트의 덜 분명한 특징은 다른 웹 사이트나 FTP 사이트에서 파일을 읽을 수 있다는 것입니다. 실제로 대부분의 PHP 파일 처리 기능은 원격 파일을 투명하게 처리합니다.
예:
"$filename"이 "http://target/scripts/...� ../winnt/system32/cmd.exe?/c dir"로 지정된 경우
위 코드는 실제로 호스트 대상의 유니코드 취약점을 악용하여 dir 명령을 실행합니다. 이는 원격 파일의 include(), require(), include_once() 및 require_once()에 대한 지원을 맥락상 더욱 흥미롭게 만듭니다. 이 함수의 주요 기능은 지정된 파일의 내용을 포함하고 이를 PHP 코드에 따라 해석하는 것입니다. 주로 라이브러리 파일에 사용됩니다.
예:
공격 코드는 자신이 위치한 서버(즉, evilhost)에서 자체 PHP 프로그램을 실행하지 않는다는 점에 유의해야 합니다. 그렇지 않으면 공격 코드는 자신이 위치한 서버에서 실행되는 대신 공격 코드가 위치한 서버를 공격하게 됩니다. 대상 서버.
파일 업로드를 통한 공격 방법은?PHP는 RFC 1867 기반의 파일 업로드를 자동으로 지원합니다. 다음 예를 살펴보겠습니다.