Jump to content


Photo

Segurança: Trojan Vindo Via _Get


  • Faça o login para participar
12 replies to this topic

#1 mi7chael

mi7chael

    12 Horas

  • Usuários
  • 266 posts
  • Sexo:Masculino

Posted 23/03/2010, 10:35

Pessoal, aconteceu uma coisa com um site que eu fiz pra um cara q eu nunca tinha visto.
Tem um campo de receber imagens, esse campo tem um filtro que só deixa passa imagens (*.jpg, *.jpeg, *.gif, *.png ou *.bmp), com menos de 200kb, e no máximo 1024 x 1024 pixels. E ainda, renomeia a imagem pra um padrão do site (data e hora, por exemplo: foto.jpg vira 23032010102612.jpg) Até aí tudo bem.
Só que algum filho de chocadeira enviou um cavalo de tróia, descobri q o nome do trojan é PHP:C99Shell-B e tem 188kb. Só que ele está como imagem, tipo, 21032010091256.jpg.
Ou seja, o sistema verificou o MIME dele e identificou como imagem (o cara q enviou deve ter alterado a extensão dele antes de enviar) e renomeou.
Como isso é possível ???
E ainda, o trojan apresenta algum risco, estando disfarçado assim ??
Ele é executado, eu fiz um teste. Criei uma página de teste e inseri ele, como se fosse uma imagem normal. No entanto, na hora de abrir a página, ele abre, e aí o antivirus bloqueia, mas antes dá tempo olhar e talz, até dei um print screen:

Posted Image

Alguém sabe como faço pra evitar q isso aconteça novamente ??
Como permitir que o código receba somente imagens ??

Edição feita por: mi7chael, 23/03/2010, 10:37.


#2 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 23/03/2010, 11:38

Amigo, bom dia.
Tudo bom?

Como está verificando o formato do arquivo?

Abraços.
Mateus Antunes
Mateus Antunes
MBASistemas

#3 Max William

Max William

    12 Horas

  • Usuários
  • 192 posts
  • Sexo:Masculino
  • Localidade:Maringá - Paraná

Posted 23/03/2010, 12:22

Eu ja sabia disso, mas nunca tinha visto ngn ter sido vitima do mesmo.
Assunto é do meu interesse também, pq atual projeto q to desenvolvendo é justamente um sistema de envio de imagens, so que no meu caso é mais complicado..
porque eu recebo arquivos compactados, ate consigo acessar os arquivos dentro .zip enviado, porem, não tenho certeza se posso fazer uma verificação mais aprofundada.
Se eu lhe ajudei ;) Clique para agradecer!

#4 mi7chael

mi7chael

    12 Horas

  • Usuários
  • 266 posts
  • Sexo:Masculino

Posted 23/03/2010, 13:05

Eu verifico a imagem com o seguinte if:

