오류 보고를 사용하면 PHP 보안에 두 가지 측면이 있습니다. 하나는 보안 강화에 도움이 되고 다른 하나는 해가 됩니다.
기본 해킹 공격에는 시스템에 부적절한 데이터를 제공하고 반환되는 오류의 종류와 컨텍스트를 확인하여 시스템을 프로파일링하는 작업이 포함됩니다. 이를 통해 크래커는 서버에 대한 정보를 수집하여 약점 포착할 수 있습니다. 예를 들어 공격자가 이전 양식 제출을 기반으로 페이지에 대한 정보를 수집한 경우 변수를 재정의하거나 수정하려고 할 수 있습니다.
php.ini 파일에 display_errors설정이 디폴트로 Off되어 있는데 켜놓는 경우들도 있습니다.
// php.ini 설정 수정 방법 ini_set('display_errors', 'On');
<form method="post" action="attacktarget?username=badfoo&password=badfoo"> <input type="hidden" name="username" 값="badfoo" /> <input type="hidden" name="password" 값="badfoo" /> </form>
일반적으로 반환되는 PHP 오류는 실패한 함수나 파일, 실패한 PHP 파일, 오류가 발생한 줄 번호 등을 나타내는 스크립트를 디버그하려는 개발자에게 매우 유용할 수 있습니다. 이것은 악용될 수 있는 모든 정보입니다. PHP 개발자가 show_source(), Highlight_string() 또는 Highlight_file()을 사용하는 것은 드문 일이 아닙니다. 디버깅 수단으로 사용되지만 라이브 사이트에서는 숨겨진 변수, 확인되지 않은 구문 및 기타 위험한 정보가 노출될 수 있습니다. 특히 위험한 것은 내장 디버깅 핸들러가 있는 알려진 소스의 코드를 실행하거나 일반적인 디버깅 기술을 사용하는 것입니다. 공격자가 사용 중인 일반적인 기술을 결정할 수 있는 경우 다양한 공통 디버깅 문자열을 전송하여 페이지에 무차별 대입을 시도할 수 있습니다.
<form method="post" action="attacktarget?errors=Y&showerrors=1&debug=1"> <input type="hidden" name="errors" value="Y" /> <input type="hidden" name="showerrors" value="1" /> <input type="hidden" name="debug" value="1" /> </form>
오류 처리 방법에 관계없이 시스템에서 오류를 조사하는 기능은 공격자에게 더 많은 정보를 제공하도록 합니다.
예를 들어, 일반적인 PHP 오류의 바로 그 스타일은 시스템이 PHP를 실행하고 있음을 나타냅니다. 공격자가 .html 페이지를 보고 있고 백엔드(시스템의 알려진 약점을 찾기 위해)를 조사하려는 경우 잘못된 데이터를 제공하여 시스템이 PHP로 구축되었음을 결정할 수 있습니다.
기능 오류는 시스템이 특정 데이터베이스 엔진을 실행 중인지 여부를 나타내거나 웹 페이지 또는 프로그래밍 또는 설계 방식에 대한 단서를 제공할 수 있습니다. 이를 통해 열린 데이터베이스 포트에 대한 심층 조사 또는 웹 페이지의 특정 버그 또는 약점을 찾을 수 있습니다. 예를 들어, 다양한 잘못된 데이터를 제공함으로써 공격자는 스크립트의 인증 순서(줄 번호 오류에서)를 결정할 수 있을 뿐만 아니라 스크립트의 다른 위치에서 악용될 수 있는 익스플로잇을 조사할 수 있습니다.
파일 시스템 또는 일반 PHP 오류는 웹 서버에 있는 권한과 웹 서버에 있는 파일의 구조 및 구성을 나타낼 수 있습니다. 개발자가 작성한 오류 코드는 이 문제를 악화시켜 이전에 "숨겨진" 정보를 쉽게 악용할 수 있습니다.
이 문제에 대한 세 가지 주요 솔루션이 있습니다. 첫 번째는 모든 기능을 면밀히 조사하고 대부분의 오류를 보상하려고 시도하는 것입니다. 두 번째는 실행 중인 코드에 대한 오류 보고를 완전히 비활성화하는 것입니다. 세 번째는 PHP의 사용자 정의 오류 처리 기능을 사용하여 고유한 오류 처리기를 만드는 것입니다. 보안 정책에 따라 세 가지 모두를 상황에 적용할 수 있습니다.
이 문제를 미리 잡는 한 가지 방법은 PHP의 자체 error_reporting() 을 사용하여 코드를 보호하고 위험할 수 있는 변수 사용을 찾는 데 도움이 됩니다. 를 사용하여 배포하기 전에 코드를 테스트 E_ALL하면 변수가 다른 방식으로 감염되거나 수정될 수 있는 영역을 빠르게 찾을 수 있습니다. 배포할 준비가 되면 error_reporting() 을 0으로 설정하여 오류 보고를 완전히 비활성화하거나 php.ini 옵션 을 사용하여 오류 표시를 꺼서 display_errors코드를 조사하지 않도록 해야 합니다. 후자를 선택하면 error_logini 지시문을 사용하여 로그 파일의 경로도 정의하고 켜야 log_errors합니다.
- ini_set('display_errors', 'Off');
- error_reporting(0);
- set_error_handler(function () {});