CURSO ADONAI – LINGUAGEM PHP – Prof. Alexandre Eugênio

Transcrição

CURSO ADONAI – LINGUAGEM PHP – Prof. Alexandre Eugênio
CURSO ADONAI – LINGUAGEM PHP – Prof. Alexandre Eugênio
RESUMO - Capitulo 36 - PHP - Criptografia e Segurança
Possíveis Ataques
Adulteração de Site
Código vulnerável
<?php
$visitor = @$_GET['visitor'];
// Solução para vulnerabilidade
// $visitor = htmlspecialchars(@$_GET['visitor']);
if(isset($visitor) && !empty($visitor)) {
$fp = fopen("database", "a");
fwrite($fp, "<li>$visitor</li>\n");
fclose($fp);
}
?>
<html>
<head></head>
<body>
<h1>Visitantes deste site:</h1>
<ol>
<?php
$fp = fopen("database", "r");
@print(fread($fp, filesize("database")));
fclose($fp);
?>
</ol>
<hr/>
<form>
<input type="text" name="visitor" />
<input type="submit" name="submit" value="Assinar
livro!" />
</form>
</body>
</html>
Acessando o código fonte
Modo de proteger o acesso ao código fonte PHP:
1. PHP deve ser instalado como módulo no servidor WEB (MAIS SEGURO);
2. Script CGI
o Diretório: cgi-bin
o Primeira linha do script: #! /usr/local/bin/php
o Compilar com “--enalble-discard-path”
3. Colocar o interpretador do PHP no diretório cgi-bin, seguindo informações
contidas no manual do PHP, utilizar diretivas de redirecionamento do servidor
Web, no caso do servidor Web Apache as seguintes configurações são utilizadas:
o Action php-script /cgi-bin/php
o AddType php-script .php
o --enable-force-cgi-redirect
4. Caso o servidor Web não seja o Apache utilize “--disable-force-cgi-redirect”.
1 de 5
CURSO ADONAI – LINGUAGEM PHP – Prof. Alexandre Eugênio
Lendo arquivos arbitrários
Código vulnerável
<?php
$poem = @$_GET['poem'];
?>
<html>
<head></head>
<body>
<?php
if(isset($poem)) {
$fp = fopen($poem, "r");
print (fread($fp, filesize($poem)));
fclose($fp);
}
?>
<hr/>
<form>
Escolha um poema:
<select name="poem">
<option
value="jabb.html">Jabberwocky</option>
<option value="graves.html">CatGoddesses</option>
</select>
<input type="submit" value="Mostrar poema" />
</form>
</body>
</html>
Solução apropriada – (Negar tudo e liberar o aceitável)
<?php
if(isset($poem)) {
switch($poem) {
case "jabb":
$poem_file = "jabb.html"; break;
case "graves":
$poem_file = "graves.html";
break;
}
}
if (issset($poem_file)) {
$fp = fopen($poem_file, "r");
print (fread($fp, filesize($poem_file)));
fclose($fp);
}
?>
2 de 5
CURSO ADONAI – LINGUAGEM PHP – Prof. Alexandre Eugênio
Esta não é uma boa solução – (Presumir as entradas não é uma boa prática)
<?php
if(isset($poem)) {
if(!strstr($poem, "/") && !strstr($poem, "\\")) {
$fp = fopen($poem, "r");
print (fread($fp, filesize($poem)));
fclose($fp);
}
}
?>
O PHP permite explicitamente especificar o conjunto de diretórios nos quais arquivos
podem ser abertos definindo o caminho para o diretório como valor da opção “open_basedir”.
Caso haja arquivo sigiloso no diretório, tais com /etc/passwd, o livro sugere o
armazenamento das senhas com a encriptação unidirecional (hash) utilizando a função
crypt(senha, salt).
Executando programas arbitrários
Utilizar as funções abaixo pode aumentar a vulnerabilidade:
system(), exec(), popen(), passthru() e o operador crase(`).
Solução: escapeshellcmd(instrução)
Criptografia
Criptografia de chave única
Na criptografia de chave única, a mesma chave pode criptografar e decriptar uma
mensagem. Em geral ela executa muito mais rapidamente que outros formulários de
criptografia, mas é mais difícil de ser utilizada para comunicação, porque a chave deve
de alguma maneira ser transmitida de um lado para o outro sem quaisquer bisbilhoteiros
sondando. Aqui é onde precisamente a criptografia de chave pública pode auxiliar.
mcrypt_cbc (cipher, key, data, direction, [iv])
Modo
ECB (electronic
code book)
CBC (cipher block
chaining)
Descrição
Traduz apenas o bloco de
dados fornecido. Adequado
para blocos pequenos de
dados que não são tão
previsíveis, como outras
chaves. Não utilize para
texto: A alta freqüência de
letras e de pontuação pode
ser utilizada para quebrar a
criptografia.
Esse modo mais forte é de
longe o mais adequado para
a utilização com dados
3 de 5
Vetor de Inicialização (IV)
Não
Opt
CURSO ADONAI – LINGUAGEM PHP – Prof. Alexandre Eugênio
CFB (cipher
feedback)
OFB (output
feedback)
textuais
Assim como o ECB, o CFB é
bastante adequado para
pequenos blocos de dados.
O OFB é muito semelhante
ao CFB mas projetado para
se comportar melhor
quando encontra erros em
sua entrada.
Sim
Sim
<pre>
<?php
//$my_iv = base64_encode(mcrypt_create_iv($cipher_size, MCRYPT_RAND));
define('BASE64_IV', '3lA/kOKFgyw=');
$key = "marinha";
$cipher_size = mcrypt_get_key_size('des', 'ofb');
$iv = base64_decode(BASE64_IV);
$senha_crypt = mcrypt_ofb(MCRYPT_DES, $key, 'curso adonai',
MCRYPT_ENCRYPT, $iv);
$senha_decrypt = mcrypt_ofb(MCRYPT_DES, $key, $senha_crypt,
MCRYPT_DECRYPT, $iv);
echo "SENHA CRIPTOGRAFADA: $senha_crypt \nSENHA DECRIPTOGRAFA:
$senha_decrypt\n";
?>
</pre>
Cookies criptografados
Solução inadequada
<?php
$visits = @$_COOKIE['visits'] + 1;
setcookie('visits', $visits);
?>
<html>
<head></head>
<body>
<h1>Você esteve aqui <?php echo $visits ?> vezes!</h1>
</body>
</html>
4 de 5
CURSO ADONAI – LINGUAGEM PHP – Prof. Alexandre Eugênio
Solução adequada
<?php
define('BASE64_IV', '3lA/kOKFgyw=');
$iv = base64_decode(BASE64_IV);
$key = base64_decode("NCiUmfiRByg=");
if(isset($_COOKIE['visits'])) {
$encrypted = base64_decode($_COOKIE['visits']);
$visits = mcrypt_cbc(MCRYPT_DES, $key, $encrypted,
MCRYPT_DECRYPT, $iv);
}
else {
$visits = 0;
}
$visits += 1;
$encrypted = mcrypt_cbc(MCRYPT_DES, $key, $visits, MCRYPT_ENCRYPT,
$iv);
setcookie("visits", base64_encode($encrypted));
?>
<html>
<head></head>
<body>
<h1>Você esteve aqui <?php echo $visits ?> vezes!</h1>
</body>
</html>
Hashing
Os algoritmos de hashing são geralmente modificações de algoritmos de criptografia de
chave única que criam um text cifrado com um comprimento específico, a partir do qual
não é possível reconstruir a mensagem original.
<?php
$input = "Curso Adonai - QT-INFO 2011";
$hash = mhash(MHASH_MD5, $input);
echo "Hash: " . bin2hex($hash) . "<br />\n";
// 7c18b0cff692372b94e6ff78a7ad32d4
?>
Arquivos digitalmente assinados
O exemplo do livro demonstra a assinatura digital de um arquivo utilizando hash MD5
em seguida criptografa o valor resultante do hash com a chave de BLOWFISH do usuário
previamente armazenada no servidor.
Utilizadas as seguintes funções:
• mhash
• mcrypt_cbc
5 de 5

Documentos relacionados

Duvida ajuda pff Re:Duvida ajuda pff

Duvida ajuda pff Re:Duvida ajuda pff Re:Duvida ajuda pff Posted by mAiN_iNfEcTiOn - 2007/07/01 22:04 _____________________________________

Leia mais