오류 보고

PHP 보안의 경우 오류 보고에는 두 가지 측면이 있습니다. 하나는 보안 강화에 도움이 되고 다른 하나는 해가 됩니다.

표준 공격 전술에는 시스템에 부적절한 데이터를 제공하고 반환되는 오류의 종류와 컨텍스트를 확인하여 시스템을 프로파일링하는 작업이 포함됩니다. 이를 통해 시스템 크래커는 서버에 대한 정보를 조사하여 가능한 약점을 결정할 수 있습니다. 예를 들어 공격자가 이전 양식 제출을 기반으로 페이지에 대한 정보를 수집한 경우 변수를 재정의하거나 수정하려고 할 수 있습니다.

예제 #1 사용자 정의 HTML 페이지로 변수 공격하기

                  
<form method="post" action="attacktarget?username=badfoo&amp;password=badfoo">
<input type="hidden" name="username" value="badfoo" />
<input type="hidden" name="password" value="badfoo" />
</form>
                  
                

일반적으로 반환되는 PHP 오류는 실패한 함수나 파일, 실패한 PHP 파일, 오류가 발생한 줄 번호 등을 나타내는 스크립트를 디버그하려는 개발자에게 매우 유용할 수 있습니다. 이것은 악용될 수 있는 모든 정보입니다. PHP 개발자가 디버깅 수단으로 show_source(), Highlight_string() 또는 Highlight_file()을 사용하는 것은 드문 일이 아니지만 라이브 사이트에서는 숨겨진 변수, 확인되지 않은 구문 및 기타 위험한 정보가 노출될 수 있습니다. 특히 위험한 것은 내장 디버깅 핸들러가 있는 알려진 소스의 코드를 실행하거나 일반적인 디버깅 기술을 사용하는 것입니다. 공격자가 사용 중인 일반적인 기술을 결정할 수 있는 경우 다양한 공통 디버깅 문자열을 전송하여 페이지를 무차별 대입하려고 할 수 있습니다.

예제 #2 일반적인 디버깅 변수 활용

                  
<form method="post" action="attacktarget?errors=Y&amp;showerrors=1&amp;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_log ini 지시문을 사용하여 로그 파일의 경로도 정의하고 log_errors를 켜야 합니다.

예제 #3 E_ALL로 위험한 변수 찾기

                  
<?php
if ($username) {  // Not initialized or checked before usage
    $good_login = 1;
}
if ($good_login == 1) { // If above test fails, not initialized or checked before usage
    readfile ("/highly/sensitive/data/index.html");
}
?>