Protegendo PHP para WordPress

Publicados: 2021-06-29

O WordPress é executado em PHP e é um componente central para prestar atenção ao fortalecer seu site WordPress. Este artigo abordará algumas das frutas mais comuns e fáceis que você pode abordar quando se trata de segurança PHP para WordPress.

Atenção – Tenha cuidado ao fazer alterações nas configurações do PHP. Configurações e sintaxe incorretas podem danificar seu site. Sempre teste suas alterações em um ambiente de desenvolvimento ou preparação antes de fazer alterações na produção.

Índice

  • Use a versão mais recente do PHP
  • Suprimir a versão do PHP
  • Remova qualquer arquivo phpinfo()
  • Suprimir erros e avisos do PHP
  • Restringir inclui
  • Desabilitar o arquivo remoto inclui
  • Desabilitar ou limitar funções perigosas
  • Bloqueie a execução do PHP em diretórios sensíveis
  • Conclusão

Use a versão mais recente do PHP

Além de garantir que você está corrigindo seu sistema operacional, servidor MySQL, servidor web (por exemplo, Nginx, Apache, IIS…), também é absolutamente crucial garantir que você esteja executando uma versão totalmente suportada do PHP 1 .

Como o PHP é exposto à Internet (porque o WordPress é executado em cima do interpretador PHP), ele corre um risco maior de ataque no caso de uma exploração de vulnerabilidade dentro do PHP ser descoberta. Nesse sentido, manter o PHP atualizado (e mais ainda, ficar longe das versões 5.x do PHP no final da vida útil) é crucial não apenas para evitar que ataques ocorram, mas também para permitir que os invasores intensifiquem os ataques se eles conseguem ganhar uma posição em seu site WordPress (por exemplo, explorando uma vulnerabilidade em um plugin WordPress).

Suprimir a versão do PHP

Como a maioria dos softwares de servidor web, por padrão, o PHP expõe a versão em execução por meio de um cabeçalho HTTP X-Powered-By. Embora isso por si só não seja uma vulnerabilidade de segurança, como em qualquer outra situação, a enumeração de versões de software geralmente é útil para invasores durante a fase de reconhecimento de um ataque. Portanto, ao desabilitar a versão do PHP, você estaria dificultando um pouco o sucesso de um ataque.

Felizmente, isso é fácil de desabilitar usando a configuração expor_php. Em seu arquivo de configuração php.ini , basta adicionar o seguinte.

expose_php = Off

Remova qualquer arquivo phpinfo()

Criar um arquivo PHP usando a função phpinfo() para usar para depuração é um mau hábito comum que muitos administradores de sistemas PHP têm. Se um invasor encontrar um arquivo 'phpinfo' (geralmente chamado, sem surpresa, phpinfo.php), ele receberá uma riqueza de informações e detalhes sobre não apenas a versão do PHP em execução no servidor, mas também outros aspectos do site, como como o servidor web e de banco de dados.

Se você realmente precisa executar phpinfo(), é muito mais preferível fazê-lo a partir da linha de comando, como segue.

php -i

Se você tiver mais de uma configuração de PHP em seu sistema (muito comum), você pode usar o seguinte comando para especificar qual arquivo php.ini usar.

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

Suprimir erros e avisos do PHP

Embora erros, avisos e exceções sejam úteis durante o desenvolvimento, se exibidos em um ambiente voltado para o público, os invasores geralmente usam essas informações para obter informações sobre a configuração do servidor, o layout do aplicativo e os componentes.

As mensagens de erro são alguns dos caminhos mais comuns para a divulgação de informações, geralmente vazando informações como caminho de instalação do aplicativo e detalhes de conectividade do banco de dados. Em vez de mostrar erros e avisos, certifique-se de que essas informações sejam registradas. Mais informações sobre este tópico podem ser encontradas na documentação oficial do PHP.

Felizmente, isso é fácil de desabilitar usando a configuração display_errors. Em seu arquivo de configuração php.ini, basta adicionar o seguinte.

display_errors = Off
log_errors = On

Restringir inclui

Vulnerabilidades de inclusão de arquivos permitem que um invasor controle uma instrução PHP include(). Embora o PHP execute qualquer código PHP dentro de um arquivo incluído, ele imprimirá qualquer outra coisa (assumindo que seja texto simples). Isso significa que um invasor que assume o controle de uma vulnerabilidade de inclusão de arquivo pode acabar executando algo semelhante ao seguinte, dando-lhe acesso a arquivos confidenciais do sistema. Para ler mais sobre inclusão de arquivos, dê uma olhada neste artigo.

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

