Skip to content

Instantly share code, notes, and snippets.

@steppat
Last active February 23, 2018 12:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steppat/8df6020a0a08f498a6880dfb2594b1d3 to your computer and use it in GitHub Desktop.
Save steppat/8df6020a0a08f498a6880dfb2594b1d3 to your computer and use it in GitHub Desktop.

Exercícios: Segurança

Nesse exercício vamos analisar um projeto com algumas falhas de segurança.

  1. Acesse o diretório Desktop/cursos/91/fj-91-exercicios e extraia o conteúdo do arquivo seguranca.zip em seu Desktop.

  2. Importe o projeto seguranca no seu Eclipse.

  3. Esse projeto utiliza o Spring Boot. Para executá-lo, basta rodar a classe Boot.java escolhendo a opção: Run As -> Java Application. O Hibernate se encarregará de criar o banco de dados e as tabelas utilizadas pela aplicação.

  4. Acesse a aplicação em um browser no endereço: http://localhost:8080/

  5. O projeto possui login e controle de autenticação, e para efetuar login precisaremos de um usuário cadastrado no banco de dados. Abra o arquivo README.md, localizado no diretório raiz do projeto, e siga as instruções descritas nele.

  6. Explore as funcionalidades da aplicação pelo browser e também seu código fonte no Eclipse, para entender melhor o projeto.

A aplicação está vulnerável à ataques de Cross-Site Scripting(XSS). Para simular o ataque, siga os seguintes passos:

  • Cadastre um novo processo preenchendo o campo autor com o seguinte trecho de código JavaScript:

     <script>alert('XSS')</script>
    
  • Acesse a tela de lista de processos e repare que o browser exibirá uma pop-up com a mensagem XSS, confirmando assim a vulnerabilidade da aplicação.

A vulnerabilidade acontece porque na página de listagem de processos, responsável por exibir as informações cadastradas pelos usuários, não há um tratamento adequado das informações sendo exibidas. Para corrigir essa vulnerabilidade siga os seguintes passos:

  • Abra o arquivo processos.jsp e encontre o seguinte trecho de código:
<td>
	${processo.autor}
</td>
  • Altere o código para utilizar a tag <c:out>, que automaticamente faz o escape da informação a ser exibida:
<td>
	<c:out value="${processo.autor}"/>
</td>

Nossa aplicação também está vulnerável ao ataque Cross-Site Request Forgery(CSRF). Para simular, siga os seguintes passos:

  • Cadastre um novo processo na aplicação e na tela de listagem anote o id dele.

  • No arquivo zip desse exercício(seguranca.zip) além do diretório do projeto há também uma página HTML chamada csrf.html. Abra o código fonte dela em algum editor de texto.

  • Procure no código fonte a tag <form> e altere no atributo action dela o id do processo para o id do processo que você cadastrou na aplicação.

  • Abra essa página HTML no mesmo browser utilizado pela aplicação.

  • A página exibirá uma imagem e alguns segundos depois um código JavaScript será executado. Esse código dispara uma requisição para a aplicação, executando a ação de rejeitar o processo, que deverá ser realizada normalmente.

  • Isso confirma a vulnerabilidade da aplicação. Um hacker poderia hospedar essa página em algum servidor e tentar induzir um usuário que esteja logado na aplicação à visitá-la. Ao acessar a página, o usuário mal perceberia que ela disparou uma requisição para a aplicação ao qual ele tem cadastro e está logado no momento. Esse é o funcionamento do ataque CSRF.

A vulnerabilidade acontece porque a aplicação não valida se as requisições que estão chegando foram de fato disparadas de dentro da própria aplicação, ou seja, de suas funcionalidades internas. Para corrigir essa vulnerabilidade siga os seguintes passos:

  • O Spring Security, utilizado pela aplicação, já possui um mecanismo de defesa contra ataques CSRF, porém tal recurso está desabilitado na aplicação.

  • Abra a classe SpringSecurityConfig e procure pela seguinte linha de código:

http.csrf().disable()
  • Altere o código para:
http.csrf().and()
  • Ao habilitar o mecanismo de proteção contra CSRF, o Spring validará todas as requisições que alteram o estado no servidor(POST, PUT, DELETE, etc.) para garantir que elas foram disparadas de dentro da própria aplicação. Essa validação é feita com o uso de tokens de segurança, que deverão ser adicionados nos formulários da aplicação.

  • Abra o arquivo login.jsp e procure pela tag <form>:

<form method="post" action="<c:url value='/login' />">
  • Adicione dentro da tag form o seguinte input, que será responsável por incluir o token de segurança no formulário:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
  • Faça a mesma coisa com os formulários existentes nos arquivos processo-form.jsp e processos.jsp.

  • Teste as funcionalidades da aplicação, para garantir que tudo continua funcionando.

  • Repita o teste de ataque via CSRF. Dessa vez uma página de erro deve ser apresentada, informando sobre a ausência do token de segurança.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment