Testar a fronteira de propriedade das faturas

CibersegurançaBeginner
Pratique Agora

Introdução

A fatura de uma loja registra as compras do cliente, o preço e seu endereço de cobrança. Clientes devem ler suas próprias faturas ou aquelas explicitamente compartilhadas com eles. Conhecer um ID não concede permissão para lê-lo.

Você tem autorização para testar o Invoice Desk sintético como Alex. Comece pelo acesso normal, compare uma fatura compartilhada com uma privada e salve a resposta privada para demonstrar a falha na fronteira de propriedade. O laboratório termina na validação; você não corrigirá o servidor. Apenas os objetos de treinamento fornecidos estão no escopo.

Estabelecer seu acesso normal

Nesta etapa, entre como Alex e obtenha sua própria fatura antes de testar outra conta.

Selecione a aba Invoice Desk na interface do laboratório para começar esta etapa.

Mude para a aba Invoice Desk. O diagrama mostra um cliente, que envia requisições, e um servidor de API, que responde. API é a interface de requisições da aplicação. API: ready vem de uma consulta real de saúde. A tabela descreve as regras esperadas:

ID da fatura Proprietário Compartilhada com Alex pode ler?
inv-104 alex Ninguém Sim: proprietário
inv-208 morgan Ninguém Não: privada
inv-315 riley alex Sim: compartilhamento explícito

No portal, informe usuário alex e senha shop-alex-42, depois selecione Sign in. Espere Signed in as alex. Digite inv-104 em Invoice ID e selecione View invoice. O campo owner deve ser alex.

Invoice Desk mostrando Alex conectado e visualizando sua própria fatura

Mude para a aba Client Terminal. É um espaço de cliente isolado em /home/student/project, não o servidor. invoice-api:8000 identifica o servidor na rede de treinamento, não um alvo público. curl envia requisições HTTP pelo terminal. HTTP é o protocolo de requisição/resposta usado aqui; GET solicita a leitura de um recurso. O caminho depois do endereço identifica esse recurso. -i inclui o status e os cabeçalhos da resposta.

Sem uma sessão, espere 401 Unauthorized, que exige login:

Mude para a aba Client Terminal antes de executar o comando a seguir.

curl -i http://invoice-api:8000/api/invoices/inv-104

Entrar no navegador não autentica o curl. Uma sessão é um registro no servidor de quem entrou; um cookie aleatório relaciona as próximas requisições a esse registro. O comando seguinte envia um objeto JSON, um formato de campos nomeados. -H define um cabeçalho que indica JSON, -d envia as credenciais e seleciona POST, e -c salva o cookie recebido em session.txt. Aspas simples mantêm espaços e aspas duplas juntos como um único argumento do shell.

curl -sS -c session.txt -H 'Content-Type: application/json' -d '{"username":"alex","password":"shop-alex-42"}' http://invoice-api:8000/api/login

-sS oculta o progresso, mas mostra erros de conexão. account deve ser alex. -b envia o cookie salvo. Confira a identidade da sessão:

curl -sS -b session.txt http://invoice-api:8000/api/me

Solicite sua fatura:

curl -sS -b session.txt http://invoice-api:8000/api/invoices/inv-104

Leia invoice_id, owner, item e total_usd: Alex comprou Desk lamp por 38.00. A lista vazia shared_with, [], significa que ninguém mais recebeu acesso. Esse é o comportamento normal. A verificação usa a resposta real do servidor a Alex, solicitada pelo terminal ou pelo portal.

Se receber 401 após o login, repita o comando de login neste terminal e tente novamente com -b session.txt. Um erro de conexão é diferente: nenhuma resposta HTTP chegou; confira o endereço e API: ready.

Solicitar outra fatura

Nesta etapa, compare compartilhamento explícito com uma fatura privada mantendo a mesma identidade autenticada.

Selecione a aba Client Terminal na interface do laboratório para começar esta etapa.