if(eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", $imagem["type"]))

Essa é a primeira verificação, caso seja um arquivo jpeg, jpg, png, gif ou bmp, passa pro próximo if que verifica se ela possui menos de 200kb, se sim, passa pro próximo que verifica se é menor que 1200 x 1200 pixels, aí faz o upload.

Edição feita por: mi7chael, 23/03/2010, 13:07.


#5 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 23/03/2010, 13:53

Amigo, tente isso:

<?php
list($width, $height, $type, $attr) = getimagesize("img/flag.jpg");
echo "<img src=\"img/flag.jpg\" $attr alt=\"getimagesize() example\" />";
?>

Com a variável type teste o tipo de imagem!
Qualquer coisa olhe no www.php.net/getimagesize

Acho que vai funcionar melhor que apenas testar a terminação do arquivo!
=D

Depois volte com os resultados para nós!
Abraços e até a próxima.

Mateus Antunes
Mateus Antunes
MBASistemas

#6 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 23/03/2010, 14:05

Só uma pergunta, aproveitando o tópico do amigo:

MBA, essa variavel, perceberia um trojan Disfarçado dentro de uma imagem também?
Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#7 mi7chael

mi7chael

    12 Horas

  • Usuários
  • 266 posts
  • Sexo:Masculino

Posted 23/03/2010, 14:15

@MBA

Mas eu não testo só a terminação do arquivo. Tipo, simplificando, minha função é assim:

function enviaFoto($imagem,$dimensoes_l,$dimensoes_a,$tamanho,$destino) {
   
    $tamanho = $tamanho * 1024;

    if(eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", $imagem["type"])) {

    //a imagem tem q ter mais de 0 bytes e menos que o limite q veio na variável
    if(($imagem["size"] > 0) AND ($imagem["size"] < $tamanho)) {
		
    //verifica as dimensões
    $tamanhos = getimagesize($imagem["tmp_name"]);
    $largura = $tamanhos[0];
    $altura = $tamanhos[1];
			
    if(($largura > $dimensoes_l) OR ($altura > $dimensoes_a)) {
    $alerta = "A imagem não está no tamanho correto. Ela possui ".$largura." x ".$altura." pixels. O máximo é de ".$dimensoes_l." x ".$dimensoes_a." pixels.<br>Escolha outra imagem e tente novamente."; 
	} else {
    //faz o upload e envia a foto
	
    $nome = $imagem["name"];
    $envia = move_uploaded_file($imagem["tmp_name"], $destino."/".$nome);
    if($envia == 1) {
    $alerta = "1"; //Enviou a imagem pro destino

    } else {
    $alerta = "Aconteceu algum erro ao tentar enviar a imagem";
    }
				
       }
			
    	  } else {
		$tam_max = $tamanho / 1024;
		$tam_atual = ceil($imagem["size"] / 1024);
		$alerta = "Arquivo muito pesado. O máximo permitido é ".$tam_max." kbytes. Sua imagem possui ".$tam_atual." kbytes. <br>Escolha outra imagem e tente novamente."; 
		};
	
	} else {
		$alerta = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Seu arquivo é ".$imagem["type"]." <br>Escolha outra imagem e tente novamente."; 
	};
	return $alerta;
}

A única coisa que vi que acho q poderia dar um jeito nisso é colocar um valor mínimo pra largura e altura da imagem.
Mas mesmo assim, tô achando tudo muito "frágil"

Edição feita por: mi7chael, 23/03/2010, 14:16.


#8 hostdesigner

hostdesigner

    Super Veterano

  • Usuários
  • 2910 posts
  • Sexo:Masculino
  • Localidade:Quirinópolis-GO
  • Interesses:Programação, Mulheres, Diversão, Mulheres, Música, Mulheres, Meu Carro, Mais mulheres, Internet, Outras Mulheres, Quase por último PAZ e por ultimo Outras Váááárias Mulheres...

Posted 25/03/2010, 00:02

@ MI7CHAEL
Por isso sempre recomendo realizar verificação do tipo de arquivo e não da extensão.
http://br.php.net/ma...ontent-type.php

Falopa!

#9 mi7chael

mi7chael

    12 Horas

  • Usuários
  • 266 posts
  • Sexo:Masculino

Posted 25/03/2010, 16:12

Estou tentando utilizar, mas só dá erro.
Tô pondo assim:

echo mime_content_type('imagemteste.jpg');

E aí dá:

Fatal error: Call to undefined function mime_content_type() in D:\AppServ\www\teste2.php on line 35

Edição feita por: mi7chael, 25/03/2010, 16:14.


#10 hostdesigner

hostdesigner

    Super Veterano

  • Usuários
  • 2910 posts
  • Sexo:Masculino
  • Localidade:Quirinópolis-GO
  • Interesses:Programação, Mulheres, Diversão, Mulheres, Música, Mulheres, Meu Carro, Mais mulheres, Internet, Outras Mulheres, Quase por último PAZ e por ultimo Outras Váááárias Mulheres...

Posted 25/03/2010, 18:16

@ MI7CHAEL
Aparentemente suas configurações de server não estão habilitadas

Veja como habilitar http://br.php.net/ma...nstallation.php

Vi que esta função já está depreciada (tadinha), atualmente existe outra biblioteca melhor e mais elaborada http://br.php.net/ma...ok.fileinfo.php

Falopa!

#11 mi7chael

mi7chael

    12 Horas

  • Usuários
  • 266 posts
  • Sexo:Masculino

Posted 25/03/2010, 21:42

Dei uma olhada, e inicialmente pensei em descartar o mime_content_type e estudar o fileinfo, mas estou apanhando pra caramba aqui. Tô tentandoa char um tutorial, ou algo assim, pq tem q instalar algumas coisas, configurar, etc. Se eu não conseguir, posto aqui novamente... :)

É... não deu certo
Tentei fazer algumas coisas seguindo o manual do PHP, mas tem várias coisas q eu não sei como faz.
Na parte da instalação diz:

It is really strange to find that installing filenfo extension on windows is not yet fully explained. Here are the latest most up-to-date steps to make this work:

1. Add php_fileinfo.dll to the list of enabled extensions
extension=php_fileinfo.dll

2. Download GNU file package for windows
get it from here: http://gnuwin32.sour...ile-bin-zip.php

Extract the folder from the archive called shared\file which contains 4 magic files (magic, magic.mgc, magic.mime, magic.mime.mgc).

3. Place these 4 files in a known place

4. Add system enviroment variable MAGIC that points to the file called magic. For example if you placed magic files in folder called magic in c:\php that means that the propper path is c:\php\magic\magic

5. If you use IIS restart it and fileinfo is ready for use

5a. If you use apache you will have to restart operating system for the service to acknowledge MAGIC env. variable.


O número 1 eu já não entendi o q q é pra fazer...
Baixei o conteúdo do link do tópico 2, mas ele não tem os 4 arquivos dentro do endereço especificado, só tem 2.

Alguém me ajuda ??
O PHP instalado no meu pc é o 5.2.3, e o do servidor q eu utilizo, é o 5.2
Link pro manual: http://br.php.net/ma...nstallation.php

Edição feita por: mi7chael, 25/03/2010, 21:43.


#12 mi7chael

mi7chael

    12 Horas

  • Usuários
  • 266 posts
  • Sexo:Masculino

Posted 30/03/2010, 16:19

ninguém ??

#13 hostdesigner

hostdesigner

    Super Veterano

  • Usuários
  • 2910 posts
  • Sexo:Masculino
  • Localidade:Quirinópolis-GO
  • Interesses:Programação, Mulheres, Diversão, Mulheres, Música, Mulheres, Meu Carro, Mais mulheres, Internet, Outras Mulheres, Quase por último PAZ e por ultimo Outras Váááárias Mulheres...

Posted 30/03/2010, 17:47

@ MI7CHAEL
O item 1 é o mais simples, abra teu php.ini e verifique se existe a entrada

#extension=php_fileinfo.dll

se não houver adicione

extension=php_fileinfo.dll


No item 2, você precisa baixar aquela biblioteca e copiar os arquivos existentes na pasta shared\file para substituí-los na pasta do teu PHP

\php\magic\magic


Reinicie o teu computador/servidor para atualizar as informações do servidor php com o SO.

Acho que agora ficou moleza né?

Falopa!




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq