Proteção de scripts PHP de análise e modificação. Lembre-se de alterar suas chaves secretas de cookies

Todos os produtos de software para proteção de scripts PHP são divididos em duas categorias: aqueles que requerem instalação de módulos adicionais no servidor e que funcionam com a configuração usual de servidores web. Os primeiros são mais confiáveis ​​em termos de segurança, pois traduzem scripts PHP de uma forma textual em um código binário especial, mas requerem acesso ao servidor com direitos de administrador. Este último pode funcionar em quase todas as hospedagens com suporte a PHP, incluindo as gratuitas, mas não são muito difíceis de hackear. O código-fonte que não usa criptografia ou compactação pode ser distinguido em um subgrupo separado.

Proteções no nível do servidor:

Zend Encoder / Zend SafeGuard Suite é a proteção comercial mais popular, os módulos para suporte Zend são geralmente instalados em todas as hospedagens pagas. Zend fornece script de domínio e ip, tempo de script de teste e ofuscação poderosa. Todos os sistemas operacionais são suportados. No domínio público, existem várias opções de utilitários de remoção do Zend, todos eles são versões modificadas do PHP 4 e 5. Versões mais antigas do Zend são removidas sem problemas, neste último há dificuldades devido à ofuscação do código-fonte.

Nova proteção comercial em desenvolvimento ativo. Ele fornece interação com scripts protegidos no nível de suas próprias APIs; os sistemas operacionais Windows e Linux são suportados. Devido à sua baixa prevalência, ele não é instalado em uma hospedagem virtual comum, mas pode muito bem ser instalado por usuários em servidores dedicados. Não há decodificadores públicos.

A proteção comercial praticamente não é encontrada, não está instalada na hospedagem virtual. Permite definir um período de teste para scripts para verificar a data em servidores de horário externos, vincular scripts protegidos a servidores, endereço IP, endereço MAC da placa de rede e esses dados são usados ​​para descriptografia. Todos os sistemas operacionais são suportados. Não há decodificadores públicos.

phpSHIELD. SourceGuardian para protótipo de PHP. Após a fusão dos dois desenvolvedores, parou de se desenvolver como um produto independente. A principal funcionalidade é a mesma, não existem descodificadores públicos.

ionCube PHP Encoder. O segundo produto de proteção de script comercial mais popular. Após o surgimento de decodificadores públicos para Zend, ele se tornou cada vez mais usado e instalado em hospedagem compartilhada. Permite criptografar não apenas scripts, mas também modelos, documentos xml, imagens, arquivos binários. Ele vincula arquivos protegidos a servidores, há um poderoso ofuscador, todos os sistemas operacionais são suportados. Não há decodificadores públicos, mas em alguns casos pode ser removido pelo deZender.

Codificador PHTML. Um raro sistema de segurança comercial que fornece a funcionalidade usual para produtos desse tipo funciona em todos os sistemas operacionais. Por uma taxa separada, você pode comprar os códigos de segurança originais e modificá-los para atender às suas necessidades. Não há decodificadores públicos.

DWebEncoder. Proteção exótica para Windows projetada para criar apresentações com script e catálogos em CDs. Na forma instalada, é algo como um servidor web independente no qual os scripts php codificados são executados. Não há decodificadores públicos.

PHP Compact. A defesa é mais teórica do que prática. Foi desenvolvido em um dos fóruns nacionais, mas parece que não progrediu além dos lançamentos do autor. Não há decodificadores, no entanto, assim como scripts protegidos.

Um add-on de código aberto para os aceleradores de php antigos Turck MMCache e eAccelerator. Converte scripts em bytecode para aumentar a velocidade de sua execução. Existem versões de módulos para Windows e Linux. Não há decodificadores públicos, mas talvez o código-fonte aberto do projeto ajude de alguma forma no estudo.

Proteções no nível da fonte:

PHP LockIt! ... Proteção comercial popular, é muito comum, principalmente em scripts de desenvolvedores estrangeiros. Permite definir um período de teste para a operação de scripts, vinculando-se a domínios e endereços IP, compactando scripts usando ferramentas php padrão (gzinflate). A única parte complicada é um bom ofuscador. As diferentes versões de proteção diferem apenas na modificação do módulo de desempacotamento. Facilmente removível nos modos manual e automático. Sem um ofuscador, ele é removido exatamente para o código-fonte; com um ofuscador, requer processamento adicional.

CNCrypto. Não existe nem uma versão demo de domínio público, a análise foi realizada usando scripts protegidos. O módulo articulado não é difícil de descompactar, a proteção é baseada apenas na boa ofuscação do código-fonte.

PHPCipher. A proteção é um serviço online. Um arquivo com seus scripts é carregado no site e o já protegido é baixado de volta. Uma licença paga permite que você assine scripts protegidos com seus dados e os use para fins comerciais. A licença gratuita permite apenas uso pessoal. A proteção em si é um módulo php protegido por Zend, que se conecta a scripts protegidos.Após o deZend, o módulo de proteção e a obtenção de todas as constantes necessárias são removidos completamente para o código-fonte. Não há função de ofuscação.

ByteRun Protector para PHP. Um produto comercial, dependendo do tipo de licença, permite proteger scripts tanto no nível do servidor quanto no nível do código-fonte. Proteção de servidor com recursos padrão, nada de especial. A proteção em nível de script é removida com muita facilidade de forma automática e manual. Não há decodificador público para a versão do servidor.

Proteção muito popular entre desenvolvedores domésticos. É um módulo de proteção fortemente repleto de código vazio, que é conectado por meio de inclusão a scripts protegidos. O algoritmo de decodificação é muito simples, não causa dificuldades na remoção manual e automática. Em todos os casos, ele é removido completamente para o código-fonte, não há função de ofuscador. Existem pequenos recursos para casos especiais de decodificação, mas eles não serão descritos aqui.

CodeLock. Outra defesa popular, um ótimo exemplo de programação analfabeta. É um aplicativo php que permite codificar os próprios scripts e o resultado de seu trabalho no navegador usando javascript. Os scripts podem ser protegidos com uma senha, mas devido à implementação medíocre, a senha é fácil de descobrir, mesmo sem remover a proteção articulada. O módulo de proteção é um script php repleto de código vazio que se conecta a scripts protegidos. O algoritmo de proteção é muito simples, ele é removido completamente para o código-fonte. Não há função de ofuscação.

TrueBug PHP Encoder, mais recentemente TrueBug PHP Obfuscator & Encoder. Um passo muito interessante para explorar. Antes da versão 1.0.2, as ferramentas php padrão para compressão gzip eram usadas, desde a versão 1.0.3 os autores desenvolveram seu próprio algoritmo de compressão. O novo produto TrueBug PHP Obfuscator & Encoder adiciona a função de ofuscação e otimização do código-fonte. O único ponto fraco da proteção é o algoritmo de decodificação de script invariável, mas o próprio algoritmo muda para cada versão da proteção. Após a análise, a proteção é facilmente removida exatamente para o código-fonte, é claro, desde que o ofuscador não tenha sido usado.