Ao definir a configuração open_basedir no php.ini, você pode instruir o PHP a permitir apenas inclusões dentro de um determinado diretório e abaixo. Embora isso não elimine as vulnerabilidades de inclusão de arquivos, certamente as torna mais restritas e também dificulta alguns ataques mais avançados que podem levar à execução de código (quando um invasor pode executar comandos em seu servidor).

Você pode definir a configuração do PHP open_basedir como segue em seu arquivo php.ini.

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

Desabilitar o arquivo remoto inclui

Além de restringir as inclusões locais a um diretório específico usando open_basedir, também é aconselhável desabilitar as inclusões remotas. Os ataques de inclusão remota de arquivos (RFI) funcionam de maneira semelhante aos ataques de inclusão local de arquivos, mas em vez de um invasor estar vinculado a arquivos no sistema, a inclusão remota de arquivos permite que um invasor inclua arquivos na rede. Isso é extremamente perigoso, e a maioria dos ataques RFI termina em um invasor capaz de executar código arbitrariamente em seu servidor web (referido como execução remota de código, ou RCE).

Para desabilitar a inclusão de arquivos remotos, use as opções allow_url_fopen e allow_url_include do PHP em seu arquivo php.ini da seguinte maneira.

allow_url_fopen = Off
allow_url_include = Off

Desabilitar ou limitar funções perigosas

No caso de um invasor, apesar de todas as suas medidas de segurança, conseguir encontrar uma vulnerabilidade na segurança PHP do seu WordPress, que ele possa explorar, a última coisa que você deseja é que ele possa executar código arbitrário em seu servidor . Se um invasor for capaz de executar código arbitrário em seu servidor, ele provavelmente poderá instalar um webshell ou estabelecer um shell reverso para controlar ainda mais seu servidor e usá-lo para fazer seus lances nefastos (como espalhar malware, usar seu site para campanhas de phishing ou negação de ataques de serviço, ou mesmo mineração de criptomoedas).

Desativando funções como shell_exec() e system(), você pode impedir que usuários e invasores usem essas funções perigosas. Embora possa haver razões legítimas para usar essas funções, elas são muito poucas e distantes entre si, e geralmente há uma maneira mais segura de obter o mesmo resultado.

Atenção – Teste o seguinte completamente em um ambiente de teste ou teste antes de executá-lo em produção, pois alguns softwares/plugins que você está executando podem (esperamos legitimamente) depender dessas funções.

A seguir está uma coleção de funções potencialmente perigosas que você pode querer desabilitar no PHP usando a configuração disable_functions em seu arquivo php.ini.

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>

Bloqueie a execução do PHP em diretórios sensíveis

Por padrão, seu diretório wp-content/uploads , que é usado para fazer upload de temas, plugins, imagens, vídeos e outros arquivos para seu site, tem permissão para executar código PHP. Isso é um pouco arriscado – se um invasor for de alguma forma capaz de tirar proveito de uma vulnerabilidade de upload de arquivo em um plugin ou tema, ele poderá fazer upload de um webshell ou um tipo semelhante de backdoor. Como a execução do PHP seria permitida no diretório wp-content/uploads , esse invasor pode realmente executar esse código PHP para fazer seus lances maliciosos.

Prevenir isso é bem simples – desabilite a execução do PHP dentro do wp-content/uploads e do diretório. A maneira ingênua seria simplesmente bloquear o acesso a arquivos *.php usando .htaccess .

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

No entanto, a configuração acima é relativamente fácil de contornar – o PHP na maioria dos casos executará com prazer arquivos .phtml .php3. A maneira mais à prova de balas seria literalmente desabilitar o mecanismo PHP dentro do diretório. A configuração .htaccess a seguir deve ser colocada dentro do diretório wp-content/uploads e wp-includes (outro diretório comumente visado por invasores).

php_flag engine off

Segurança PHP para WordPress – considerações finais

Embora o próprio WordPress deva ser considerado uma plataforma robusta e segura, o ambiente e a infraestrutura em que sua instalação do WordPress é executada ajudam bastante a garantir a segurança do seu site como um todo. A implementação dos tópicos abordados neste guia de proteção de segurança PHP fornecerá uma segunda linha de defesa, tornando significativamente mais difícil para um invasor escalar um ataque após abusar de uma vulnerabilidade em seu site WordPress.

Se você quiser saber mais sobre como fortalecer seu site WordPress, leia nosso guia definitivo sobre segurança e proteção do WordPress.

Referências usadas neste artigo [ + ]

Referências usadas neste artigo
1 https://www.php.net/supported-versions.php