Autenticação responde “Quem é você?”. Autorização responde “Esta pessoa pode ler esta fatura?”. Um login bem-sucedido estabelece apenas a primeira resposta. Primeiro baixe a fatura legitimamente compartilhada. Um download continua sendo GET; /download seleciona uma resposta destinada a ser salva, com os mesmos campos JSON.

Mude para a aba Client Terminal antes de executar o comando a seguir.

curl -sS -b session.txt http://invoice-api:8000/api/invoices/inv-315/download

O proprietário é riley, mas shared_with contém alex. Esse acesso é permitido. Um proprietário diferente, sozinho, não demonstra falha.

Preveja o caso privado: inv-208 pertence a Morgan e não é compartilhada com ninguém, portanto Alex deveria receber uma negação, normalmente 403 Forbidden. Um serviço também pode usar 404 Not Found para ocultar a existência de um objeto privado. Aqui 404 também identifica um ID desconhecido. 200 OK significa que a requisição teve sucesso; o corpo mostra o que foi exposto.

-v exibe a requisição realmente enviada e os cabeçalhos recebidos. Também mostra o cookie da sessão de treinamento; não compartilhe essa saída fora do laboratório. Execute:

curl -v -b session.txt http://invoice-api:8000/api/invoices/inv-208

Localize GET /api/invoices/inv-208 e HTTP/1.0 200 OK. O corpo mostra proprietário morgan, lista de compartilhamento vazia, Studio microphone e endereço 82 Cedar Lane. O servidor entregou um objeto privado a Alex. Você mudou o caminho do objeto, não a identidade da sessão. IDs previsíveis facilitaram o teste; a ausência da verificação de permissões causou a exposição.

Mude para a aba Invoice Desk para repetir as duas requisições: Download invoice para inv-315 e View invoice para inv-208. O cliente web salva downloads no mesmo espaço de trabalho. A verificação exige o download compartilhado permitido e a visualização privada, não um arquivo explicativo.

Invoice Desk mostrando que Alex consegue visualizar a fatura privada de Morgan

Verificar a exposição

Nesta etapa, preserve o download privado real e relacione os dados expostos ao impacto no negócio.

Selecione a aba Client Terminal na interface do laboratório para começar esta etapa.

Use /download para a fatura privada. -o grava os bytes da resposta em um arquivo em vez de mostrá-los. Salve a resposta completa como private-invoice.json no espaço atual do cliente:

Mude para a aba Client Terminal antes de executar o comando a seguir.

curl -sS -b session.txt -o private-invoice.json http://invoice-api:8000/api/invoices/inv-208/download

cat exibe um arquivo para leitura:

cat private-invoice.json

Espere a mesma fatura de Morgan, com invoice_id inv-208, proprietário morgan, total 129.00 e endereço de cobrança. Se salvou um erro 401 ou a fatura compartilhada, faça login novamente se necessário e baixe a privada designada; -o substitui o arquivo.

Como alternativa, mude para a aba Invoice Desk. Conectado como Alex, informe inv-208 e selecione Download invoice. Esse cliente web encaminha a requisição real da API e salva a resposta inalterada em /home/student/project/private-invoice.json, que você pode ler após voltar à aba Client Terminal. Os dois métodos satisfazem o mesmo resultado.

Execute a verificação. Ela compara os bytes salvos com a fatura designada e confirma o registro do download no servidor sob a sessão de Alex. Uma afirmação copiada, fatura inventada, fatura compartilhada permitida ou arquivo sem download de cliente correspondente não demonstram o resultado.

O impacto prático é a divulgação de compras e endereço de outro cliente. O servidor deve verificar a propriedade ou o compartilhamento explícito para cada objeto solicitado, inclusive downloads. Ocultar links ou tornar IDs difíceis de adivinhar não substitui essa verificação. É o problema de autorização de objetos descrito pelo OWASP BOLA. Seu teste autorizado terminou; a correção do servidor fica para uma tarefa separada.

Resumo

Você estabeleceu uma sessão de cliente, leu sua fatura, distinguiu compartilhamento explícito de acesso privado e salvou uma resposta real entre contas. Verificou os dados expostos e a identidade que os recebeu, sem acesso ao servidor ou credenciais da vítima.