WordPress용 PHP 강화

게시 됨: 2021-06-29

WordPress는 PHP에서 실행되며 WordPress 사이트를 강화할 때 주의해야 하는 핵심 구성 요소입니다. 이 기사에서는 WordPress에 대한 PHP 보안과 관련하여 해결할 수 있는 가장 일반적이고 덜 매달린 과일 중 일부를 다룰 것입니다.

주의 – PHP 설정을 변경할 때 주의하십시오. 잘못된 설정과 구문은 웹사이트를 손상시킬 수 있습니다. 프로덕션 환경을 변경하기 전에 항상 개발 또는 스테이징 환경에서 변경 사항을 테스트하십시오.

목차

  • 최신 PHP 버전 사용
  • PHP 버전 억제
  • 모든 phpinfo() 파일을 제거하십시오.
  • PHP 오류 및 경고 억제
  • 제한 포함
  • 원격 파일 포함 비활성화
  • 위험한 기능 비활성화 또는 제한
  • 민감한 디렉토리에서 PHP 실행 차단
  • 결론

최신 PHP 버전 사용

운영 체제, MySQL 서버, 웹 서버(예: Nginx, Apache, IIS…)를 패치하는지 확인하는 것 외에도 완전히 지원되는 PHP 1 버전을 실행하고 있는지 확인하는 것도 절대적으로 중요합니다. .

PHP는 인터넷에 노출되어 있기 때문에(WordPress는 PHP 인터프리터 위에서 실행되기 때문에) PHP 내의 취약점에 대한 악용이 발견되는 경우 공격의 위험이 더 큽니다. 그러한 범위에서 PHP를 최신 상태로 유지하는 것(더 나아가 5.x PHP 버전이 종료되는 것을 피하기 위해)은 공격이 발생하는 것을 방지할 뿐만 아니라 공격자가 다음과 같은 경우 공격을 확대하는 것을 허용하는 데 중요합니다. 그들은 (예: WordPress 플러그인의 취약점을 악용하여) 귀하의 WordPress 웹사이트에 발판을 마련합니다.

PHP 버전 억제

대부분의 웹 서버 소프트웨어와 마찬가지로 기본적으로 PHP는 X-Powered-By HTTP 헤더를 통해 실행 중인 버전을 노출합니다. 다른 상황과 마찬가지로 이 자체가 보안 취약점은 아니지만 소프트웨어 버전을 열거하는 것은 일반적으로 공격의 정찰 단계에서 공격자에게 유용합니다. 따라서 PHP 버전을 비활성화하면 공격을 성공하기가 조금 더 어렵게 만들 수 있습니다.

다행히도 Exposure_php 설정을 사용하면 쉽게 비활성화할 수 있습니다. php.ini 구성 파일에 다음을 추가하기만 하면 됩니다.

expose_php = Off

모든 phpinfo() 파일을 제거하십시오.

디버깅에 사용하기 위해 phpinfo() 함수를 사용하여 PHP 파일을 만드는 것은 많은 PHP 시스템 관리자가 가지고 있는 일반적인 나쁜 습관입니다. 공격자가 'phpinfo' 파일(일반적으로 이름은 phpinfo.php임)을 발견하면 서버에서 실행되는 PHP 버전뿐 아니라 웹사이트의 다른 측면에 대한 풍부한 정보와 세부 정보가 제공됩니다. 웹 및 데이터베이스 서버로.

실제로 phpinfo()를 실행해야 하는 경우 다음과 같이 명령줄에서 실행하는 것이 훨씬 더 좋습니다.

php -i

시스템에 둘 이상의 PHP 구성이 있는 경우(매우 일반적임) 다음 명령을 사용하여 사용할 php.ini 파일을 지정할 수 있습니다.

php -c /etc/php/apache2/php.ini -i

PHP 오류 및 경고 억제

오류, 경고 및 예외는 개발 중에 유용하지만 공개 환경에 표시되는 경우 공격자는 종종 서버 구성, 애플리케이션 레이아웃 및 구성 요소에 대한 통찰력을 얻기 위해 이 정보를 사용합니다.

오류 메시지는 정보 공개에 대한 가장 일반적인 경로 중 하나이며 종종 응용 프로그램 설치 경로 및 데이터베이스 연결 세부 정보와 같은 정보가 누출됩니다. 오류 및 경고를 표시하는 대신 이 정보가 기록되었는지 확인하십시오. 이 주제에 대한 자세한 정보는 공식 PHP 문서에서 찾을 수 있습니다.

다행히 display_errors 설정을 사용하면 쉽게 비활성화할 수 있습니다. php.ini 구성 파일에 다음을 추가하기만 하면 됩니다.

display_errors = Off
log_errors = On

제한 포함

파일 포함 취약점으로 인해 공격자는 PHP include() 문을 제어할 수 있습니다. PHP는 포함된 파일 내의 모든 PHP 코드를 실행하지만 다른 것은 출력합니다(일반 텍스트라고 가정). 이는 파일 포함 취약점을 제어하는 ​​공격자가 결국 다음과 유사한 것을 실행하여 중요한 시스템 파일에 대한 액세스 권한을 부여할 수 있음을 의미합니다. 파일 포함에 대한 자세한 내용은 이 문서를 참조하십시오.

include "../../../../etc/passwd"

php.ini에서 open_basedir 설정을 지정하면 PHP가 특정 디렉토리 이하에서만 포함을 허용하도록 지시할 수 있습니다. 이것이 파일 포함 취약점을 제거하지는 않지만 확실히 취약점을 더욱 제한하고 코드 실행으로 이어질 수 있는 고급 공격을 차단합니다(공격자가 서버에서 명령을 실행할 수 있는 경우).

php.ini 파일에서 다음과 같이 open_basedir PHP 설정을 지정할 수 있습니다.

open_basedir = /var/www/html/example.com

원격 파일 포함 비활성화

open_basedir를 사용하여 로컬 포함을 특정 디렉토리로 제한하는 것 외에도 원격 포함을 비활성화하는 것이 좋습니다. RFI(원격 파일 포함) 공격은 로컬 파일 포함 공격과 유사하게 작동하지만 공격자가 시스템의 파일에 바인딩되는 대신 원격 파일 포함을 사용하면 공격자가 네트워크를 통해 파일을 포함할 수 있습니다. 이것은 매우 위험하며 대부분의 RFI 공격은 공격자가 웹 서버에서 임의로 코드를 실행할 수 있게 하는 것으로 끝납니다(원격 코드 실행 또는 RCE라고 함).

원격 파일 포함을 비활성화하려면 다음과 같이 php.ini 파일에서 allow_url_fopen 및 allow_url_include PHP 옵션을 사용하십시오.

allow_url_fopen = Off
allow_url_include = Off

위험한 기능 비활성화 또는 제한

공격자가 모든 보안 조치에도 불구하고 WordPress의 PHP 보안에서 취약점을 성공적으로 찾아 악용할 수 있는 경우 마지막으로 원하는 것은 서버에서 임의의 코드를 실행할 수 있게 하는 것입니다. . 공격자가 서버에서 임의의 코드를 실행할 수 있는 경우 웹셸을 설치하거나 리버스 셸을 설정하여 서버를 추가로 제어하고 이를 사용하여 악의적인 입찰(예: 멀웨어 유포, 피싱 캠페인 또는 거부에 웹사이트 사용)을 수행할 수 있습니다. 서비스 공격, 또는 암호화폐 채굴).

shell_exec() 및 system()과 같은 기능을 비활성화하면 사용자와 공격자가 이러한 위험한 기능을 사용하는 것을 방지할 수 있습니다. 이러한 기능을 사용해야 하는 정당한 이유가 있을 수 있지만, 그것들은 매우 적고 그 사이에 있으며 일반적으로 동일한 결과를 얻을 수 있는 더 안전한 방법이 있습니다.

주의 – 실행 중인 일부 소프트웨어/플러그인이 이러한 기능에 의존할 수 있으므로 프로덕션 환경에서 실행하기 전에 테스트 또는 스테이징 환경에서 다음을 철저히 테스트하십시오.

다음은 php.ini 파일의 disable_functions 설정을 사용하여 PHP에서 비활성화할 수 있는 잠재적으로 위험한 기능 모음입니다.

disable_functions = php_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace,
tmpfile, link, ignore_user_abord, shell_exec, dl, exec, system, highlight_file, source,
show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid,
posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid,
posix_getpgrp, posix_getpid, posix_getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, 
posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, 
posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times, posix_ttyname, posix_uname, 
proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, phpinfo</em>

민감한 디렉토리에서 PHP 실행 차단

기본적으로 웹사이트에 테마, 플러그인, 이미지, 비디오 및 기타 파일을 업로드하는 데 사용되는 wp-content/uploads 디렉토리에서 PHP 코드를 실행할 수 있습니다. 이것은 상당히 위험합니다. 공격자가 플러그인이나 테마의 파일 업로드 취약점을 어떻게든 이용할 수 있다면 웹쉘이나 유사한 종류의 백도어를 업로드할 수 있습니다. PHP 실행은 wp-content/uploads 디렉토리 내에서 허용되므로 공격자는 실제로 해당 PHP 코드를 실행하여 악의적인 입찰을 수행할 수 있습니다.

이를 방지하는 것은 실제로 매우 간단합니다. wp-content/uploads 및 디렉토리 내에서 PHP 실행을 비활성화합니다. 순진한 방법은 .htaccess 를 사용하여 *.php 파일에 대한 액세스를 차단하는 것입니다.

<Files *.php>
deny from all
</Files>

그러나 위의 구성은 비교적 우회하기 쉽습니다. 대부분의 경우 PHP는 .phtml .php3 파일을 기꺼이 실행합니다. 가장 확실한 방법은 말 그대로 디렉토리 내에서 PHP 엔진을 비활성화하는 것입니다. 다음 .htaccess 구성은 wp-content/uploads 및 wp-includes(일반적으로 공격자가 표적으로 하는 또 다른 디렉토리) 디렉토리 내에 있어야 합니다.

php_flag engine off

WordPress용 PHP 보안 – 최종 생각

WordPress 자체는 강력하고 안전한 플랫폼으로 간주되어야 하지만 WordPress 설치가 실행되는 환경과 인프라는 웹사이트 전체의 안전을 보장하는 데 많은 도움이 됩니다. 이 PHP 보안 강화 가이드에서 다루는 주제를 구현하면 2차 방어선이 제공되어 공격자가 WordPress 웹사이트 내의 취약점을 악용한 후 공격을 확대하기가 훨씬 더 어려워집니다.

WordPress 사이트를 강화하는 방법에 대해 자세히 알아보려면 WordPress 보안 및 강화에 대한 최종 가이드를 읽어보세요.

이 문서에 사용된 참조 [ + ]

이 문서에 사용된 참조
1 https://www.php.net/supported-versions.php