# Autenticação

**Autenticação** é o processo de verificar a identidade de um usuário, sistema ou aplicação — responder à pergunta: *"Quem é você?"*

```
Usuário → Envia credenciais → Sistema verifica → Acesso concedido/negado
         (senha, token, etc.)        ↓
                              "Sim, é você!"
```

#### Autenticação vs. Autorização

| Conceito         | Pergunta                 | Exemplo                               |
| ---------------- | ------------------------ | ------------------------------------- |
| **Autenticação** | "Quem é você?"           | Login com senha, biometria, 2FA       |
| **Autorização**  | "O que você pode fazer?" | "João pode ler, mas não pode deletar" |

> *"Autenticação identifica. Autorização libera."*

***

### ⚠️ Por que a Autenticação é um alvo crítico?

A autenticação é a **porta de entrada** para qualquer sistema. Se um atacante quebra a autenticação:

* 🔴 Assume **qualquer identidade** (inclusive administrador)
* 🔴 Acessa **dados sensíveis** de todos os usuários
* 🔴 Executa **ações privilegiadas**
* 🔴 **Compromete totalmente** a aplicação

> *"Quebrar a autenticação é encontrar a chave mestra do castelo."*

***

### 📋 Vulnerabilidades de Autenticação (Neste Diretório)

Este diretório documenta as principais falhas relacionadas à autenticação de usuários.

| Vulnerabilidade                           | Descrição Rápida                                                                          |
| ----------------------------------------- | ----------------------------------------------------------------------------------------- |
| **Password Mismanagement**                | Mau gerenciamento de senhas (armazenamento, políticas, recuperação, troca)                |
| **Server-Side Template Injection (SSTI)** | Injeção em templates no servidor (pode levar à execução de código e roubo de credenciais) |

> **Nota:** Outras falhas de autenticação (JWT, Session Fixation, OAuth, etc.) podem estar em arquivos complementares ou subdiretórios.

***

### 🧠 Resumo Rápido

#### 🔐 Password Mismanagement

O que pode dar errado com senhas? **Muita coisa.**

| Problema                   | Exemplo                                               |
| -------------------------- | ----------------------------------------------------- |
| **Armazenamento inseguro** | Senhas em texto puro no banco de dados                |
| **Políticas fracas**       | Senha = "123456", "senha", "admin"                    |
| **Sem salt**               | Mesma senha → mesmo hash (ataque de tabela arco-íris) |
| **Recuperação frágil**     | "Qual seu esporte favorito?" (fácil de adivinhar)     |
| **Troca insegura**         | Link de troca previsível ou sem expiração             |
| **Força bruta**            | Sem limite de tentativas                              |

**Práticas corretas:**

* ✅ Hash + Salt (bcrypt, Argon2, PBKDF2)
* ✅ Políticas de complexidade (mínimo 8-12 caracteres, variedade)
* ✅ Bloqueio temporário após múltiplas tentativas
* ✅ 2FA / MFA (dois fatores de autenticação)

#### 🧩 Server-Side Template Injection (SSTI)

SSTI ocorre quando o servidor insere dados do usuário em **templates** (Jinja2, Twig, Freemarker, etc.) sem sanitização adequada.

```python
# Código vulnerável (Python + Flask + Jinja2)
from flask import Flask, request, render_template_string

app = Flask(__name__)

@app.route('/hello')
def hello():
    nome = request.args.get('nome', 'Visitante')
    template = f"<h1>Olá, {nome}!</h1>"
    return render_template_string(template)  # SSTI!
```

```http
# Requisição normal
GET /hello?nome=João

# Requisição maliciosa (Jinja2)
GET /hello?nome={{config}}                    # Vaza configurações
GET /hello?nome={{config.SECRET_KEY}}        # Vaza chave secreta
GET /hello?nome={{''.__class__.__mro__[1].__subclasses__()}}  # Lista classes

# Pode levar a:
# - Roubo de credenciais
# - Execução remota de código (RCE)
# - Comprometimento total do servidor
```

**Por que SSTI está em Autenticação?**

* SSTI pode vazar **chaves secretas**, tokens, hashes de senha
* Pode permitir **criação de usuários administradores**
* Pode dar acesso ao arquivo de **configuração de autenticação**

***

### 🎯 Exemplo Rápido (Password Mismanagement)

```python
# Cenário: Banco de dados com senhas em texto puro

# Tabela 'usuarios'
# | id | nome  | senha          |
# | 1  | admin | admin123       |
# | 2  | joao  | senha123       |

# Atacante invade o banco (SQL Injection, backup exposto, etc.)
# Agora ele tem todas as senhas em texto puro!

# Com `admin` e `admin123` → acesso total ao sistema
```

***

### 🎯 Exemplo Rápido (SSTI para roubo de credenciais)

```http
# Cenário: Template injection em aplicação Flask

GET /profile?username={{config.items()}}

# Resposta contém:
# [('SECRET_KEY', 's3cr3t-k3y'), ('DATABASE_URL', 'postgresql://user:pass@localhost/db'), ...]

# Atacante agora tem:
# - Chave secreta (para forjar sessões)
# - Credenciais do banco de dados
```

***

### 🛡️ Recomendações Gerais para Autenticação

| Problema               | Solução                                                          |
| ---------------------- | ---------------------------------------------------------------- |
| Senhas fracas          | Políticas de complexidade + blacklist de senhas comuns           |
| Armazenamento inseguro | Hash + Salt (bcrypt, Argon2) — NUNCA texto puro                  |
| Força bruta            | Rate limiting, bloqueio temporário, CAPTCHA                      |
| Recuperação de senha   | Tokens seguros, expiração curta, envio por email/SMS             |
| 2FA/MFA                | Implementar sempre que possível                                  |
| SSTI                   | **Nunca** concatenar strings para templates; usar sistema seguro |
| Logs                   | Não registrar senhas, tokens ou hashes em logs                   |

***

### 🔗 Links Úteis (Introdução)

* [OWASP – Authentication](https://owasp.org/www-project-top-ten/2017/A2_2017-Broken_Authentication)
* [OWASP – Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)
* [SSTI (PortSwigger)](https://portswigger.net/web-security/server-side-template-injection)
* [Have I Been Pwned – API de senhas vazadas](https://haveibeenpwned.com/Passwords)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xmorte.gitbook.io/bibliadopentestbr/tecnicas/web/back-end/autenticacao.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
