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
Re:Duvida ajuda pff Posted by mAiN_iNfEcTiOn - 2007/07/01 22:04 _____________________________________
Leia mais