Zorex PHP CryptZ. A proteção, como o CodeLock, é um aplicativo php que requer um banco de dados MySQL para funcionar. O módulo de proteção é um script php de plug-in criptografado em várias camadas. Após a análise, o algoritmo é removido com muita facilidade exatamente para o código-fonte. Não há função de ofuscação.

Codificador de PHP grátis. Serviço online gratuito para codificação de scripts php. O módulo de proteção é um plug-in php-script coberto pelo Zend, que deve ser baixado do site.Depois que o Zend é removido e o algoritmo é analisado, a proteção pode ser facilmente removida completamente do código-fonte. O algoritmo de proteção permanece inalterado, não há função de ofuscação.

Script Php, codificação primitiva, base64 padrão. Não merece mais atenção e não tem interesse prático.

Criamos nossa própria página de registro para multisite em vez do wp-signup.php padrão.

Em uma instalação típica do WordPress, a página de registro (login, redefinição de senha) exibe o arquivo wp-login.php.

  • /wp-login.php - autorização
  • /wp-login.php?action=register - registro
  • /wp-login.php?action=lostpassword - redefinir senha

Existem condições separadas para vários sites em wp-login.php. Portanto, quando você clicar no link /wp-login.php?action=register em um multisite, o WordPress irá redirecionar para a página /wp-signup.php. Em muitos temas, a página não parece muito atraente, então faremos a nossa própria.

Site principal da rede

Por padrão, o WordPress abre uma página de registro (wp-signup.php) no domínio principal (site) da rede. No entanto, você pode fazer uma página de registro separada para cada site da rede, mesmo que tenham temas diferentes. Consideraremos o caso em que todos os sites da rede têm sua própria página de registro, mas o mesmo tema é usado e os sites diferem apenas no idioma. Se estiver usando temas diferentes, você precisará escrever mais código.

functions.php?

Não. O nome deste arquivo parece ser mencionado em todos os artigos do WordPress. Em nosso caso, visto que a funcionalidade de registro é projetada para vários sites, faz sentido movê-la para plug-ins MU que são carregados quando você abre qualquer site.

Digressão lírica

É importante notar que os plug-ins MU são carregados antes dos plug-ins normais e antes que o núcleo do WordPress seja totalmente carregado, portanto, chamar algumas funções pode levar a erros fatais no PHP. Esse carregamento "antecipado" também tem suas vantagens. Por exemplo, dentro de qualquer tema, você não pode se apegar a algumas ações que são disparadas antes mesmo do arquivo functions.php ser carregado a partir do tema. Um exemplo disso são as ações do plugin Jetpack da forma jetpack_module_loaded_related-posts (related-posts - o nome do módulo) com o qual é possível rastrear a atividade dos módulos no Jetpack. É impossível "agarrar-se" a esta ação a partir do arquivo do tema, porque a ação já foi acionada antes do tema ser carregado - os plug-ins são carregados antes dos temas. Você pode dar uma olhada em uma imagem geral da ordem de carregamento do WordPress na página Action Reference no códice.

Ordem de arquivo

Os plug-ins MU podem conter qualquer número de arquivos e qualquer estrutura que pareça lógica para você. Eu me mantenho em algo como esta hierarquia:

| -mu-plugins | - | -load.php | - | - | -selena-network | - | - | - | -signup | - | - | - | - | -plugin.php | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | -plugin.php

Todos os "plugins" necessários para nossa rede estão conectados no arquivo load.php:

// Carregar Traslates para todos os addons load_muplugin_textdomain ("selena_network", "/ selena-network / languages ​​/"); // A inscrição na rede requer WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Outros plug-ins // requerem WPMU_PLUGIN_DIR ...

As pastas de plug-ins são armazenadas dentro da pasta selena-network, cada uma com seu próprio plugin.php, que incluímos em load.php. Isso lhe dá flexibilidade e a capacidade de desligar e ligar rapidamente.

Endereço da página de registro

Para especificar o endereço da página de registro, o filtro wp_signup_location é usado. Ele pode ser encontrado dentro do arquivo wp-login.php e é responsável por redirecionar para wp-signup.php.

Case "registrar": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); sair;

Vamos adicionar nossa função a mu-plugins / selena-network / signup / plugin.php, que retornará o endereço da página de registro no site atual:

Função selena_network_signup_page ($ url) (return home_url (). "/ Signup /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network é o prefixo que uso nos nomes de todas as funções dentro dos plug-ins MU em meu site para evitar colisões, ele deve ser substituído por meu próprio prefixo exclusivo. O filtro tem uma prioridade de 99 porque alguns plug-ins como bbPress e BuddyPress podem sobrescrever este URL com o seu próprio (plug-ins MU carregam mais cedo do que plug-ins normais, veja acima). Observe que home_url () é usado em vez de network_site_url () para manter o visitante no mesmo domínio. Qualquer URL pode ser usado como endereço.

Crie uma página

Agora vamos criar uma página com o endereço site.com/signup/ por meio da interface regular e, na pasta do tema filho, o modelo para nossa nova página é page-signup.php. Um ID exclusivo pode ser usado em vez da palavra "inscrição".

Dentro do novo modelo, você precisa chamar a função selena_network_signup_main (), que exibirá o formulário de registro.

Deve-se observar que todo o processo com modelos não é necessário e, em vez disso, você pode criar seu próprio shortcode, que também chamará a função selena_network_signup_main ().

wp-signup.php e wp-activate.php

Agora vamos começar a criar uma função que exibirá o formulário de registro. Para fazer isso, copie os arquivos wp-signup.php e wp-activate.php da raiz do WordPress para mu-plugings / selena-network / signup / (e não se esqueça de conectá-los dentro de mu-plugins / selena-network / signup / plugin.php) ... Manipulações posteriores com arquivos são extremamente difíceis e demoradas de descrever, portanto, você mesmo terá que fazê-las. Vou apenas descrever o que exatamente precisa ser feito e publicar os arquivos-fonte do meu projeto:

  1. No início do arquivo, remova todos os requisitos, chamadas de função e outros códigos fora das funções.
  2. Renomeie todas as funções adicionando prefixos exclusivos aos nomes.
  3. Envolva a parte inferior do código wp-signup.php na função selena_network_signup_main e escreva $ active_signup global logo no início; ...
  4. Substitua o layout pelo seu nos lugares certos.

Dentro de wp-activate.php, você precisa fazer aproximadamente o mesmo:

  1. Remova todo o código fora das funções, envolva o layout em uma função separada.
  2. Altere o layout quando necessário.

O arquivo wp-activate.php é responsável pela página de ativação da conta. Tal como acontece com a página de registro, você precisa criar um modelo separado para ela, dentro do qual você chama a função do arquivo wp-activate.php.

Enviamos cartas de ativação

A página de registro envia ao visitante um e-mail com um link para ativar sua conta. Por padrão, isso é feito pela função wpmu_signup_user_notification () do arquivo ms-functions.php. Sua funcionalidade pode ser emprestada para sua função. A razão para parar de usar este recurso é porque ele envia o link de ativação da conta de wp-activate.php. Você pode "desabilitar" esta função usando o filtro wpmu_signup_user_notification, dando false (se você não fizer isso, a carta de ativação será enviada duas vezes, ok, na verdade, duas letras diferentes).

Função armyofselenagomez_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta = array ()) (// ... // Código da função wpmu_signup_user_notification () wp_mail ($ user_email, wp_specialchars_decode ($ message_headers), $ message); return false;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

Como resultado, a página de registro no tema Selena parece muito mais limpa e precisa.

Conclusão

Existem muitas outras maneiras não muito corretas de fazer o mesmo na Internet - redirecionamentos do Apache, formulários AJAX que não funcionam sem o Java Script, etc. do próprio site.

Observe que você deve editar os arquivos com cuidado e tentar não se desviar muito do original, de modo que, no futuro, se o WordPress alterar os arquivos wp-signup.php e wp-activate.php, será mais fácil compará-los para encontrar alterar.

Não se esqueça de olhar o código-fonte de todas as funções descritas acima para entender completamente o que e como está acontecendo dentro do código.

Bônus. Proteção contra spammer

Mesmo os menores sites WordPress estão sujeitos a registros frequentes de spam. Você pode escrever condições infinitas para filtrar bots, geralmente mais como tentar criar inteligência artificial 🙂 No caso de um multisite, o redirecionamento usual no Apache me ajudou muito, com o qual, ao abrir /wp-signup.php e / wp- acitvate.php, pedi 404 (não sou um especialista em configuração do Apache, então minhas regras podem não estar muito corretas).

RewriteEngine em RewriteBase / RewriteRule ^ wp-signup \ .php - RewriteRule ^ wp-activate \ .php - # BEGIN WordPress # Não toque nas regras do WordPress por padrão :) # ... # END WordPress

P. S. Tento descrever com o máximo de detalhes possível algumas coisas de terceiros, porque quando eu comecei, às vezes não havia ninguém para solicitar e explicar muitas coisas. Também acredito que essas pequenas dicas em outros materiais vão levar alguém a aprender algo novo e expandir seu campo de conhecimento. Expressões regulares são usadas em entradas RewriteRule, elas não são complexas, por exemplo, o caractere ^ significa o início de uma linha.

“Eles invadem sites de bancos por dinheiro, o Pentágono por espionagem e ninguém precisa do meu projeto”, infelizmente, é o que pensa a maioria dos donos de blogs pessoais, cartões de visita na Internet, escritórios virtuais de pequenas empresas. Poucas pessoas pensam em como proteger o site, mas em vão. Na realidade moderna, absolutamente qualquer plataforma, independentemente do tipo ou popularidade, é do interesse dos hackers. Quem pode precisar do seu recurso e por quê? Vamos descobrir:
1. Partidas de scriptkiddis. Jargão refere-se a aspirantes a hackers que estão dando os primeiros passos no "lado negro". Tendo adquirido várias ferramentas ou escrito alguns de seus próprios programas, eles estão ansiosos para testar seu desempenho na primeira vítima que encontram e, como regra, escolhem os alvos mais fáceis (com proteção fraca e CMS não atualizado).
2. Black SEO. Os serviços de otimizadores desonestos ainda estão em uso - colocar links ocultos no código de projetos com mais de 10 TCIs ainda é praticado. E, em primeiro lugar, os recursos em motores de código aberto (Joomla, Drupal, OpenCart e assim por diante) estão sob ataque.
3. Construindo um botnet. Proteger o WordPress com htaccess e plug-ins também é relevante porque absolutamente qualquer recurso pode ser usado para criar uma rede zumbi usada em ataques DDoS, spamming, etc.
4. Danos colaterais. Finalmente, você não pode ser atacado - o objetivo principal será hospedar, e o site servirá apenas como uma grande vulnerabilidade da infraestrutura de TI do provedor. Claro, os hackers não se importarão com seu destino.

As consequências do hackeamento podem ser as mais desagradáveis: perda de conteúdo ou do recurso como um todo, pessimização nos resultados do mecanismo de pesquisa, perda de público devido à inscrição “O site pode ameaçar a segurança de um computador ou dispositivo móvel” e até mesmo o risco de se envolver em um processo criminal se ações ilegais forem cometidas com base em seu recurso na web.

Portanto, podemos dizer com segurança que os problemas de segurança afetam absolutamente todos os webmasters. E se você os negligenciar, todos os esforços para promover o mecanismo de pesquisa (e isso é dinheiro e tempo precioso) podem ser perdidos da noite para o dia. O problema é muito urgente, então decidi começar uma série de artigos dedicados a ameaças de rede e métodos para lidar com elas. O popular sistema CMS - Wordpress será considerado em três questões.

Métodos para proteger um site WordPress

Um dos métodos de hacking mais primitivos é a força bruta. Literalmente, o termo é traduzido como “força bruta” e significa obter um par de login / senha por enumeração de força bruta de opções possíveis. Freqüentemente, as forças brutas tentam tornar sua vida mais fácil tirando proveito de erros no mecanismo e nas configurações do servidor - isso os ajuda, por exemplo, a descobrir o nome da conta, o que reduz significativamente o número de combinações. Trata-se da eliminação dessas vulnerabilidades, bem como dos métodos de combate às tentativas de acesso não autorizado que serão discutidos.

1. Use um login de administrador exclusivo

Por padrão, o sistema oferece a criação de um usuário denominado admin. No entanto, para proteger seu site WordPress, é melhor usar um login que consiste em um conjunto de letras e números aleatórios. Em um recurso ativo, o nome do administrador pode ser alterado sem problemas usando um dos dois métodos:

Por meio do painel de administração. Vá para a seção "Usuários", clique no botão "Adicionar novo" e crie uma conta. No campo “Função”, selecione “Administrador” e confirme a operação. Em seguida, faça login novamente em nome da conta recém-criada, volte para a seção "Usuários", selecione "admin" e clique em "Excluir". Na janela que se abre, coloque o botão de rádio na posição “Vincular todo o conteúdo” e selecione um novo administrador na lista suspensa e clique em “Confirmar exclusão”.
... Usando phpMyAdmin. É muito mais fácil realizar o mesmo procedimento através do painel de controle do banco de dados. Selecione o banco de dados necessário, encontre a tabela wp_users, encontre a linha “admin” (ID = 1), clique em “Alterar” e digite o nome desejado.

2. Crie uma conta de publicação dedicada

Se o administrador for "deixado de fora", isso fornecerá proteção adicional. Crie uma conta separada para postar artigos e vincule a ela todos os materiais publicados anteriormente da maneira descrita no parágrafo 1. Em seguida, adicione informações e comunique-se com os leitores apenas a partir de uma nova conta.

3. Digite uma senha forte

Siga as recomendações geralmente aceitas: a senha deve ter pelo menos 10 caracteres, deve ser única e consistir em uma sequência aleatória de letras maiúsculas e minúsculas, números e caracteres especiais.
Em nenhum caso você deve:
... componha uma senha a partir de frases significativas
... use quaisquer dados factuais (data de nascimento, nome de solteira, número da conta bancária, ano atual ...)
Isso eliminará o risco de pesquisar uma frase secreta usando um dicionário e também aumentará significativamente o tempo necessário para a força bruta. Portanto, quebrar uma sequência de 10 caracteres, consistindo apenas em letras minúsculas e números (hki458p1fa), levará 10 dias de tempo de computador para um PC, mas se você adicionar letras maiúsculas e caracteres adicionais (Nv6 $ 3PZ ~ w1), este período aumentará até 526 anos, garantindo proteção quase absoluta do WordPress. Criar e lembrar essas senhas é bastante difícil, especialmente se você for responsável por vários projetos. Portanto, para gerá-los e armazená-los, é melhor usar gerenciadores especiais, por exemplo, KeePassX, distribuídos gratuitamente, ou um documento de teste regular (é melhor se for compactado em um arquivo com uma senha).

4. Altere a senha do banco de dados

As regras acima também são verdadeiras para a segurança do código de acesso do MySQL. Afinal, é lá que está todo o conteúdo, além do hash da frase secreta do administrador. Se você já está usando uma senha fraca, vale a pena alterá-la. Isto se faz do seguinte modo:

1. Vá para o painel de controle do phpMyAdmin
2. Abra a guia "Usuários" e selecione o proprietário do banco de dados
3. Clique em “Editar privilégios”
4. Encontre a coluna "Alterar senha" e insira a nova sequência secreta nos campos apropriados
5. Salve as alterações clicando em "Ok"

Agora tudo o que resta é editar wp-config.php, caso contrário, o WordPress não será capaz de se conectar ao banco de dados. Encontre a linha define (‘DB_PASSWORD’, ‘senha’); e digite a nova senha em vez da palavra senha. Observe que, como o caractere (‘) é usado para delimitar comandos SQL, ele não deve ser usado como parte de uma frase secreta.

5. Atualize as senhas regularmente

Eles devem ser trocados pelo menos a cada seis meses. Uma mudança extraordinária de frases de código deve SEMPRE ser realizada após:

Transferência de dados para autenticação a terceiros (programadores, administradores de sistema, otimizadores e outros especialistas, mesmo que trabalhem na equipe da empresa de hospedagem)
... fazer login em um recurso da web a partir do computador de outra pessoa (em uma festa, em um cibercafé)
... autorização de equipamentos que podem ter sido comprometidos (uma máquina infectada com um vírus)

6. Não se esqueça de alterar as chaves secretas dos cookies

Eles estão localizados no arquivo wp-config.php. Existem 8 deles:

define ("AUTH_KEY", "chave única"); define ("SECURE_AUTH_KEY", "chave única"); define ("LOGGED_IN_KEY", "chave única"); define ("NONCE_KEY", "chave única"); define ("AUTH_SALT", "chave única"); define ("SECURE_AUTH_SALT", "chave única"); define ("LOGGED_IN_SALT", "chave única"); define ("NONCE_SALT", "chave única");

define ("AUTH_KEY", "chave única"); define ("SECURE_AUTH_KEY", "chave única"); define ("LOGGED_IN_KEY", "chave única"); define ("NONCE_KEY", "chave única"); define ("AUTH_SALT", "chave única"); define ("SECURE_AUTH_SALT", "chave única"); define ("LOGGED_IN_SALT", "chave única"); define ("NONCE_SALT", "chave única");

Como você pode imaginar pelos nomes das variáveis, as chaves são responsáveis ​​por criptografar os cookies (a conhecida gíria: cookie - cookies, salt - salt, alimentamos os hackers com cookies salgados), que são usados ​​para fazer o site "lembre-se" do seu computador após a autorização. O resultado final é que mesmo que o invasor tenha à sua disposição o hash da senha do administrador, ele não será capaz de gerar os cookies necessários para acessar o site sem as frases secretas listadas.

Para melhorar a segurança, as sequências de caracteres padrão devem ser substituídas por sequências exclusivas imediatamente após a implantação do CMS. Por conveniência, os desenvolvedores criaram um gerador da web localizado em www.api.wordpress.org/secret-key/1.1/salt/ - quando você entrar, verá as chaves e, se atualizar a página, as combinações serão atualizadas .

7. Autorização dupla para a área administrativa

O Htaccess permite que você proteja ainda mais seu site WordPress adicionando autenticação em nível de servidor. O código será semelhante a este:

< Files wp- login. php> # Nós definimos o tipo de autenticação básica - isso significa que quando você tenta# acessando o diretório ou arquivo especificado, será solicitada uma senha: AuthType básico # Digite o texto que será exibido no cabeçalho do formulário: AuthName "Identifique-se" # Especifique o caminho para o arquivo que contém a frase-senha: AuthUserFile "/home/site/.htpasswd" # Indicamos que ao acessar o arquivo wp-login.php, você deve inserir a senha: Requer usuário válido # Negar acesso ao arquivo .htpasswd a terceiros:< Files . htpasswd>pedido permitir, negar negar de todos

# Selecione o arquivo de script de autorização: # Defina o tipo de autenticação básica - isso significa que ao tentar # acessar o diretório ou arquivo especificado, será solicitada uma senha: AuthType basic # Digite o texto que será exibido no cabeçalho do formulário: AuthName "Identifique-se" # Especifique o caminho para o arquivo que contém a senha: AuthUserFile "/home/site/.htpasswd" # Indicamos que ao acessar o arquivo wp-login.php, você deve inserir uma senha: Require valid-user# Negar acesso ao arquivo .htpasswd a terceiros: pedido permitir, negar negar de todos

Ao mesmo tempo, seria bom cuidar da segurança do próprio htaccess. A rigor, tal diretiva deve ser explicitada nas configurações principais de hospedagem, mas, devido ao descuido de alguns provedores, você deve evitar:

Substitua o nome desejado em vez de "login". Resta gerar a própria senha, bem como criptografá-la, porque armazenar esses dados em texto não criptografado é um luxo inadmissível. Existem muitos serviços para isso, mas é melhor escrever o script necessário você mesmo. Isto se faz do seguinte modo:

1) Crie um arquivo .php no bloco de notas, por exemplo crypt.php
2) Digite o código aqui, substituindo sua senha em vez da palavra "Senha":

3) Salve o arquivo e faça upload para o diretório raiz
4) Siga o link site_name.ru / crypt.php - o hash da senha aparecerá na tela
5) Salve este valor no arquivo .htpasswd e carregue-o no diretório raiz e exclua crypt.php

O toque final é a proibição de visualizar o conteúdo do diretório de recursos da web. Basta adicionar uma única linha ao htaccess:

Opções tudo - índices

Opções Todos - Índices

Isso é feito para que os hackers não possam descobrir quais arquivos estão nos diretórios do projeto. Em muitos sites de hospedagem, essa diretiva já está incluída nas configurações do servidor, mas se esse ponto for esquecido, você deve registrá-la.

8. Instale o captcha

Usar o captcha permitirá que você corte, se não todos, pelo menos a maioria dos bots de força bruta, e ao mesmo tempo. O diretório do plugin de proteção de sites do WordPress oferece muitas opções. Além de conectar uma solução proprietária do Google, Captcha by BestWebSoft de tipo misto (gráfico e texto), que é baseado em operações matemáticas, é de grande interesse. Independência de serviço, clareza e nível aceitável de complexidade tornam o módulo um dos melhores.

A personalização não é um grande problema. A guia "Básico" permite escolher onde exibir o captcha, bem como especificar um título e um símbolo para marcar os campos que são obrigatórios.

A seção "Avançado" oferece a capacidade de criar suas próprias mensagens de erro, bem como ativar pacotes de imagens adicionais para tornar a vida ainda mais difícil para os bots.

Outro recurso útil é a lista de permissões integrada de endereços IP para os quais o captcha não será exibido.

O resultado da instalação e ativação do plugin será o aparecimento de um formulário na página de autorização:

9. Altere o endereço de administrador

Falando sobre como proteger um site WordPress, vale a pena mencionar uma forma mais radical, mas também mais complicada - alterar a URL da página de login no nível do script. O procedimento é realizado em várias etapas:

1. Renomeie o arquivo wp-login.php. Use uma sequência aleatória de letras latinas minúsculas, números e travessões. Por exemplo: abc-123.php
2. Encontre todas as referências a wp-login.php no arquivo resultante e substitua-as pelo novo nome.
3. Para que o site funcione corretamente, a substituição também deve ser feita em: wp-activate.php, general-template.php, post-template.php, functions.php, class-wp-customize-manager.php, general -template.php, link-template.php, admin-bar.php, post.php, pluggable.php, ms-functions.php, canonical.php, functions.wp-scripts.php, wp-signup.php, my -sites.php, schema.php, ru_RU.po

Após essas manipulações, o painel de administração estará localizado no site / abc-123.php. O acesso ao novo arquivo deve ser limitado e protegido por senha, conforme descrito acima. Também é possível enganar hackers em potencial criando um arquivo wp-login.php falso e definindo uma senha para ele.

Uma opção ainda mais simples é usar o complemento "Renomear wp-login.php". Após instalar o plugin para proteger o site, um novo campo aparecerá no menu "Configurações" -> "Links permanentes":

10. Especifique o IP do administrador

Segurança adicional pode ser fornecida se você tiver um endereço IP estático. Negar o acesso a wp-login.php de qualquer computador que não seja o seu tornará a vida muito mais difícil para os hackers:

< Files wp- login. php>negar pedido, permitir negar de todos, permitir de 127.0.0.1, 127.0.02 # Separe seus endereços IP com vírgulas

pedido negar, permitir negar de todos permitir de 127.0.0.1, 127.0.02 # Separe seus endereços IP com vírgulas

11. Desative erros de autorização

Ao aplicar força bruta em senhas, um invasor achará muito útil saber que os dados inseridos estão incorretos. Essas mensagens são exibidas a cada tentativa malsucedida de login, e o WordPress também relata o que foi digitado incorretamente, nome de usuário ou senha. Para se livrar deles, você só precisa adicionar apenas uma linha a functions.php:

add_filter ("login_errors", create_function ("$ a", "return null;"));

add_filter ("login_errors", create_function ("$ a", "return null;"));

Para fazer isso, selecione "Aparência" -> "Editor" -> "Funções do tema" no painel de administração. É necessário escrever o código após a tag de abertura

12. Use uma conexão segura.

Para criptografar o tráfego entre o computador do usuário e o servidor web, existe o protocolo https, cuja utilização exclui a possibilidade de interceptar dados importantes, no nosso caso, dados de identificação. Para ativá-lo, primeiro você precisa adquirir um certificado SSL que execute duas funções ao mesmo tempo: autenticação de um recurso da web e criptografia das informações transmitidas. Você pode obtê-lo em centros especializados ou em vários registradores de nomes de domínio. Para fins não comerciais, é suficiente adquirir um certificado de nível de entrada gratuito (oferecido pela empresa www.startssl.com). Quanto ao processo de instalação, via de regra, ele é descrito em detalhes na seção de ajuda do hoster.

Tendo recebido um certificado SSL, você precisa configurar o redirecionamento da parte administrativa do recurso da web para uma conexão segura. No caso do WordPress, isso é feito usando a seguinte construção:

< IfModule mod_rewrite. c>Opções + FollowSymlinks RewriteEngine On RewriteCond% (HTTPS) = off RewriteCond% (REQUEST_URI) = / wp- login. php RewriteRule (. *) https:

Opções + FollowSymlinks RewriteEngine On RewriteCond% (HTTPS) = off RewriteCond% (REQUEST_URI) = / wp-login.php RewriteRule (. *) Https: //% (HTTP_HOST)% (REQUEST_URI)

Você também pode forçar o uso de certificados SSL no nível do mecanismo. Para fazer isso, abra o arquivo wp-config.php e adicione depois

define ("FORCE_SSL_ADMIN", verdadeiro);

define ("FORCE_SSL_ADMIN", verdadeiro);

Além disso, você pode configurar um redirecionamento global de http para https. Para novos sites, essa abordagem é ideal, visto que o Google incentiva projetos seguros, dando-lhes alguma prioridade nos resultados de pesquisa:

< IfModule mod_rewrite. c>Opções + FollowSymlinks RewriteEngine on RewriteCond% (HTTPS) = off RewriteRule ^ (. *) $ Https: //% (HTTP_HOST)% (REQUEST_URI)

Opções + FollowSymlinks RewriteEngine on RewriteCond% (HTTPS) = off RewriteRule ^ (. *) $ Https: //% (HTTP_HOST)% (REQUEST_URI)

13. Bloquear intrusos

Se for detectada atividade suspeita de determinados IPs, vale a pena bloquear o acesso ao site. Isso é feito por analogia com o método anterior. A diferença é que as diretrizes são escritas para o projeto como um todo, e listamos os endereços daqueles que queremos banir:

Solicitar Permitir, Negar Permitir de todos Negar de 127.0.0.1, 127.0.02 # Especificar IP indesejado

O método é confiável, mas ineficaz. Em primeiro lugar, é de alguma forma necessário registrar os pedidos de serviços de força bruta e separá-los dos visitantes respeitáveis. Em segundo lugar, com um ataque massivo, você simplesmente não será capaz de rastrear e conduzir o IP de hackers e bots manualmente. Este método só é bom se o administrador tiver uma lista negra confiável de endereços.

Caso contrário, você pode usar um plugin de segurança de site WordPress chamado WP Cerber. Esta solução é totalmente gratuita, ao mesmo tempo que oferece um conjunto impressionante de ferramentas projetadas para prevenir o hacking de CMS. Você pode instalá-lo diretamente do painel de administração.

Por padrão, parâmetros razoavelmente sensíveis são oferecidos. No entanto, o número de tentativas deve ser aumentado para 5, a fim de evitar mal-entendidos.

A caixa de seleção ao lado de “Bloquear IP para qualquer solicitação wp-login.php” deve ser marcada se você alterar o endereço de administrador da maneira descrita anteriormente.

Para esses fins, você também pode usar a ferramenta do próprio WP Cerber:

O modo de plugin para proteger o site Citadel também não precisa de configuração adicional. Ele é projetado para “naftalina” o projeto durante um ataque massivo de força bruta. É melhor desmarcar a caixa ao lado de “Tentativas de registro de login em um arquivo” - isso ajudará a eliminar a carga adicional no servidor.

A guia "Listas de acesso" é usada para criar uma lista de IP "preta" e "branca" (se você tiver um endereço estático, certifique-se de adicioná-lo à lista de endereços confiáveis), e a seção "Ferramentas" permite que você importar e exportar as configurações feitas anteriormente. No entanto, essas possibilidades não requerem consideração separada.

14. Mova o arquivo de configuração

Como descobrimos acima, wp-config.php armazena dados críticos como login e senha para acessar o MySQL, bem como chaves de API. A próxima etapa parece ser óbvia - proteger o WordPress por meio do htaccess, restringindo o acesso ao arquivo:

< Files wp- config. php>Pedido permitir, negar Negar de todos

Pedido permitir, negar Negar de todos

No entanto, também existe um método mais confiável. O WordPress tem um recurso muito interessante que poucas pessoas conhecem. O mecanismo permite colocar o arquivo de configuração um nível acima do diretório raiz. O php pode ser movido para o diretório do site. Nesse caso, o arquivo ficará totalmente inacessível pela Internet, enquanto as informações nele contidas ainda serão lidas pelo CMS.

15. Adicionar verificação REFERER

Um método comprovado de proteção do WordPress contra spam também ajudará no enfrentamento de ataques de força bruta. Afinal, a força bruta de senhas não é, de forma alguma, um trabalho manual: programas especializados são usados ​​para esses fins. Isso significa que, ao habilitar a verificação de cabeçalho nas solicitações de entrada, você pode cortar os bots que vieram do nada com um HTTP REFERER vazio:

< IfModule mod_rewrite. c>RewriteEngine On RewriteCond% (REQUEST_METHOD) POST RewriteCond% (REQUEST_URI). (wp- comentários- post | wp- login) \. php * RewriteCond% (HTTP_REFERER) !. * tekseo. su. * [OU] RewriteCond% (HTTP_USER_AGENT) ^ $ RewriteRule (. *) http: //% (REMOTE_ADDR) / $ 1

RewriteEngine On RewriteCond% (REQUEST_METHOD) POST RewriteCond% (REQUEST_URI). (Wp-comments-post | wp-login) \. Php * RewriteCond% (HTTP_REFERER) !. * Site. * RewriteCond% (HTTP_USER_AGENT) ($ RewriteCond%) ($ RewriteCond) ($ RewriteCond% (HTTP_USER_AGENT) HTTP_USER_AGENT) ($ RewriteCond) ^ $ RewriteCond *) http: //% (REMOTE_ADDR) / $ 1

16. Proteja XML-RPC

Desde a versão 3.5, a capacidade de desativar o protocolo de chamada de procedimento remoto XML-RPC desapareceu do WordPress. Basicamente, é necessário interagir com os aplicativos móveis, mas nem todos precisam dessa funcionalidade. Ao mesmo tempo, xmlrpc.php é usado ativamente para realizar ataques DDoS, sendo o calcanhar de Aquiles de todo o projeto.

Além disso, os hackers pensaram em usar XML-RPC para força bruta. Usar o método wp.getUsersBlogs permite que você itere sobre credenciais muito mais rápido do que usar o formulário de administrador. Como muitas chamadas XML-RPC requerem autorização, uma solicitação como esta:

< methodCall> < methodName>wp. getUsersBlogs < params>< param>< value>< string>admin < param>< value>< string> 12345

wp.getUsersBlogs admin 12345

fará com que o motor informe se a combinação passada está correta. Para se livrar deste flagelo, você deve desativar completamente o protocolo. Isto pode ser feito de várias maneiras:

1) Ao bloquear o acesso ao arquivo xmlrpc.php via htaccess

require_once (ABSPATH. "wp-settings.php");

precisa se registrar

função remove_x_pingback ($ headers) (unset ($ headers ["X-Pingback"]); return $ headers;) add_filter ("wp_headers", "remove_x_pingback");

4) Usando o plug-in de publicação Control XML-RPC, retornando a opção apropriada em Configurações -> Gravação:

Observação: o add-on desabilita o protocolo imediatamente após a ativação e, nas configurações, você pode habilitá-lo marcando a caixa de seleção correspondente.

17. Monitore ataques de força bruta

Finalmente, vale a pena mencionar um plugin interessante para registrar tentativas de hacking - Autenticação e gravador de log xmlrpc. Embora o mesmo WP Cerber tenha ferramentas de monitoramento integradas, este módulo ainda será útil, especialmente para aqueles que precisam dos recursos do protocolo descrito acima. O AX LogWriter é capaz de rastrear a força bruta por meio de xmlrpc.php, para que você possa avaliar o grau de ameaça e a conveniência de se recusar completamente a usar seus recursos. Finalmente, para aqueles que não estiveram envolvidos na segurança de seu projeto, o plugin para proteção do site abrirá seus olhos para a importância das atividades listadas.

Usar o AX LogWriter é simples. Após a instalação, a seção correspondente aparecerá no menu de administração, onde você pode fazer todas as alterações necessárias:

No campo “Tipo de erro”, selecione o método de salvamento. Suporta gravação no log do sistema, log do servidor Apache, bem como a capacidade de criar um arquivo personalizado. No último caso, ele também pode ser configurado com um nome de log de erro personalizado e um caminho de log de erro personalizado. Isso abre amplas possibilidades para o administrador do sistema - por exemplo, a solução pode ser usada junto com o fail2ban. Além disso, não se esqueça de selecionar o fuso horário apropriado na coluna Fuso horário.

O log personalizado pode ser visualizado diretamente do painel de administração na página do Visualizador de log personalizado:

Vamos resumir:

Os métodos listados ajudarão a aumentar significativamente a segurança de seu recurso e protegê-lo de bots de força bruta, hooligans de rede e prática de scriptkiddis. No entanto, tudo o que foi descrito acima é apenas a ponta do iceberg. Os atacantes têm métodos muito mais sofisticados em seu arsenal. E no próximo artigo falaremos sobre como se proteger de hackers reais usando várias vulnerabilidades do motor e do software de servidor. Tal como neste material, além das “regras de higiene” gerais serão consideradas as principais configurações do CMS, formas de modificar o código, bem como os plugins mais relevantes.


Quando se trata de segurança de aplicativos, é importante cuidar não apenas do hardware e do sistema operacional, mas também de escrever scripts seguros. Neste artigo, você aprenderá como manter seu aplicativo seguro e menos vulnerável. Abaixo está uma lista de medidas para ajudá-lo a proteger seu aplicativo de todos os tipos de ataques:

  1. Validação de dados de entrada
  2. Proteção contra ataques XSS
  3. Proteção contra ataques CSRF
  4. Prevenção de injeção de SQL
  5. Proteção do sistema de arquivos
  6. Proteção de dados da sessão
  7. Processamento de erro
  8. Protegendo Arquivos Incluídos

Validação de dados de entrada

Ao projetar seu aplicativo, você precisa se esforçar para protegê-lo de dados de entrada “ruins”. A regra a seguir é algo como: "Nunca acredite no que o usuário digitou." Embora a maioria dos usuários não seja uma ameaça, sempre existe a possibilidade de alguém querer invadir seu site usando dados “ruins” inseridos por meio de formulários ou da barra de endereço. Se você sempre valida e filtra os dados recebidos, tem uma boa chance de escrever um aplicativo seguro.

Sempre verifique seus dados em scripts PHP. Se você usar JavaScript para validar dados, um invasor pode desativá-lo em seu navegador a qualquer momento. Nesse caso, seu aplicativo está em risco. Ninguém é contra a validação de JavaScript, mas para uma boa proteção, você precisa verificar novamente os dados em scripts PHP.

Proteção contra ataques XSS

Um script de site cruzado ou ataque XSS é um ataque baseado na injeção de código em páginas potencialmente vulneráveis. O perigo é que o código malicioso pode ser inserido por meio de formulários e, em seguida, exibido no navegador.

Suponha que seu site tenha um formulário para inserir comentários, que são exibidos imediatamente após a adição. Um invasor pode inserir um comentário contendo código JavaScript. Após o envio do formulário, os dados são enviados ao servidor e inseridos no banco de dados. Depois disso, os dados são recuperados do banco de dados e o novo comentário é exibido na página HTML, incluindo o código JavaScript integrado. Ele pode redirecionar o usuário para alguma página maliciosa ou site de phishing.

Para proteger seus aplicativos, execute os dados de entrada por meio da função strip_tags (), que removerá todas as tags presentes. Ao exibir dados em um navegador, use a função htmlentities ().

Proteção contra ataques CSRF

O próximo tipo de ataque que examinaremos é um ataque CSRF ou falsificação de solicitação entre sites. O invasor usa vários truques para obter informações confidenciais ou fazer um acordo sem o conhecimento da vítima. Isso acontece principalmente em sites mal protegidos, onde a lógica de negócios é baseada no trabalho de solicitações GET.

De modo geral, as solicitações GET são idempotentes. Idempotência, neste contexto, significa que uma mesma página pode ser acessada qualquer número de vezes sem qualquer interferência externa. É por isso que as solicitações GET devem ser usadas apenas para obter acesso às informações, mas em nenhum caso para realizar vários tipos de transações.

O exemplo simples a seguir mostra como um site não seguro pode estar sujeito a um ataque CSRF:

Suponha que Bob queira realizar um ataque CSRF em Alice. Ele formou um endereço de url especial e o enviou para Alice por e-mail:

Visite meu site!

Se Alice for autorizada no site example.com e seguir este link, $ 1000 serão transferidos de sua conta para a conta de Bob. Alternativamente, Bob também pode enviar uma imagem e preencher o URL "ruim" no atributo src.

O navegador não conseguirá exibir esta imagem, uma vez que ela não existe, mas a solicitação será feita sem o conhecimento e participação de Alice.

Para evitar esse tipo de ataque, use apenas solicitações POST para processos projetados para alterar informações no banco de dados. Não use $ _REQUEST. Use $ _GET para lidar com os parâmetros GET e $ _POST para recuperar os parâmetros POST.

Como medida adicional, você pode gerar um token exclusivo e anexá-lo a cada solicitação POST. Quando um usuário efetua login no sistema, você pode gerar um token aleatório e gravá-lo na sessão. Como todos os formulários são exibidos para o usuário, esse token deve ser gravado em um campo oculto. A lógica de negócios do aplicativo deve fornecer funcionalidade que verificará o token dos formulários e o token armazenado na sessão.

Prevenção de injeção de SQL

Você deve usar o PDO para executar consultas no banco de dados. Com consultas parametrizadas e instruções preparadas, você pode mitigar a ameaça de injeção de SQL.

Vamos dar uma olhada no seguinte exemplo:

No código acima, estamos enviando uma solicitação ao método prepare (), incluindo os parâmetros nomeados :: nome e: idade. Assim, a consulta é pré-compilada para posterior substituição de dados. Quando o método execute () é chamado, a solicitação é totalmente formada e executada. Se você usar essa técnica, todas as tentativas de um invasor de executar a injeção de SQL serão anuladas.

Proteção do sistema de arquivos

Como um desenvolvedor responsável, você deve sempre escrever código que não comprometa seu sistema de arquivos. Vejamos o código que envia um arquivo para download dependendo dos dados enviados pelo usuário.

Este script é muito perigoso, pois permite acessar qualquer diretório acessível a partir do arquivo com o script: o diretório com as sessões, as pastas do sistema e muito mais.

Proteção de dados da sessão

Por padrão, todas as informações da sessão são gravadas no diretório temporário. Se você estiver usando hospedagem compartilhada, alguém além de você pode escrever um script e ler os dados da sessão. Portanto, tome cuidado ao armazenar senhas ou números de cartão de crédito nas sessões.

Se você ainda precisa armazenar esses dados em uma sessão, a criptografia é a melhor medida. Isso não resolve completamente o problema, uma vez que os dados criptografados não são 100% seguros, mas as informações armazenadas ficarão ilegíveis. Além disso, você deve considerar que os dados da sessão podem ser armazenados em outro lugar, como um banco de dados. O PHP possui um método especial session_set_save_handler () que permite a você armazenar dados da sessão de sua própria maneira.

Desde o PHP 5.4, você pode passar um objeto do tipo SessionHandlerInterface para session_set_save_handler ().

Processamento de erro

Durante o desenvolvimento de uma aplicação, vale a pena prestar atenção a todos os tipos de erros que possam surgir, porém, eles precisam ser ocultados dos usuários finais. Se forem exibidos erros para os usuários, seu site ficará vulnerável. Portanto, a melhor solução seria uma configuração diferente para o servidor de destino e o servidor de desenvolvimento.

No servidor público, você precisa desabilitar opções como display_errors e display_start_up_errors, mas opções como error_reporting e log_errors devem estar ativas para que todos os erros encontrados pelos usuários sejam registrados.

Você também pode usar set_error_handler para definir seu próprio manipulador de erros. No entanto, pode haver limitações, porque o manipulador nativo é inferior ao mecanismo PHP nativo. Os erros E_CORE_ERROR, E_STRICT ou E_COMPILER_ERROR não podem ser capturados no mesmo arquivo que um manipulador específico. Além disso, os erros que podem ocorrer no próprio manipulador também não podem ser detectados.

Para obter uma maneira mais elegante de capturar exceções, o código potencialmente perigoso deve ser colocado em um bloco try / catch. Todas as exceções nativas devem ser objetos de classes ou subclasses de Exception. Se exceções foram lançadas, elas podem ser tratadas no bloco try / catch.

Protegendo Arquivos Incluídos

Freqüentemente, outros arquivos são carregados em scripts PHP, como a conexão ao banco de dados e muitos outros. Alguns desenvolvedores atribuem a esses arquivos a extensão .inc. O PHP não analisa esses arquivos por padrão. Se você abordá-los diretamente, o usuário poderá ver o texto deste arquivo. Se o hacker conseguir acessar o arquivo que armazena os dados da conexão com o banco de dados, posteriormente ele poderá obter acesso a todos os dados do seu aplicativo. Portanto, sempre use a extensão .php para arquivos carregados e armazene-os onde não haja acesso direto do usuário.

Resultado

Se você seguir as 8 regras listadas, isso aumentará muito a resistência do seu aplicativo a vários tipos de ataques. Não confie nos dados inseridos pelos usuários, proteja seus arquivos e banco de dados.

Vamos pensar em quem é um hacker? Um hacker não é um cracker! Muitas vezes as pessoas confundem esses conceitos. Um hacker é, antes de tudo, uma pessoa com pensamento inovador, e essa é a sua força, por assim dizer.

Para resistir com sucesso a um hacker, você também precisa aprender a pensar fora da caixa. Como se costuma dizer, uma cunha é derrubada por uma cunha.

Hoje vou oferecer a você uma maneira muito incomum de se proteger de ataques como php include. Claro, ele não é adequado para todos. E, se honestamente, ele protege não do ataque em si, mas de sua detecção. Intrigado?

Como encontrar inclui ...

Vamos primeiro entender exatamente como um invasor tenta encontrar uma vulnerabilidade.

Se parece com isso. O invasor modifica todos os parâmetros de entrada um por um, assumindo que os dados desses parâmetros entram na função de inclusão. Bem, ou se, de uma forma simples, ele tenta "anexar" arquivos. E para determinar se existe uma vulnerabilidade ou não, ele precisa incluir algum arquivo no sistema de destino (se ele souber - há uma vulnerabilidade, não - não há vulnerabilidade).

Naturalmente, se um invasor age de fora, ele não conhece a estrutura de localização dos diretórios e arquivos, e não pode anexar nenhum arquivo, pois não saberá o caminho até ele. Mas há arquivos que sempre existem no sistema e para os quais sempre há permissões de leitura. Para Linux, é / etc / passwd, e para Windows, seja C: \ boot.ini. Mas, a propósito, o Windows é de pouco interesse para nós, então falaremos mais sobre passwd

/ etc / passwd

Provavelmente você encontrou mais registros do formulário em seus logs:

Ação = .. / etc / passwd% 00
? action = .. / .. / etc / passwd% 00
? action = .. / .. / .. / etc / passwd% 00
? action = .. / .. / .. / .. / etc / passwd% 00
? action = .. / .. / .. / .. / .. / etc / passwd% 00
? do = .. / etc / passwd% 00
? do = .. / .. / etc / passwd% 00
? do = .. / .. / .. / etc / passwd% 00
? do = .. / .. / .. / .. / etc / passwd% 00
? do = .. / .. / .. / .. / .. / etc / passwd% 00
? id = .. / etc / passwd% 00
? id = .. / .. / etc / passwd% 00
? id = .. / .. / .. / etc / passwd% 00
? id = .. / .. / .. / .. / etc / passwd% 00
? id = .. / .. / .. / .. / .. / etc / passwd% 00

Se sim, então você deve saber que tentou encontrar php include (bem, ou a capacidade de ler arquivos arbitrários, mas não estamos interessados ​​nisso agora). Então, se um de seus parâmetros não for processado corretamente e acabar em uma função incluir (), então o arquivo / etc / passwd seria adicionado, seu conteúdo seria interpretado como um script php e, como não contém tags de código php, seria exibido no navegador inalterado. Isso serviria como um “marcador” para o invasor ter uma vulnerabilidade.

Por que estou escrevendo isso, ao fato de que ao procurar incluir, o invasor irá definitivamente (garanto que em 90% dos casos) tentará adicionar o arquivo / etc / passwd.

Proteja-se, senhor!

Talvez você esteja pensando agora: "Ele deseja oferecer um WAF regular e filtrar pacotes pela presença de / etc / passwd neles?" Não. Esta é a forma padrão. Este é um exemplo de como uma pessoa comum pensa.

Vamos ser um pouco criativos. Por que simplesmente não adicionamos algum código php ao conteúdo do arquivo passwd? E se de repente o invasor conseguir conectá-lo, nosso código php será executado. (Você considera isso um absurdo? - veja a conclusão)

Como sabemos que o único que adivinhará incluir este arquivo é um cracker, nosso código php deve bani-lo e, para evitar que nosso sistema seja hackeado ainda mais, bloqueie o arquivo vulnerável e é desejável notificar o administrador sobre o incidente.

Mas como você adiciona código php a / etc / passwd porque sua sintaxe é estritamente regulamentada? Cada usuário tem um campo de “comentário” - uma descrição do usuário, você pode inserir o que quiser lá (exceto os dois pontos, é claro). Portanto, pegamos e adicionamos um usuário ao sistema com o comentário de que precisamos. Depois disso, / etc / passwd conterá a seguinte linha

root: x: 0: 0: Superusuário: /:
daemon: *: 1: 5 :: /: / sbin / sh
bin: *: 2: 2 :: / usr / bin: / sbin / sh
sys: *: 3: 3 :: /:
adm: *: 4: 4 :: / var / adm: / sbin / sh
securityuser: *: 1001: 1001::/:

Bem, no script do plug-in, já estamos executando as ações de que você precisa - banir o usuário, bloquear a solicitação, notificar o administrador.

Como resultado, temos uma espécie de armadilha que pode proteger seu site de hackers.

Conclusão

Sim, estou plenamente ciente de que tudo o que foi escrito acima parece um absurdo. E eu entendo perfeitamente que ninguém usará isso na prática. Mas não foi para isso que escrevi. Escrevi para mostrar um exemplo de abordagem não padronizada no campo da proteção.

Obrigado pela sua atenção =)