tdc 2012 - php
Post on 04-Jul-2015
19.713 Views
Preview:
DESCRIPTION
TRANSCRIPT
“Segurança em Sistemas PHP”
Erick Tedeschi
@ericktedeschi
São Paulo 7 de Julho de 2012
Tópicos
• Get the facts!!!
• Login
– Armazenamento de Senhas
– User Enumeration
– Brute Force
– HTTPS
• Hardening PHP
• Security Tools
Utilizar os conhecimentos aqui passados somente para fins academicos.
Password Leaks
• http://www.lastfm.com.br/passwordsecurity• http://www.cbc.ca/news/technology/story/2012/06/08/tech-lastfm-passwords-
leak.html
Password Leaks
• http://blog.linkedin.com/2012/06/06/linkedin-member-passwords-compromised/• http://techcrunch.com/2012/06/06/6-5-million-linkedin-passwords-reportedly-leaked-
linkedin-is-looking-into-it/
Afinal como as senhas são
armazenadas?
Clear Text – Top Passwords
Seq | Senha | Qtd |
1 | 123456 | 8746 |
2 | 1234 | 2262 |
3 | 102030 | 1782 |
4 | 12345 | 1020 |
5 | 010203 | 750 |
6 | gabriel | 697 |
7 | felipe | 596 |
8 | sucesso | 582 |
9 | 101010 | 571 |
10 | mariana | 561 |
11 | flamengo | 559 |
12 | 123mudar | 529 |
13 | estrela | 521 |
14 | 131313 | 494 |
15 | carolina | 486 |
16 | camila | 466 |
17 | brasil | 460 |
18 | rafael | 447 |
19 | Tricolor | 446 |
20 | rodrigo | 435 |
21 | fernanda | 433 |
22 | felicidade | 430 |
23 | beatriz | 425 |
24 | 121212 | 424 |
25 | gabriela | 421 |
Seq | Senha | Qtd |
26 | juliana | 420 |
27 | LILICA | 418 |
28 | vitoria | 415 |
29 | matheus | 412 |
30 | junior | 407 |
31 | 654321 | 402 |
32 | 123 | 399 |
33 | renata | 391 |
34 | metallica | 390 |
35 | DANIEL | 389 |
36 | marcelo | 385 |
37 | 123456789 | 379 |
38 | amanda | 376 |
39 | eduardo | 356 |
40 | marina | 355 |
41 | 12345678 | 350 |
42 | leonardo | 347 |
43 | gustavo | 345 |
44 | leticia | 340 |
45 | senha | 320 |
46 | palmeiras | 313 |
47 | giovanna | 309 |
48 | madonna | 303 |
49 | santos | 299 |
50 | larissa | 299 |
Clear Text -> Nunca
Seq | Senha | Qtd |
1 | 123456 | 8746 |
2 | 1234 | 2262 |
3 | 102030 | 1782 |
4 | 12345 | 1020 |
5 | 010203 | 750 |
6 | gabriel | 697 |
7 | felipe | 596 |
8 | sucesso | 582 |
9 | 101010 | 571 |
10 | mariana | 561 |
11 | flamengo | 559 |
12 | 123mudar | 529 |
13 | estrela | 521 |
14 | 131313 | 494 |
15 | carolina | 486 |
16 | camila | 466 |
17 | brasil | 460 |
18 | rafael | 447 |
19 | Tricolor | 446 |
20 | rodrigo | 435 |
21 | fernanda | 433 |
22 | felicidade | 430 |
23 | beatriz | 425 |
24 | 121212 | 424 |
25 | gabriela | 421 |
Seq | Senha | Qtd |
26 | juliana | 420 |
27 | LILICA | 418 |
28 | vitoria | 415 |
29 | matheus | 412 |
30 | junior | 407 |
31 | 654321 | 402 |
32 | 123 | 399 |
33 | renata | 391 |
34 | metallica | 390 |
35 | DANIEL | 389 |
36 | marcelo | 385 |
37 | 123456789 | 379 |
38 | amanda | 376 |
39 | eduardo | 356 |
40 | marina | 355 |
41 | 12345678 | 350 |
42 | leonardo | 347 |
43 | gustavo | 345 |
44 | leticia | 340 |
45 | senha | 320 |
46 | palmeiras | 313 |
47 | giovanna | 309 |
48 | madonna | 303 |
49 | santos | 299 |
50 | larissa | 299 |
Afinal como as senhas são
armazenadas?
Já Sei!!! Utilizando um algoritmo de hash(md5/sha1/etc). Dessa forma a senha é criptografada e não pode voltar a sua
forma original.
Senhas vazadas em hash
Senhas vazadas em hash:
Como reverter para clear text?
Considerando que pelo menos 85% das senhas tem no máximo 8 caracteres, pode-se gerar todas as combinações de hashes de 8 caracteres por exemplo!
Então nós comparamos o hash ‘vazado’ com a tabela de hashes gerados!
SELECT senha_clear FROM hashes WHERE hash = ‘b6dd81aba52f079571e6659c7271a8c3bb9af1f3’;Can you reverse this hash?!
Rainbow Tables
Fonte: http://ophcrack.sourceforge.net/tables.php
Utilizando ferramenta online
Para reverter os hashes
Vamos quebrarTodos os hashes
Fazendo a coisa certa!Mas
Regra 1 – Utilize um algoritmo de hash moderno
Regra 2 – Criar um ‘salt’ único para cada usuário
Regra 3 – Iterar o hash (64k vezes!)
Como gravar ‘corretamente’ uma senha de acordo com as recomendações do OWASP:
Fonte: https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet
Gravando no Bando de Dados
Obs.: Para fins de entendimento o $globalSalt está no código. Normalmente ele deve ficar em um arquivo de configuração de difícil acesso.
Fazendo Login (comparação)
Ex.: Método authenticate do Zend_Auth_Adapter_Interface
mysql> select benchmark(10000000, md5(rand()));
+----------------------------------+
| benchmark(10000000, md5(rand())) |
+----------------------------------+
| 0 |
+----------------------------------+
1 row in set (18.92 sec)
mysql> select benchmark(10000000, sha1(rand()));
+-----------------------------------+
| benchmark(10000000, sha1(rand())) |
+-----------------------------------+
| 0 |
+-----------------------------------+
1 row in set (22.34 sec)
mysql> select benchmark(10000000, sha2(rand(),512));
+---------------------------------------+
| benchmark(10000000, sha2(rand(),512)) |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (26.85 sec)
Benchmark da geração de hashes
User Enumeration
User Enumeration
https://www.owasp.org/index.php/Testing_for_user_enumeration_%28OWASP-AT-002%29
Independente se o usuário existe ou não na tabela, a mensagem de erro deve ser igual para ambos os casos.
Brute Force (Login)
https://www.owasp.org/index.php/Testing_for_Brute_Force_%28OWASP-AT-004%29
Possibilita o atacante tentar se logar na aplicação exaustivamente utilizando um dicionário de usuários e senhas.
A mensagem de erro fornecida pela aplicação pode ajudar na automatização do ataque. Pois quando a credencial for válida, a mensagem ‘Usuário e/ou senha inválidos’ não irá mais aparecer por exemplo.
Brute Force (Login)
https://www.owasp.org/index.php/Testing_for_Brute_Force_%28OWASP-AT-004%29
Exemplo de Brute Force utilizando o MetasploitModulo: auxiliary/scanner/http/wordpress_login_enum
Controle para Brute Force
https://www.owasp.org/index.php/Testing_for_Brute_Force_%28OWASP-AT-004%29
- Pode-se persistir um status do usuário (ativo / bloqueado) e setar um número máximo de tentativas de login.
- Somente o admin pode ‘desbloquear’o usuário.
Controle para Brute Force
Plugin de WordPress para proteção contra Brute Forcehttp://wordpress.org/extend/plugins/user-security-tools/
HTTPS
Exemplo de configuração de Virtual Host com HTTPSTutorial exemplo: http://onlamp.com/onlamp/2008/03/04/step-by-step-configuring-ssl-under-apache.html
Hardening PHP
Hardening é um processo de mapeamento das ameaças, mitigação dos riscos e execução das atividades corretivas, com foco na infra-estrutura e objetivo principal de torná-la preparada para enfrentar tentativas de ataque.
Fonte: http://pt.wikipedia.org/wiki/Hardening
Hardening PHP
Dicas para deixar o php.ini mais seguro em produção
Evite que outros saibam a versão do PHP que você está utilizando:
expose_php = Off
Hardening PHP
Logar todos os erros em arquivo no servidor e desabilitar a visualização de erros por clientes.
display_errors = Offlog_errors = Onerror_log = /var/log/php/error.log
Hardening PHP
Desabilitar upload de arquivos caso a aplicação não utilize esse recurso. Caso sim limitar o tamnho do arquivo.
file_uploads = Off
# ou se utilizarfile_uploads = Offupload_max_filesize = 1M
Hardening PHP
Desabilitar funções maliciosas
disable_functions=exec,passthru,shell_exec,system,proc_open,popen,show_source
Hardening PHP
Limitar o acesso da aplicação ao file system do servidor:
open_basedir = “/usr/share/php/PEAR:/var/www/”
Exemplo de restrição com open_basedir
Hardening PHP
Guia de teste de segurança para aplicação web:https://www.owasp.org/images/5/56/OWASP_Testing_Guide_v3.pdf
Guia de Desenvolvimento Seguro (em construção):http://code.google.com/p/owasp-development-guide/wiki/Introduction
- Metasploit Frameworkwww.metasploit.com- W3af – Web Application Attack and Audit Frameworkhttp://w3af.sourceforge.net- THC Hydra (brute force de senha)http://www.thc.org/thc-hydra- John The Ripper (brute force de senha)http://www.openwall.com/john- BurpSuite – Proxy de Interceptaçãohttp://portswigger.net/burp/
Ferramentas para Pentest e
Auditoria
Erick Tedeschi
http://oerick.com
E-mail/Gtalk: erick@oerick.com
Twitter: @ericktedeschi
Perguntas?
Obrigado
top related