Possíveis Ataques Adulteração de Site Código vulnerável RESUMO - Capitulo 36 - PHP - Criptografia e Segurança $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"); <h1>visitantes deste site:</h1> <ol> $fp = fopen("database", "r"); @print(fread($fp, filesize("database"))); </ol> <hr/> <form> <input type="text" name="visitor" /> <input type="submit" name="submit" value="assinar livro!" /> </form> 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
Lendo arquivos arbitrários Código vulnerável $poem = @$_GET['poem']; $fp = fopen($poem, "r"); print (fread($fp, filesize($poem))); <hr/> <form> Escolha um poema: <select name="poem"> <option value="jabb.html">jabberwocky</option> <option value="graves.html">cat- Goddesses</option> </select> <input type="submit" value="mostrar poema" /> </form> Solução apropriada (Negar tudo e liberar o aceitável) 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))); 2 de 5
Esta não é uma boa solução (Presumir as entradas não é uma boa prática) if(!strstr($poem, "/") &&!strstr($poem, "\\")) { $fp = fopen($poem, "r"); print (fread($fp, filesize($poem))); 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). Criptografia 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 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 Descrição Vetor de Inicialização (IV) ECB (electronic code book) 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 Não CBC (cipher block chaining) criptografia. Esse modo mais forte é de longe o mais adequado para a utilização com dados 3 de 5 Opt
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> //$my_iv = base64_encode(mcrypt_create_iv($cipher_size, MCRYPT_RAND)); </pre> 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"; Cookies criptografados Solução inadequada $visits = @$_COOKIE['visits'] + 1; setcookie('visits', $visits); <h1>você esteve aqui echo $visits vezes!</h1> 4 de 5
Solução adequada 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)); <h1>você esteve aqui echo $visits vezes!</h1> 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. $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