Identificando vulnerabilidades de segurança
em uma aplicação web
Marina S. Coelho1 , Lucas A. Tomasi1 , Thaı́s B. Idalino1 , Jean E. Martina1
1
Universidade Federal de Santa Catarina
Departamento de Informática e Estatı́stica
Campus Universitário – Florianópolis – SC – Brasil
[email protected], [email protected],
[email protected], [email protected]
Abstract. The lack of security in an specific part of an application can make it
entirely vulnerable to attacks. It is assumed that a system is not safe if it allows
an attacker to find ways to access sensitive data that should be kept private.
Based on the severity of the problem that the exposition of these data can bring
about, in this paper it is proposed a detailed analysis of a system in order to
expose the most serious threats found.
Resumo. A falta de segurança em uma parte especı́fica de uma aplicação pode
torná-la inteiramente vulnerável à ataques. Assume-se que um sistema não é
seguro se permite que algum atacante encontre meios de acessar dados sensı́veis
que devem ser mantidos privados. Com base na severidade do problema que a
exposição desses dados pode acarretar, neste trabalho é proposta uma análise
detalhada de um sistema a fim de expor as ameaças mais sérias encontradas.
1. Introdução
Aplicações web estão presentes diariamente na vida das pessoas. Tornou-se comum dispor desse meio para realizar as mais diversas atividades, desde acessar uma rede social
a consultar o extrato da conta bancária. É frequente que estas aplicações utilizem e armazenem dados sensı́veis de seus usuários. Podemos pensar em uma aplicação de home
banking, onde, ao autenticar-se por meio de senha, é possı́vel obter acesso ao número do
cartão, número da agência e até saldo da conta do cliente.
Apesar dos riscos, muitas aplicações contém diversas vulnerabilidades. Dentre
elas, as que aparecem com mais frequência e oferecem mais risco à aplicação são relatadas no Top Ten da OWASP (Open Web Application Security Project). Esse projeto
visa auxiliar as empresas a desenvolverem, operarem e manterem aplicações seguras e
confiáveis. A cada três anos a OWASP divulga o Top Ten, uma lista contendo as dez
fragilidades mais exploradas e de maior impacto nas aplicações [OWASP 2015]. Paralelamente, é lançado um documento chamado Testing Guide, um guia para a realização
de Penetration Tests em sistemas web. O objetivo de executar Pentests é a avaliação da
segurança através da simulação de um ataque malicioso no ambiente da aplicação.
Este trabalho visa realizar Penetration Tests em uma aplicação (mantida anônima
para sua segurança) utilizando o Top Ten e o Testing Guide da OWASP como referências.
2. Conceitos básicos e trabalhos correlatos
Diversos trabalhos abordam os testes de uma forma geral, explicando algumas técnicas
para exploração de falhas ([de Souza 2012],[da Silva and Pereira 2013]). Porém, foi
difı́cil achar estudos que ensinem e exemplifiquem como pôr em prática todo o conteúdo.
Por este motivo, nenhum trabalho contribuiu de forma significativa no auxı́lio à aplicação
dos testes de penetração. Este artigo se preocupa não somente com a parte teórica, mas
também com a prática dos conceitos tratados, tendo como finalidade elaborar um guia
para auxiliar na aplicação dos testes aqui expostos. Porém, devido ao curto espaço do artigo, não será possı́vel demonstrar a execução de todos os testes. Serão expostos somente
os que reportaram os erros mais graves, são eles: Broken Authentication and Session
Management e Cross Site Scripting.
3. Proposta
Para melhor entender os riscos de ter um sistema frágil e a importância dos testes que
serão descritos a seguir, é necessário saber que basta uma única vulnerabilidade para
acabar com a segurança de toda a infraestrutura de uma aplicação [Maggi et al. 2009].
Este trabalho tem como finalidade ampliar a abrangência e o detalhamento dos testes expostos, de modo que seja possı́vel tomá-lo como base para testar qualquer aplicação
web. É necessário saber que existem várias maneiras de tentar invadir uma aplicação. A
técnica utilizada aqui é chamada de Black Box. É a técnica utilizada quando não temos
informação alguma de código ou estrutura da aplicação que pretendemos invadir. Antes de
tudo, foi feita uma varredura automática com a ferramenta Zed Attack Proxy [ZAP 2015].
A partir de agora serão apresentadas as principais falhas encontradas, divididas de acordo
com a vulnerabilidade na qual se encaixam segundo o Top Ten.
3.1. Broken Authentication and Session Management
O objetivo deste teste é tentar burlar a etapa de autenticação. Na aplicação em questão,
ao criar novos usuários e realizar testes manuais simples através da interface, as seguintes
fragilidades foram encontradas.
Senhas fracas. Foi possı́vel cadastrar uma conta com senha em branco. É necessário solicitar ao cliente que crie uma senha forte, mudando a polı́tica de senhas do
site para incluir, por exemplo, um sı́mbolo ou um número e ter um tamanho mı́nimo.
Enumeração de usuário.
Na página de autenticação, ao informar um
usuário válido com senha incorreta, é apresentada a mensagem de erro “A
senha digitada está incorreta.”e a URL exibida após o redirecionamento é
“/portal-autenticacao-web/login.jsp?erroauthc=erro.autenticacao.senha.incorreta”.
Porém, ao informar um usuário inexistente, a mensagem apresentada é
“A conta informada não existe.”e a URL exibida é “/portal-autenticacaoweb/login.jsp?erroauthc=erro.autenticacao.usuario.inexistente”. Isto significa que
qualquer pessoa pode enumerar os usuários existentes dentro do sistema. O correto, em
qualquer sistema, é retornar sempre o mesmo tipo de erro, devendo este ser genérico,
impossibilitando que um atacante consiga listar os clientes. É também necessário que
as URLs referentes aos erros de autenticação também sejam genéricas e não forneçam
pistas.
Bloqueio para tentativas de login. Não há mecanismo para bloquear a conta após
sucessivas tentativas de login com senha incorreta, o que permite que um atacante erre a
senha infinitas vezes ao tentar entrar no sistema. A maneira mais recomendável de implementar a autenticação é bloquear o número de tentativas de acesso e, a partir de então,
barrar a entrada com um CAPTCHA. Um CAPTCHA é um teste que pode ser facilmente
resolvido por seres humanos, mas que está além da capacidade de solução da maioria
das máquinas que conhecemos hoje. Segundo Yan e Ahmad [Yan and Ahmad 2008], esta
tecnologia já é quase o mecanismo de segurança padrão para evitar ataques indesejáveis,
como bot, sendo assim um mecanismo de defesa extremamente importante.
Força bruta. Sabendo que a aplicação possui estas três vulnerabilidades, é
possı́vel aplicar um ataque chamado Brute Force. Consiste em uma verificação automatizada de todas as possı́veis senhas de um usuário, inserindo-as no sistema até encontrar
a correta. Nesse caso um atacante dispõe de todos os requisitos para este tipo de invasão:
senhas fracas, que podem ser descobertas rapidamente por um programa; um usuário
válido, que pode ser obtido através da enumeração; e em momento algum a execução vai
parar, pois não há um bloqueio que evite o teste repetido das senhas. A máquina que está
executando brute force só será interrompida quando encontrar a senha correta.
Atributos de cookie. Resumidamente, cookies são gerados pelo servidor e enviados ao cliente quando um usuário acessa uma aplicação e esta precisa se certificar da
identidade do usuário para várias requisições posteriores. Dessa maneira, o cliente vai
continuar enviando o cookie de volta ao servidor em várias conexões. Este teste busca
verificar se a aplicação assina corretamente o cookie e os atributos do mesmo. Ao acessar
a página inicial da aplicação em questão, é definido um valor de cookie que é utilizado
para controlar a sessão do usuário. Foi possı́vel concluir, através da resposta do servidor,
que alguns dos atributos estão configurados de maneira errada:
HttpOnly. Evita que o cookie seja acessado por um script do lado cliente. A flag
não estava presente na aplicação, o que significa que, caso um atacante consiga rodar um
JavaScript, este pode obter acesso ao valor do cookie e sequestrar a sessão da vı́tima.
Domain. Especifica domı́nios e subdomı́nios do sistema. A flag não estava presente. É importante ressaltar que, no caso de este atributo não estar presente, o hostname
do servidor que gerou o cookie será usado como domı́nio padrão. Assim, o cookie poderia
ser enviado para qualquer subdomı́nio criado, como “hacker.dominio.com.
Path. Completa o domain, fornecendo o diretório especı́fico para qual o cookie
é válido. A flag estava presente com o valor “/home”, omitindo uma “/”ao final. Isto
permite que o navegador envie o cookie para qualquer caminho cujo prefixo seja “/home”,
por exemplo: “/home-atacante”, que seria uma página semelhante a original, enganando o
usuário para que este entre com dados pessoais, e estes sejam interceptados pelo atacante.
3.2. Cross Site Scripting
Os resultados encontrados nesta fase revelam uma situação alarmante na aplicação. O
teste exposto a seguir foi aplicado conforme o escopo fornecido pelo Testing Guide.
Testing for Cross Site Scripting Stored. Este teste consiste em encontrar vetores
de entrada (inputs) no sistema e inserir dados maliciosos que serão armazenados no banco.
Na sequência, é preciso acessar as páginas que apresentam esse valores recuperados do
banco e avaliar se foi aplicado algum filtro para o valor que persistimos. A forma correta
de implementar é utilizar filtros tanto na hora de persistir os dados, quanto na de recuperálos.
Para testar, foi inserido um JavaScript que executa um alert ao cadastrar um
usuário no banco. Quando a página inicial foi acessada o nome do cliente estava sendo
filtrado corretamente, aparecendo em um formato string. Porém ainda não é possı́vel saber se o filtro foi aplicado na hora de salvar os dados no banco ou ao recuperá-los. Para
descobrir, bastou acessar a página que lista os dados do usuário.
Figura 1. JavaScript salvo sem filtro no banco.
Como é possı́vel perceber na Figura 1, ao acessar a página com os dados o script
foi executado, o que significa que não há filtro na hora de persistir e o script está sendo
salvo no banco de dados. O alerta não foi disparado na página inicial porque o filtro
estava sendo aplicado somente na hora de recuperar a informação. Isto pode gerar muitos
problemas, como por exemplo se esse banco for compartilhado e outras aplicações fizerem
uso dele, estes outros sistemas podem não ter filtro na hora de mostrar os dados do usuário.
O ataque simulado nos testes executa um alerta, mas este é apenas um dos muitos
comandos que podem ser persistidos nos vetores de entrada. Ao invés de um alert, o
atacante poderia roubar a sessão do usuário ou redirecioná-lo para um site de phising.
4. Considerações finais
Este trabalho teve como propósito instruir sobre a importância de implementar um sistema da maneira mais segura possı́vel, com base nos possı́veis erros que podem decorrer
das vulnerabilidades existentes. Teve também a finalidade de servir como guia detalhado
para a execução de dois dos testes apresentados pelo Testing Guide da OWASP. Devido
ao espaço limitado não foi possı́vel incluir todos os dez testes do Top Ten. Foram selecionados os considerados mais severos e predominantes segundo a OWASP.
É muito importante ter em mente que, embora os testes sejam executados de maneira individual e dessa forma sejam padronizados no Testing Guide da OWASP, eles não
são realmente isolados, pois uma vulnerabilidade pode tornar a outra muito mais perigosa
dependendo da forma como foi implementada, o que torna ainda mais importante garantir
que não hajam erros na aplicação.
Referências
da Silva, R. F. and Pereira, J. C. (2013). Identificando vulnerabilidades de segurança
computacional.
de Souza, L. L. (2012). Desenvolvimento seguro de aplicações web seguindo a metodologia owasp.
Maggi, F., Robertson, W., Kruegel, C., and Vigna, G. (2009). Protecting a moving target:
Addressing web application concept drift. Lecture Notes in Computer Science, 5758.
OWASP (2015). Open web application security project. https://www.owasp.org.
Yan, J. and Ahmad, A. S. E. (2008). Usability of captchas or usability issues in captcha
design. Symposium On Usable Privacy and Security.
ZAP (2015). Zed attack proxy project. https://www.owasp.org/index.php/OWASP Zed
Attack Proxy Project.
Download

Identificando vulnerabilidades de segurança em uma aplicação web